IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機版|論壇轉貼|軟件發(fā)布

您當前所在位置:首頁網(wǎng)絡編程PHP編程 → PHP實例:PHP安全編程之加密功能

PHP實例:PHP安全編程之加密功能

時間:2015/6/28來源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評論(0)

預備知識

在詳細介紹php的安全功能之前,我們需要花

點時間來向沒有接觸過這方面內容的讀者介紹一些有關密碼學的基本知識,如果對密碼學的基本概念已經(jīng)非常熟悉,就可以跳過去這一部分。

密碼學可以通俗地被描述為對加/解密的研究和實驗,加密是將易懂的資料轉換為不易懂資料的過程,解密則是將不易懂的資料轉換為原來易懂資料的過程。不易懂的資料被稱作密碼,易懂的資料被稱作明碼。

數(shù)據(jù)的加/解密都需要一定的算法,這些算法可以非常地簡單,如著名的凱撒碼,但當前的加密算法要相對復雜得多,其中一些利用現(xiàn)有的方法甚至是無法破譯的。

PHP的加密功能

只要有一點使用非Windows平臺經(jīng)驗的人可能對crypt()也相當熟悉,這一函數(shù)完成被稱作單向加密的功能,它可以加密一些明碼,但不能夠將密碼轉換為原來的明碼。盡管從表面上來看這似乎是一個沒有什么用處的功能,但它的確被廣泛用來保證系統(tǒng)密碼的完整性。因為,單向加密的口令一旦落入第三方人的手里,由于不能被還原為明文,因此也沒有什么大用處。在驗證用戶輸入的口令時,用戶的輸入采用的也是單向算法,如果輸入與存儲的經(jīng)加密后的口令相匹配,則輸入的口信一定是正確的。

PHP同樣提供了使用其crypt()函數(shù)完成單向加密功能的可能性。我將在這里簡要地介紹該函數(shù):

string crypt (string input_string [, string salt])

其中的input_string參數(shù)是需要加密的字符串,第二個可選的salt是一個位字串,它能夠影響加密的暗碼,進一步地排除被稱作預計算攻擊的可能性。缺省情況下,PHP使用一個2個字符的DES干擾串,如果你的系統(tǒng)使用的是MD5(我將在以后介紹MD5算法),它會使用一個12個字符的干擾串。順便說一下,可以通過執(zhí)行下面的命令發(fā)現(xiàn)系統(tǒng)將要使用的干擾串的長度:

print "My system salt size is: ". CRYPT_SALT_LENGTH;

系統(tǒng)也可能支持其他的加密算法。crypt()支持四種算法,下面是它支持的算法和相應的salt參數(shù)的長度:

算法 Salt長度

以下為引用的內容:

CRYPT_STD_DES 2-character (Default)
CRYPT_EXT_DES 9-character
CRYPT_MD5 12-character beginning with 102/td>
CRYPT_BLOWFISH 16-character beginning with 102/td>

用crypt()實現(xiàn)用戶身份驗證

作為crypt()函數(shù)的一個例子,考慮這樣一種情況,你希望創(chuàng)建一段PHP腳本程序限制對一個目錄的訪問,只允許能夠提供正確的用戶名和口令的用戶訪問這一目錄。我將把資料存儲在我喜歡的數(shù)據(jù)庫mysql的一個表中。下面我們以創(chuàng)建這個被稱作members的表開始我們的例子:

以下為引用的內容:

mysql>CREATE TABLE members (
->username CHAR(14) NOT NULL,
->password CHAR(32) NOT NULL,
->RIMARY KEY(username)
->);

然后,我們假定下面的數(shù)據(jù)已經(jīng)存儲在該表中:

以下為引用的內容:

用戶名 密碼
clark keloD1C377lKE
bruce ba1T7vnz9AWgk
peter paLUvRWsRLZ4U

這些加密的口令對應的明碼分別是kent、banner和parker。注意一下每個口令的前二個字母,這是因為我使用了下面的代碼,根據(jù)口令的前二個字母創(chuàng)建干擾串的:

以下為引用的內容:

.
= substr(, 0, 2);
= crypt(, );
// 然后就和用戶名一起存儲在MySQL中

我將使用Apache的口令-應答認證配置提示用戶輸入用戶名和口令,一個鮮為人知的有關PHP的信息是,它可以把Apache的口令-應答系統(tǒng)輸入的用戶名和口令識別為和,我將在身份驗證腳本中用到這二個變量;ㄒ恍⿻r間仔細閱讀下面的腳本,多注意一下其中的解釋,以便更好地理解下面的代碼:

以下為引用的內容:

crypt()和Apache的口令-應答驗證系統(tǒng)的應用

= "localhost";
= "zorro";
= "hellodolly";
= "users";

// Set authorization to False

= 0;

// Verify that user has entered username and password

if (isset() && isset()) :

mysql_pconnect(, , ) or die("Can''t connect to MySQL
server!");

mysql_select_db() or die("Can''t select database!");

// Perform the encryption
= substr(, 0, 2);
= crypt(, );

// Build the query

= "SELECT username FROM members WHERE
username = '''' AND
password = ''''";

// Execute the query

if (mysql_numrows(mysql_query()) == 1) :
= 1;
endif;

endif;

// confirm authorization

if (! ) :

header(''WWW-Authenticate: Basic realm="rivate"'');
header(''HTTP/1.0 401 Unauthorized'');
print "You are unauthorized to enter this area.";
exit;

else :

print "This is the secret data!";

endif;

?>

上面就是一個核實用戶訪問權限的簡單身份驗證系統(tǒng)。在使用crypt()保護重要的機密資料時,記住在缺省狀態(tài)下使用的crypt()并不是最安全的,只能用在對安全性要求較低的系統(tǒng)中,如果需要較高的安全性能,就需要我在本篇文章的后面介紹的算法。

下面我將介紹另一個PHP支持的函數(shù)━━md5(),這一函數(shù)使用MD5散列算法,它有幾種很有趣的用法值得一提:

混編
一個混編函數(shù)可以將一個可變長度的信息變換為具有固定長度被混編過的輸出,也被稱作"信息文摘"。這是十分有用的,因為一個固定長度的字符串可以用來檢查文件的完整性和驗證數(shù)字簽名以及用戶身份驗證。由于它適合于PHP,PHP內置的md5()混編函數(shù)將把一個可變長度的信息轉換為128位(32個字符)的信息文摘。混編的一個有趣的特點是不能通過分析混編后的信息得到原來的明碼,因為混編后的結果與原來的明碼內容沒有依賴關系。 即便只改變一個字符串中的一個字符,也將使得MD5混編算法計算出二個截然不同的結果。我們首先來看下表的內容及其相應的結果:

使用md5()混編字符串

<samp id="ecffu"></samp>
      <td id="ecffu"></td>

      以下為引用的內容:

      = "This

      關鍵詞標簽:功能,加密,安全,實例,

      相關閱讀

      文章評論
      發(fā)表評論

      熱門文章 plsql developer怎么連接數(shù)據(jù)庫-plsql deveplsql developer怎么連接數(shù)據(jù)庫-plsql deve2021年最好用的10款php開發(fā)工具推薦2021年最好用的10款php開發(fā)工具推薦在 PHP 中使用命令行工具在 PHP 中使用命令行工具php應用程序安全防范技術研究php應用程序安全防范技術研究

      相關下載

      人氣排行 詳解ucenter原理及第三方應用程序整合思路、方法PHP中防止SQL注入攻擊PHP會話Session的具體使用方法解析PHP運行出現(xiàn)Notice : Use of undefined constant 的解決辦法CakePHP程序員必須知道的21條技巧PHP如何清空mySQL數(shù)據(jù)庫PHP采集圖片實例(PHP采集)plsql developer怎么連接數(shù)據(jù)庫-plsql developer連接數(shù)據(jù)庫方法

    1. <s id="ecffu"></s>