日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

向普通人加密 用PHP程序保護(hù)數(shù)據(jù)

瀏覽:33日期:2024-02-10 16:58:43

在這個日漸虛擬的互聯(lián)網(wǎng)世界中,您必須小心保護(hù)自已的數(shù)據(jù)。本文將介紹編碼和加密一些重要信息(比如密碼、信用卡號、甚至整個消息)的基礎(chǔ)知識。并通過使用 PHP 的內(nèi)置功能,了解加密和解密信息的意義,并且將了解一些涉及密碼和其他數(shù)據(jù)的實(shí)際示例。 了解當(dāng)今現(xiàn)實(shí)世界與 20 年前的現(xiàn)實(shí)世界的不同。在 20 世紀(jì) 80 年代,加密是一種特工人員的行為 —— 是您在 Tom Clancy 的偵探小說中才可以讀到的情節(jié)。如果某人想保持少量私有信息,那么他必須使用密碼、密碼短語或其他基本方法對數(shù)據(jù)進(jìn)行加密。

而現(xiàn)在,加密遍布各個領(lǐng)域。密碼也被加密保存在數(shù)據(jù)庫中。電腦空間中的加密的通道可能是通過 SSL、SSH 和其他技術(shù)加密的 —— 更不必說擬虛專用網(wǎng)絡(luò)。人們平常可以而且一定能夠使用 Pretty Good Privacy (PGP) 來保護(hù)敏感的文件和電子郵件。

作為一名 PHP 開發(fā)人員,您應(yīng)該知道,強(qiáng)有力的安全做法并不是只將安全保護(hù)用于獨(dú)特的應(yīng)用程序 —— 還可以將其用于您當(dāng)前從事的項(xiàng)目。用戶要樹立從一般加密方法(例如,在登錄頁上的密碼字段中不顯示明文)過渡到各種高級加密方法(如 DES、MD5、SHA1 和 Blowfish)的意識。

因時(shí)間和篇幅所限,這里無法討論加密的各個方面,但是您將從這里了解涵蓋適用于您的多數(shù)情況的基本內(nèi)容。我們通過使用 PHP 內(nèi)置功能先了解加密和解密信息的意義,進(jìn)而了解涉及密碼和其他數(shù)據(jù)的一些實(shí)際示例。在本文中,加密是在更大的安全上下文中進(jìn)行討論的。最后,將介紹其他 PHP 擴(kuò)展和插件。

加密技術(shù)的初級讀本

作為希臘的詞根資產(chǎn),加密技術(shù)是一種 “神秘編寫” 藝術(shù)。凱撒密碼 是最古老的一種密碼,形式也最為簡單。它采用明文消息,將字母移動 n 個位置,從而產(chǎn)生暗文。例如:

明文:Veni Vidi Vici 暗文:Xgpk Xkfk Xkek 通過檢查暗文并借助一些啟發(fā)式的技巧,您可以知道,明文實(shí)際上是移動了兩個字符。凱撒密碼很容易破解。例如:檢查上述信息,可知 X 重復(fù)了多次,且 k 也是如此。這就變成猜迷,確定多少個四字母的詞有那樣多的元音。知道了這些帶元音的詞后,您就知道了移動其余字的方法。它還可以幫助您判斷明文是否為拉丁文,讓您對其有大致的了解。

現(xiàn)代加密技術(shù)的功能非常強(qiáng)大,使用了超越統(tǒng)一移動字母和符號的算法。本文不打算詳細(xì)介紹這些算法,僅介紹一些 PHP 安裝,它包括您需要適度(或特別)保持?jǐn)?shù)據(jù)安全的所有內(nèi)容。

不存在 100% 不受攻擊的絕對完整的加密方法。大概每隔一個月,一些黑客及其朋友就會集合 1,000 臺計(jì)算機(jī),在最初的幾天里強(qiáng)力進(jìn)行計(jì)算破壞,從而使最新的加密方法崩潰。不過,您可以密封您的系統(tǒng)和數(shù)據(jù),不讓黑客干擾和非法闖入。他們將在其他地方尋找可乘之機(jī)。

了解這些內(nèi)容之后,讓我們轉(zhuǎn)而了解那些受簡單登錄形式保護(hù)的示例 PHP 應(yīng)用程序。

沒有安全保障或加密的 PHP 形式處理

假定您是一位新的 Web 應(yīng)用程序開發(fā)人員,沒有更多的機(jī)會使用安全功能。您創(chuàng)建了您的第一個應(yīng)用程序,它可以在專用用戶表中存儲用戶名和密碼,但是,您沒有對這些密碼進(jìn)行加密。這些密碼以一眼就看明白的形式存在,任何人都可以使用它們訪問數(shù)據(jù)庫。您可以構(gòu)建一個如下所示的登錄頁面。

清單 1. 簡單的登錄頁面

<form action='verify.php' method='post'> <p><label for='username'>Username</label> <input type='text' name='username' /> </p><p><label for='password'>Password</label> <input type='text' name='password' /> </p> <p><input type='submit' name='submit' value='log in'/> </p> </form>

此 HTML 標(biāo)記存在什么問題?為密碼字段選擇的輸入類型為 text,這意味著用戶鍵入該字段的任何內(nèi)容都會以明文形式顯示在屏幕上。

您可以方便地將該類型更改為 password,并將該字段中的用戶輸入替換為一串星號。可靠嗎?絕對可靠。不過,這一步驟在很多應(yīng)用程序中會被忽略。事情雖小,但在安全方面會使人們感到不安。您愿意將錢存入休息大廳的窗口被嚴(yán)重毀壞的銀行嗎?也許您會。但是您可能更期望銀行是完好無損的。對于應(yīng)用程序來說,道理相同。

讓我們繼續(xù)介紹處理表單提交的 verify.php 文件。

清單 2. 簡單的 PHP 登錄驗(yàn)證

<?php $user = $_POST['user']; $pw = $_POST['password'];

$sql = 'select user,password from users where user='$user' and password='$pw' limit 1'; $result = mysql_query($sql);

if (mysql_num_rows($result)){ //we have a match! }else{ //no match }

?>

讀閱到此,您會露出滿意的微笑。等待閱讀本文加密部分的部分讀者可能變得不耐煩了,但是加密僅為安全問題的一部分。您還必須聰明地處理引入的用戶數(shù)據(jù)。developerWorks 教程 “鎖定您的 PHP 應(yīng)用程序”(請參閱參考資料)討論了 SQL 注射:將不正常的數(shù)據(jù)發(fā)送到數(shù)據(jù)庫可導(dǎo)致有害或無根據(jù)的訪問。無論您使用多少個加密,公開弱點(diǎn)沒有一點(diǎn)好處。

您應(yīng)遵循下面的傳統(tǒng)安全原則:“不信任用戶提供的數(shù)據(jù)” 和 “深層防御”;清除傳入數(shù)據(jù)并通過轉(zhuǎn)義傳入的字符串保護(hù)數(shù)據(jù)庫(參見清單 3)。深層防御是將多余的安全方法都妥善保管 —— 不僅包括加密,還包括用戶所提供數(shù)據(jù)的智能處理。清單 3. 保護(hù) PHP 形式解析免受用戶數(shù)據(jù)操作的影響

<?php $user = strip_tags(substr($_POST['user'],0,32)); $pw = strip_tags(substr($_POST['password'],0,32));

$sql = 'select user,password from users where user=''. mysql_real_escape_string($user).'' and password=''. mysql_real_escape_string($pw).'' limit 1'; $result = mysql_query($sql);

if (mysql_num_rows($result)){ //we have a match! }else{ //no match } ?>

通過合理使用 strip_tags()、substr() 和 mysql_real_escape_string(),可以刪除任何潛在的有害命令,將字符串減少到 32 個字符,并去掉所有特殊字符,數(shù)據(jù)庫可能將這些字符解釋為非預(yù)期命令字符串的一部分。

在這一過程結(jié)束時(shí),數(shù)據(jù)庫中仍有一個明文密碼。您不能顯示它。最容易的修復(fù)方法是使用 PHP 的內(nèi)置 crypt() 功能。

使用 crypt()

PHP 的內(nèi)置 crypt() 功能可實(shí)現(xiàn)單向加密 或單向散列。它只所以是單向的,是因?yàn)樵趯δ硟?nèi)容進(jìn)行加密后,您永遠(yuǎn)不能將其反轉(zhuǎn)為明文。乍一看,此想法似乎很荒謬。使用加密主要是保護(hù)信息,隨后能夠使用該信息,后者通常意味著能夠?qū)λM(jìn)行解密。

不要絕望。單向加密方案和 crypt() 特別受歡迎。可以使保護(hù)信息的方法更安全。如果您的用戶密碼列表落入不法之徒之手,他們實(shí)際上沒有將密碼解密為明文的方法。

讓我們返回到密碼示例。注釋 (notational) PHP 應(yīng)用程序可能包括讓系統(tǒng)管理員創(chuàng)建、編輯和刪除用戶的模塊。例如,在將用戶記錄存儲到用戶表之前,PHP 腳本可以使用 crypt() 對密碼加密。

清單 4. 使用 crypt() 加密密碼

<?php $user = strip_tags(substr($_POST['user'],0,32)); $pw = strip_tags(substr($_POST['password'],0,32));

$cleanpw = crypt($pw);

$sql = 'insert into users (username,password) values(''.mysql_real_escape_string($user).'', ''.mysql_real_escape_string($cleanpw).'')'; //.....etc.... ?>

crypt() 將一串明文作為它的第一個參數(shù)字,對它應(yīng)用 salt 會影響加密算法的隨機(jī)性,并生成輸入明文的單向暗文。如果不提供 salt,則 PHP 通常默認(rèn)其系統(tǒng) salt,它可以是以下值和長度之一:算法 Salt CRYPT_STD_DES 2 個字符(默認(rèn)) CRYPT_EXT_DES 9 個字符 CRYPT_MD5 12 個字符,以 $1$開頭 CRYPT_BLOWFISH 16 個字符,以 $2$開頭

許多現(xiàn)代 PHP 安裝使用 MD5 或更高的 salt,它們使用強(qiáng)大的 12 個字符的 salt,但是,不要對任何事情想當(dāng)然。您最好知道系統(tǒng)正在使用哪一個值。您可以使用以下 PHP 代碼片段檢查服務(wù)器的設(shè)置:

<?php echo 'System salt size: '. CRYPT_SALT_LENGTH; ?>

返回的答案將是 2、9、12 或 16,它告訴您系統(tǒng)正在使用的值。要使用 MD5 或更高版本的 salt,您可以顯式調(diào)用明文和 salt 參數(shù)中的 crypt() 函數(shù)以及 md5() 函數(shù),以獲取隨機(jī)暗文(參見清單 5)。md5() 函數(shù)可以散列反饋的任何字符串,并將其轉(zhuǎn)變?yōu)楣潭ㄩL度為 32 個字符的字符串。您可能更喜歡其他方法,具體的使用取決于安全需求和個人愛好。

清單 5. 使用 crypt() 和 md5() 加密密碼

<?php $user = strip_tags(substr($_POST['user'],0,32)); $pw = strip_tags(substr($_POST['password'],0,32));

$cleanpw = crypt(md5($pw),md5($user));

$sql = 'insert into users (username,password) values(''.mysql_real_escape_string($user).'', ''.mysql_real_escape_string($cleanpw).'')'; //.....etc.... ?>

現(xiàn)在數(shù)據(jù)庫中已經(jīng)擁有一個已加密的密碼,但是沒有對其進(jìn)行解密的方法。如何使之有用?一個比較容易的方法是:對用戶提供的任何傳入密碼都使用相同的加密方法,并將結(jié)果與您存儲的密碼比較。

清單 6. 重訪 verify.php

<?php $user = strip_tags(substr($_POST['user'],0,32)); $pw = strip_tags(substr($_POST['password'],0,32)); $cleanpw = crypt(md5($pw),md5($user));

$sql = 'select user,password from users where user=''. mysql_real_escape_string($user).'' and password=''. mysql_real_escape_string($cleanpw).'' limit 1'; $result = mysql_query($sql);

if (mysql_num_rows($result)){ //we have a match! }else{ //no match } ?>例如,如果存儲的加密密碼是 i83Uw28jKzBrZF,則加密存儲傳入的密碼,并將它與存儲的密碼進(jìn)行比較。攻擊者破壞加密的惟一方法是將一個非常長的字符串列表與您的加密密碼進(jìn)行比較,每次比較一個,直到找到匹配項(xiàng)。這也稱為字典攻擊,因此您的密碼最好不應(yīng)該是密碼 或 Star Trek 字符名,甚至您的呢稱。因?yàn)樵诩用?Fido 后,它會變成一堆亂語,但這并不表明它對于此種攻擊是安全的。確保您的密碼具有某一長度(八個或更多字符),并包含大寫字母、數(shù)字和特定的字符,如 ! 和 $,這樣猜測您的數(shù)據(jù)會更加困難。在短語中,f1D0! 是一個較好的密碼,它勝于 GandalftheGray 之類的長密碼,由于后者使用小寫字母,并且是 “Lord of the Rings” 的字符名稱。

使用 crypt() 的一種不太好的方法

還有使用 crypt() 的另一種方法,這種方法不太好:將明文的前 n 個字符用作 salt。

清單 7. 將明文字符用于 salt

<?php $user = strip_tags(substr($_POST['user'],0,32)); $pw = strip_tags(substr($_POST['password'],0,32)); $cleanpw =crypt($pw, substr($user,0,2));

$sql = 'select user,password from users where user=''. mysql_real_escape_string($user).'' and password=''. mysql_real_escape_string($cleanpw).'' limit 1'; $result = mysql_query($sql);

if (mysql_num_rows($result)){ //we have a match! }else{ //no match } ?>

如果您的用戶名是 tmyer,則 salt 預(yù)置為 tm,它會使某人很容易推斷 salt 的內(nèi)容。這不是一個好方法。

使用 PHP 進(jìn)行加密和解密

本文的大部分篇幅討論了使用 crypt() 的單向加密。但是,如果您要將消息發(fā)送給某人,并提供對該消息解密的方法,又該如何辦呢?請使用 PHP 支持的公鑰加密技術(shù)。

使用公鑰加密的用戶擁有一個私鑰和一個公鑰,并且他們與其他用戶共享公鑰。如果您要將一封私有短信發(fā)送給您的朋友 John Doe,您可以使用 John Doe 的公鑰(您已經(jīng)將其存儲在自已的 keyring 中)加密該消息。John Doe 收到該消息后,只有他可以使用他的私鑰對其解密。任何給定用戶的公鑰和私鑰在數(shù)學(xué)上是不能相關(guān)的。對于 PGP 和其他公鑰加密方法,不存在從公鑰推斷某人私鑰的方法。

PGP 的附加特性是:私鑰的密碼實(shí)際上不是密碼,它是一個密碼短語。它可以是整句話,包括標(biāo)點(diǎn)符號、空格和所有字符樣式。

使用基于 PGP 的公鑰加密的一種方法是使用 GNU Privacy Guard (GPG)。使用 GPG 加密的任何消息都可以使用 GPG、PGP 或支持任一程序的任何數(shù)量的電子郵件客戶機(jī)插件來解密。在示例中,聯(lián)機(jī)表接受用戶輸入(包括消息);使用 GPG 為特定的接收方加密消息;然后發(fā)送消息。清單 8. 使用 GPG

<?php //set up users $from = 'webforms@example.com'; $to = 'you@example.com';

//cut the message down to size, remove HTML tags $messagebody = strip_tags(substr($_POST['msg'],0,5000)); $message_body = escapeshellarg($messagebody);

$gpg_path = '/usr/local/bin/gpg'; $home_dir = '/htdocs/www'; $user_env = 'web';

$cmd = 'echo $message_body   HOME=$home_dir USER=$user_env $gpg_path' . '--quiet --no-secmem-warning --encrypt --sign --armor ' . '--recipient $to --local-user $from';

$message_body = `$cmd`;

mail($to,'Message from Web Form', $message_body,'From:$fromrn');

?>

在此示例中,PHP 調(diào)用 /usr/local/bin/gpg(此位置因服務(wù)器而異),以便使用發(fā)送方的私鑰和接收方的公鑰加密消息。結(jié)果,只有接收方可以解密該消息,并且知道來自發(fā)送方的消息。此外,還可以設(shè)置 HOME 和 USER 環(huán)境變量,以通知 GPG 在何處查找存儲這些密鑰的 keyring。其他標(biāo)志的功能如下:

--quiet 和 --no-secmem-warning 抑制來自 GPG 的警告。 --encrypt 執(zhí)行加密。 --sign 添加簽名,以驗(yàn)證發(fā)送方的身份。 --armor 產(chǎn)生非二進(jìn)制的 ASCII 輸出,這樣,易于通過電子郵件將其發(fā)送。 正常情況下,正如前面提到的,機(jī)密密鑰受密碼短語的保護(hù)。本特定實(shí)例沒有使用密碼短語,因?yàn)樵诿看伪韱翁峤粫r(shí)它都需要手工輸入。當(dāng)然,在下列情況下您還可以選擇其他選項(xiàng):在單獨(dú)文件中提供短語,或使用它自已的身份驗(yàn)證方案防止表單公用(例如,如果它是一個只能由公司銷售代表訪問的表單)。

另請注意,除非您正在對允許用戶輸入電子郵件消息的表使用 SSL,否則鍵入的任何內(nèi)容都是明文形式的。換句話說,客戶機(jī)和服務(wù)器之間的任何人都可以看見它。不過,這是另一個主題。

結(jié)束語

我們對安全性、加密技術(shù),甚至公鑰加密技術(shù)介紹了很多,目的是幫助您成功開發(fā)下一個 PHP 項(xiàng)目。使用加密和其他加密方法的要點(diǎn)不是創(chuàng)建 100% 可靠的無縫系統(tǒng)。關(guān)閉的計(jì)算機(jī)才是不可攻擊的系統(tǒng),但是也不能完全保證,因?yàn)槟橙丝赡軙呱锨白撸蜷_它,然后攻擊它。加密的要點(diǎn)是使獲取敏感數(shù)據(jù)變得非常困難,以致黑客不再嘗試攻擊,或嘗試攻擊失敗后離去。

所有安全性考慮必須兼顧方便和保護(hù)。使用強(qiáng)大的算法密鑰將所有數(shù)據(jù)都進(jìn)行單向加密意味著您的數(shù)據(jù)非常安全,但是使用時(shí)很不方便。這帶來的相應(yīng)缺陷也很嚴(yán)重,如同使用非加密的內(nèi)容一樣,為您帶來的任何方便也為其他人獲取數(shù)據(jù)帶來了可怕的方便。通過加密重要的機(jī)密數(shù)據(jù)(如密碼、信用卡號和秘密消息)和添加好的安全措施(如深層防御、過濾用戶提供的數(shù)據(jù)和傳統(tǒng)的一般常識)可以達(dá)到最佳平衡。

標(biāo)簽: PHP
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩大片在线播放| 精品成av人一区二区三区| 国产不卡精品在线| 日本久久综合| 欧美日韩精品免费观看视欧美高清免费大片| 电影91久久久| 日韩欧美精品| 91九色精品| 蜜桃视频第一区免费观看| 亚洲精选成人| 国产精品毛片aⅴ一区二区三区| 美女国产精品久久久| 精品国产第一福利网站| 在线天堂资源www在线污| 久久xxx视频| 日韩免费在线| 99国产精品久久久久久久成人热| 日av在线不卡| 国产乱人伦精品一区| 国产理论在线| 亚洲深夜av| 国产日本精品| 久久久久国产一区二区| 久久福利毛片| 久久国产视频网| 免费在线小视频| 视频一区二区三区入口| 国产欧美日韩精品一区二区免费| 成人在线视频中文字幕| 韩国久久久久久| 免费在线观看视频一区| 美日韩一区二区三区| 久久在线电影| 日韩av资源网| 成人精品中文字幕| 蜜桃视频一区二区三区在线观看| 国产精品一站二站| 亚洲夜间福利| 国产精品资源| 亚洲二区免费| 国产情侣久久| 亚洲精品一二三区区别| 国产精品一区二区中文字幕| 久久精品91| 亚洲日产av中文字幕| 日本免费久久| 国产欧美午夜| 中文不卡在线| 欧美日中文字幕| 精品免费av一区二区三区| 亚洲一二三区视频| 亚洲综合在线电影| 国产精品白浆| 日韩精品免费视频人成| 久久精品免费一区二区三区| 国产精品视频一区二区三区| 在线一区视频| 色爱av综合网| 牛牛精品成人免费视频| 在线一区电影| 日本一二区不卡| 亚洲欧洲日韩精品在线| 亚洲啊v在线| 婷婷亚洲成人| 欧美日韩视频一区二区三区| 国产精品v日韩精品v欧美精品网站| 色网在线免费观看| 亚洲午夜国产成人| 国产成人精品亚洲线观看| 喷白浆一区二区| 精品国产乱码久久久久久1区2匹| 在线亚洲成人| 国产欧美三级| 中文字幕视频精品一区二区三区 | 欧美日韩在线观看视频小说| 亚洲精品在线a| 日韩欧美三级| 国产精品一区二区精品| 午夜日韩在线| 精品日产乱码久久久久久仙踪林| 裤袜国产欧美精品一区| 久久精品卡一| 涩涩av在线| 国产精品一区二区三区www| 波多野结衣一区| 精品免费av一区二区三区| 亚洲免费一区三区| 理论片午夜视频在线观看| 日本午夜精品视频在线观看| 国产精品普通话对白| 精精国产xxxx视频在线播放| 国产激情久久| 婷婷视频一区二区三区| 国产美女精品| 国产v综合v| 久久精品国产99国产| 日韩不卡手机在线v区| 国产午夜精品一区二区三区欧美| 中文字幕一区久| 你懂的国产精品| 日韩中文一区二区| 亚洲一区区二区| 97精品国产| 国产黄色一区| 亚洲区欧美区| 激情五月综合| 欧美日韩日本国产亚洲在线 | 日本欧美大码aⅴ在线播放| 亚洲欧美日韩专区| 精品日韩毛片| 免费欧美一区| 97精品国产| 国产夫妻在线| 日本久久综合| 日韩电影免费在线观看| 福利片在线一区二区| 日韩国产91| 日韩av三区| 日韩国产高清在线| 中文字幕中文字幕精品| 久久午夜精品一区二区| 午夜在线一区二区| 免费的成人av| 综合欧美亚洲| 97久久超碰| 国产免费播放一区二区| 综合亚洲自拍| 国产日韩欧美在线播放不卡| 日韩激情一二三区| 欧美日韩亚洲一区在线观看| 日本精品一区二区三区在线观看视频| 午夜精品婷婷| 国产精品日本欧美一区二区三区| 伊人久久婷婷| 免费在线成人网| 亚洲精品伦理| 91麻豆精品激情在线观看最新| 日韩欧美中文字幕电影| 中文字幕日韩欧美精品高清在线| 美美哒免费高清在线观看视频一区二区| 好吊日精品视频| 国产毛片一区| 日韩国产欧美一区二区三区| 国产精品xxxav免费视频| 久久久精品国产**网站| 在线一区av| 久久精品动漫| 视频一区二区国产| 国产日韩免费| а√天堂8资源中文在线| 六月婷婷一区| 欧美精品97| 99久久婷婷这里只有精品| 欧美日韩国产一区精品一区| 四虎成人精品一区二区免费网站| 国产精品网址| 亚洲天堂一区二区| 99综合视频| 国产精品17p| 99香蕉国产精品偷在线观看 | 99精品99| 欧美日韩午夜| 天堂а√在线最新版中文在线| 红桃视频国产精品| 欧美一区二区三区久久精品| av在线最新| 一区二区91| 欧美激情 亚洲a∨综合| 天堂va蜜桃一区二区三区| 国产亚洲精品精品国产亚洲综合| 免费在线日韩av| 在线日韩中文| 日本a口亚洲| 久久久久国产一区二区| 中文字幕av一区二区三区人| 久久av网址| 欧美日韩激情| 国产精品欧美大片| 久久精品影视| 精品国产乱码久久久久久1区2匹| 99日韩精品| 久久中文字幕一区二区三区| 日韩亚洲精品在线| 国语对白精品一区二区| 日韩精品一级二级 | 99视频精品| 久久女人天堂| 另类国产ts人妖高潮视频| 成人羞羞视频在线看网址| 日本亚洲欧美天堂免费| 日韩欧美1区| 国产精品一区毛片| 亚洲中字黄色| 日韩欧美视频专区| 国产精品一区二区三区www| 伊人影院久久| а√天堂8资源在线| 亚洲免费福利一区| 日韩在线综合| 国产亚洲高清在线观看|