-1

我想保護我的用戶密碼。我想知道如果我多次加密密碼,它會保護密碼。 例如:它會在php中保護2次加密密碼嗎?

<?php 
$pass = "hello"; 
$en = md5($pass, TRUE); //result will be ][email protected]*�K*v�q��Œ 
$en1 = md5($en, TRUE); //result will be b�� 8� ��C�J 
$en2 = md5($en1, TRUE); //result will be X���dR��6�@c�� 
?> 
+1

md5自1996年以來中斷。無論您使用了多少次,人們都可以解密您返回的任何內容。所以不,它不會讓它安全兩倍,它仍然會非常脆弱。 –

+0

我建議使用SHA。不是SHA-1,因爲它已經被破解了。更高的東西。 –

+0

我認爲你應該與[Bcrypt](http://thehackernews.com/2014/04/securing-passwords-with-bcrypt-hashing.html)一起去。檢查[this](https://stackoverflow.com/q/1561174/8101556)有趣的帖子。 –

回答

-1

md5()不安全,做3次或100次都不能解決問題。

最好在用戶傳遞md5()之前放一些「salt」。

例如:

$pass = "hello"; 
$PassWithSalt = $pass.uniqid()."ziufh!fsfdnskjv"; 
$cryptedPass = md5($PassWithSalt); 

只有你會知道鹽解密您的通行證。

編輯:正如說的twicejr,最好不要使用md5()。 你可以只散列通票與 散列()或password_hash():

https://secure.php.net/manual/fr/function.password-hash.php

動態鹽是加了。 (從其他列等獲取用戶信息...)

+0

鹽應該是每個密碼的隨機唯一值,所以最好不要將其形成現有的用戶數據,當然也不要使用恆定的鹽。 – martinstoeckli

+0

使用用戶數據,然後隨機化字母順序例如一個函數是最簡單的方法有一個動態鹽,我認爲。 – Jilu

+0

最佳做法是使用密碼哈希函數,如BCrypt,SCrypt,PBKDF2或Argon2。它們中的大多數從OS的隨機源生成一個隨機唯一的鹽,並將鹽包含在生成的哈希字符串中。該鹽可以從那裏提取以進行驗證。從已知的用戶數據中衍生出一個鹽並不是什麼大問題,但可以爲「admin」等特定帳戶生成彩虹表。即使是散列的MD5也不應該被使用,因爲它可能被強制超過[10 Giga MD5每秒](http://thepasswordproject.com/oclhashcat_benchmarking)。 – martinstoeckli

-1

如果哈希算法本身尚未被破解,則重複哈希提供更高的安全性。 Md5不用於'加密'。此外,md5也會受到影響。

重複算法只是增加了更多的時間,這很好。但是在md5的情況下,不應該期望安全性,因此它是毫無意義的。

此外,密碼永遠不應加密。只是單向散列。

散列密碼的一個好方法是將sha512與多個「鹽」結合使用。 添加通用鹽和「基於內容」的鹽,使其更加安全。 (您可以將用戶行的部分電子郵件地址或類似內容注入到主字符串中,以便在預定義的位置進行散列處理,甚至可以根據其他因素讓位置)。

事情是,sha512還沒有被打破,你根本不應該使用md5。

$safe_hash = hash('sha512', 'SALTY_BALLS' . $password . $user_salt_based_on_something_specific_for_this_row);

+0

哦,並改變每個網站的通用鹽:) 額外的好處是你可以使用單個配置文件更改無效所有用戶密碼! – twicejr

+0

推薦一個不同的散列,因爲它「尚未破解」並不真正有幫助。它有一天會被打破,你會馬上回到你開始的地方。正確實施API(使用'password_needs_rehash'),你不需要再次觸摸你的代碼。 – iainn

+3

不,在密碼散列的情況下,sha512並不比md5更好。這裏重要的是前映像電阻和速度。無關緊要的是碰撞阻力。原因如下:https://www.troyhunt.com/our-password-hashing-has-no-clothes/ – TheGreatContini

3

目前最安全的方法是password_hash()和password_verify();忘記md5()和其他人只是使用這兩個,它們在手冊中可用。

<?php 
$pass = "hello"; 

$hash = password_hash($pass,PASSWORD_DEFAULT); 
?>