單向散列加密php
單向散列加密就是把任意長的輸入消息串變化成固定長的輸出串且由輸出串難以獲得輸入串的一種加密算法。算法
常見單向散列函數:安全
MD5 (Message Digest Algorithm 5)函數
SHA (Secure Hash Algorithm)加密
MAC (Message Authentication Code)spa
CRC (Cyclic Redundancy Check).net
利用單項散列加密的這個特性,能夠進行密碼加密保存。3d
PHP 處理密碼的幾種方式code
MD5(不推薦)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函數:http://php.net/manual/zh/func...
password_hash (安全)
//支持版本 (PHP 5 >= 5.5.0, PHP 7) echo password_hash($password, PASSWORD_DEFAULT);
解釋:password_hash() 使用足夠強度的單向散列算法建立密碼的哈希(hash)。
PHP函數:http://php.net/manual/zh/func...
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 ~
AD: