事件:有訊息稱某網站超12G資料疑似外洩,涉及數千萬使用者。
那我們應該如何考慮資料的安全儲存?
讓我們一起來聊聊資料的加密技術。
單向雜湊加密
單向雜湊加密就是把任意長的輸入訊息串變化成固定長的輸出串且由輸出串難以得到輸入串的一種加密演算法。
常見單向雜湊函式:
- MD5 (Message Digest Algorithm 5)
- SHA (Secure Hash Algorithm)
- MAC (Message Authentication Code)
- CRC (Cyclic Redundancy Check)
利用單項雜湊加密的這個特性,可以進行密碼加密儲存。
PHP 處理密碼的幾種方式
MD5(不推薦)
$password = md5($_POST["password"]);複製程式碼
原因:加密演算法比較簡單,而且很多破解密碼的站點都存放了大量的經過MD5加密的密碼字串。
SHA256 和 SHA512(不推薦)
$password = hash("sha256", $password);複製程式碼
原因:加密演算法比較簡單。
鹽值(額外字串)(常用)
<?php $strSalt = '2f9c8d7h6g7f8d9k'; echo hash("sha256", $password . $strSalt);複製程式碼
解釋:在加密的過程中,新增了一個字串。
Bcrypt (比較安全)
$strSalt = '2f9c8d7h6g7f8d9k'; $salt = '$2y$11' . $strSalt; echo crypt($password, $salt);複製程式碼
解釋:salt 引數是可選的。然而,如果沒有salt的話,crypt()建立出來的會是弱密碼。
PHP函式:php.net/manual/zh/f…
password_hash (安全)
//支援版本 (PHP 5 >= 5.5.0, PHP 7) echo password_hash($password, PASSWORD_DEFAULT);複製程式碼
解釋:password_hash() 使用足夠強度的單向雜湊演算法建立密碼的雜湊(hash)。
PHP函式:php.net/manual/zh/f…
PHP端驗證密碼是否正確?
$password = 'e4r3t2y1u'; $strPwdHash = password_hash($password, PASSWORD_DEFAULT); if (password_verify($password, $strPwdHash)) { //驗證成功 } else { //驗證失敗 }複製程式碼
對稱加密
採用單鑰密碼系統的加密方法,同一個金鑰可以同時用作資訊的加密和解密,這種加密方法稱為對稱加密,也稱為單金鑰加密。
優點:對稱加密演算法的優點是演算法公開、計算量小、加密速度快、加密效率高。
缺點:在資料傳送前,傳送方和接收方必須商定好祕鑰,雙方必須儲存好祕鑰。
常用演算法:
- DES
- AES
PHP 相關類庫,網上都能找到。
非對稱加密
非對稱加密演算法需要兩個金鑰來進行加密和解密,這兩個祕鑰是公開金鑰(public key,簡稱公鑰)和私有金鑰(private key,簡稱私鑰)。
請檢視歷史文章:PHP 使用非對稱加密演算法 (RSA)
金鑰安全管理
上面說到的這幾種加密技術,能夠達到安全保密效果的一種重要前提就是金鑰的安全。
在實際工作中,我們有開發環境,預釋出環境,正式環境,每個環境中的金鑰都不相同。
那麼,我們應該如何儲存金鑰呢?
- 寫在原始碼中(不可取)。
- 寫在配置檔案中。(大部分這樣幹)。
- 寫在環境變數中。(大部分這樣幹)。
- 儲存在一個系統中,每次加密、解密都調取服務系統(系統開銷大)。
- 自己寫一個擴充套件,用PHP調取自己的擴充套件(維護成本高)。
暫時就想到這麼多,望大神提供新的思路~
Thanks ~
作者:PHP後端開發者
免費提供技術諮詢服務(自己懂的知識)。
QQ群:564557094。
關注微信公眾號,留言即可,看到留言後會及時回覆。