首頁  >  文章  >  後端開發  >  PHP資料加密方法深入剖析

PHP資料加密方法深入剖析

WBOY
WBOY原創
2016-07-25 08:58:361249瀏覽
  1. mysql>CREATE TABLE members (
  2. ->username CHAR(14) NOT NULL,
  3. ->password CHAR(32) NOT NULL,
  4. ->PRIMARY KEY(username)
  5. ->);
複製程式碼

然後,我們假定下面的資料已經儲存在該表中:

  1. $enteredPassword.
  2. $salt = substr($enteredPassword, 0, 2);
  3. $userPswd = crypt($bentered, $rypt($bentered, $rypt($benter = crypt($enter,crypt” );
  4. // $userPswd然後就和用戶名一起儲存在MySQL 中
複製程式碼

我將使用Apache的口令-應答認證設定提示使用者輸入使用者名稱和口令,一個鮮為人知的有關PHP的資訊是,它可以把Apache 的口令-應答系統輸入的使用者名稱和口令識別為$PHP_AUTH_USER和$PHP_AUTH_PW,我將在身分驗證腳本中用到這二個變數。花一些時間仔細閱讀下 面的腳本,多注意其中的解釋,以便更好地理解下面的程式碼: crypt()和Apache的口令-應答驗證系統的應用

  1. $host = "localhost";
  2. $user = "zorro";
  3. $pswd = "hell odolly";
  4. $
  5. $ db = "users";
  6. // Set authorization to False
  7. $authorization = 0;
  8. // Verify that user has entered username and password
  9. if (isset($PHPHP_AUTH_USC) & & password
  10. if (isset($PHPHP_AUTH_USC) &&iss&W_&iss_AUTH_P_AUTH_U4_&iss&HTHP_ )) :
  11. mysql_pconnect($host, $user, $pswd) or die("Can't connect to MySQL
  12. server!");
  13. mysql_select_db($db) or die("Can't select database!");
  14. // Perform the encryption
  15. $salt = substr($PHP_AUTH_PW, 0, 2);
  16. $encrypted_pswd = crypt($PHP_AUTH_PW, $salt); Build the query
  17. $query = "SELECT username FROM members WHERE
  18. username = '$PHP_AUTH_USER' AND
  19. password = '$encrypted_pswd'";
  20. // Execute the queif (mysql_query($query)) == 1) :
  21. $authorization = 1;
  22. endif;
  23. endif;
  24. // confirm authorization
  25. if (! $authorization) : header('WWW-Authenticate: Basic realm="Private"');
  26. header('HTTP/1.0 401 Unauthorized');
  27. print "You are unauthorized to enter this area.";
  28. exit;
  29. else :
  30. print "This is the secret data!";
  31. endif;
  32. >
複製代碼
上面就是一個核實使用者存取權限的簡單身份驗證系統。在使用crypt()保護重要的機密資料時,記住在缺省狀態下使用的crypt()並不是最安全的,只能用在對安全性要求較低的系統中,如果需要較高的安全性能,就需要我在本篇文章的後面介紹的演算法。 以下我將介紹另一個PHP支援的函數━━md5(),這函數使用MD5雜湊演算法,它有幾種很有趣的用法值得一提:

混編 一個混編函數可以將一個可變長度的資訊轉換為具有固定長度被混編過的輸出,也被稱為「資訊文摘」。這是十分有用的,因為 一個固定長度的字串可以用來檢查檔案的完整性和驗證數位簽章以及使用者身份驗證。由於它適合PHP,PHP內建的md5()混編函數將把一個可 變長度的資訊轉換為128位元(32個字元)的資訊摘要。混編的一個有趣的特點是不能透過分析混編後的資訊得到原來的明碼,因為混編後的結果 與原來的明碼內容沒有依賴關係。 即便只改變一個字串中的一個字符,也將使得MD5混編演算法計算出二個截然不同的結果。我們首先來看下 表的內容及其對應的結果: 使用md5()混編字串

  1. $msg = "This is some message that I just wrote";
  2. $enc_msg = md5($msg);
  3. "hash🎜> "hash : $enc_msg ";
  4. >
複製程式碼
結果: hash: 81ea092649ca32b5ba375e81d8f4972c 注意,結果的長度為32個字元。再來看一下下面的表,其中的$msg的值有了一點 微小的變化: 使用md5()對一個稍微變化的字串進行混編

  1. //注意,message中少了一個s
  2. $msg = "This is some mesage that I just wrote";
  3. $enc_msg = md5($msg);
  4. print "hash2: $enc_msg
  5. ";
  6. >
複製程式碼
複製程式碼複製程式碼複製程式碼複製程式碼複製碼

結果: hash2: e86cf511bd5490d46d5cd61738c82c0c 可以發現,儘管二個結果的長度都是32個字符,但明文中一點微小的變化使得結果發生了很大的變化,因此,混編和md5()函數是檢查數據中微小變化的一個很好的工具。 儘管crypt()和md5()各有用處,但二者在功能上都受到一定的限制。在下面的部分中,我們將介紹 二個非常有用的被稱為Mcrypt和Mhash的PHP擴展,將大大拓展PHP用戶在加密方面的選擇。 儘管我們在上面的小節中說明了單向加密的重要性,但有時我們可能需要在加密後,再把密碼數據還原成原來的數據,幸運的是,PHP透過Mcrypt擴展庫的形式提供了這種可能性。 Mcrypt Mcrypt 2.5.7 Unix | Win32 Mcrypt 2.4.7是一個功能強大的加密演算法擴充庫,它包括有22種演算法 ,其中就包括下面的幾種演算法: Blowfish RC2 Safer-sk64 xtea Cast-256 RC4 Safer-sk128 DES RC4-iv Serpent Enigma Rijndael-128 Threeway Gost Rijndael-192 TripleDES LOKI97 Rijndael-256 Twofish PanamaSaferplus Wake 1 2 下一頁 尾頁



陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn