[英]Encrypting/Decrypting Passwords to and from a MySQL database
我開始為我的網站創建一個用戶系統,我想要做的是加密密碼,而不是明文。 我正在使用PHP / MySQL,所以我認為crypt()
是一個很好的起點。 但是,我對這樣的密碼學並不陌生,而且我很難理解它是如何工作的。 有人知道如何在最簡單的層面上實現密碼存儲為加密字符串的方式,但始終能夠解密,而不會出現安全問題嗎?
密碼應該經過哈希處理,而不是加密。 也就是說,您不應該刪除密碼。 相反,你應該比較哈希。
$password = 'hX4)1z'
$pw = hash_hmac('sha512', 'salt' . $password, $_SERVER['site_key']);
mysql_query('INSERT INTO passwords (pw) VALUES ('$pw');
mysql_query('SELECT pw FROM passwords WHERE user_id = ?');
//$pw = fetch
if ($pw == hash_hmac('sha512', 'salt' . $_REQUEST['password'], $_SERVER['site_key']) {
echo "Logged in";
}
我注意到人們在存儲密碼方面做了很多交易。
同意您不應將密碼存儲為純文本,但如果您存儲單向散列並刪除密碼,黑客仍然可以使用算法來破解哈希散列字符串並進行比較。
此外,如果使用可以在以后解密的算法進行加密,也可以通過計算加密算法來進行攻擊。
我認為只要沒有人能夠直接看到用戶的密碼而你只是讓黑客難以為好,但是人們說你不應該加密,因為它可以被解密,但這是不公平的,因為任何東西都可以被黑客入侵。
您可以使用md5或更好的散列技術,例如sha1。有關詳細信息,請參閱密碼散列http://phpsec.org/articles/2005/password-hashing.html 。
我建議使用帶鹽的SHA2來存儲密碼。
要創建SHA2哈希,請使用以下命令:
$hash = hash("sha512", $password.$salt);
在擁有防止彩虹表(密碼數據庫及其哈希值)之前,鹽包含一些額外的字符要添加到您的密碼中。 您可以使用唯一的用戶信息(如user_id)創建一個,或者只創建一個隨機的用戶信息並將其存儲在某個地方。 只要確保鹽足夠長。
不要再使用MD5了; 它太老了。 有關詳細信息,請參閱http://en.wikipedia.org/wiki/MD5#Collision_vulnerabilities 。
編輯:這些是單向散列算法。 您可以而且不應該能夠解密密碼。 如果可以,那么使用哈希來存儲密碼是沒有意義的。
不,存儲加密密碼的位置始終存在安全問題。 這就是為什么網站永遠不會存儲密碼的哈希值而不是密碼本身。 當有人在您的網站上注冊並輸入密碼時,您將存儲密碼的哈希值(MD5或SHA1或其他任何內容,如上所述)。 當他們稍后登錄時,您再次散列他們輸入的密碼(通過與存儲時相同的方法)並進行比較。 如果哈希是相同的,那么密碼是相同的(很有可能!)任何允許您恢復密碼的網站都是一個不安全的網站。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.