2011-08-15 157 views
7

可能重複:
Secure hash and salt for PHP passwords良好的加密散列函數

我想提出一個網站,我需要一個安全的算法來存儲密碼。 我第一次想到bcrypt,但後來發現我的主機不支持它,我無法更改主機。

我的主人允許這種加密:

  • 標準DES

而且這些哈希:

  • MD5
  • MD2,MD4 & MD5
  • SHA1,SHA256, sha384 &個SHA512
  • ripemd128,RIPEMD160,ripemd256和ripemd360
  • 漩渦
  • tiger128,3,tiger160,3,tiger192,3,tiger128,4,tiger160,4 & tiger192,4
  • snefru
  • GOST
  • 的Adler32
  • CRC32 & crc32b
  • haval128,3,haval160,3,haval192,3,haval224,3,haval256,3,haval128,4,haval160,4,haval192 4,haval224,3,haval256,4,haval128,5,haval160,5,haval192,5,haval224,5 & haval256,5

因此,可以有人對你修復好的算法與和鹽,請嗎?

+2

你想要什麼?加密還是哈希?另外,md5是散列,而不是加密。 – gnur

+0

檢查出http://stackoverflow.com/search?q=php+store+passwords,它必然會有很好的信息 –

+2

閱讀[本答案](http://stackoverflow.com/questions/4948322/fundamental-difference-之間散列和加密的算法/ 4948393#4948393)。使用sha256或sha512,迭代並完成它... – ircmaxell

回答

8

根本不應該存儲加密(甚至未加密)的密碼。相反,使用salted hashes(拉伸,例如用PBKDF2),優選SHA2-512。

僅供參考,這裏列出的散列的分類(詳見wikipedia):

加密(不是哈希函數):DES
非密碼校驗(可笑):的Adler32 ,CRC32,crc32b
破碎:MD2,MD4,MD5,SHA1
可能打破:虎,snefru,GOST,HAVAL *
可能是安全:SHA2-256/384/512,RIPEMD-128/256,RIPEMD-160/320中,WHIRLPOOL

注意,強度是指發現匹配的公知的散列任何密碼的攻擊(原像攻擊)。此外,上述排序是偏執狂,立即丟棄任何散列任何已知漏洞。

+0

該問題提到哈希和鹽... – geoffspear

+0

有時需要存儲加密的密碼,以便能夠登錄到外部系統。 – rossum

+0

@rossum在這些情況下,您應該使用單點登錄解決方案。您不會以明文形式存儲密碼,以防止攻擊者在系統數據受損的情況下登錄。由於加密密鑰是系統數據的一部分,因此加密通常毫無意義,除非密鑰和數據位於不同的安全域中。 – phihag

1

crc32,adler32等沒有設計爲加密安全 - 它們只是快速校驗和算法。我認爲醃製的SHA-256應該提供安全性和兼容性的完美結合。

在一個稍微不太嚴重的說明中,我曾經記得在一臺緩慢的服務器上使用鹽醃MD5,預計該服務器可以承受中等負載。所以我決定用一個32位的隨機鹽來填充它,並將整個東西存儲爲十六進制 - 它給人留下了整個事情沒有影響的SHA-1的印象。我真心希望有人浪費寶貴的時間在被盜的垃圾場上跑彩虹桌!

安全不是真正意義的更昂貴的散列:)

+0

通過隱藏(填充方法確實是)的安全性不是安全性。它可能會讓你在夜間感覺好一點,但最終並不能真正讓它更安全。當你將它與破解時間的概念相結合時(它會,只需要時間),由於更容易的散列,每個人的密碼將更容易暴力破解。在大多數實現中,md5實際上比sha1或sha256要慢......所以我不知道你想要達到什麼效果(並且你錯過了很長的一段時間)... – ircmaxell

1

你應該

  • 使用鹽作爲哈希的一部分。
  • 在10,000+迭代範圍內使用迭代例程。例如,PBKDF#2。
  • 使用已知的強散列(SHA-256,SHA-512)
0

正如gnur說,你需要決定是否要散列或密碼進行加密。如果這些是您自己的用戶的密碼,並且密碼僅在您的系統上使用,則使用鹽和拉伸對它們進行哈希處理。您可用的哈希算法中使用SHA-256或SHA-512。對於鹽使用128個隨機位(16個字節)。理想情況下使用加密的RNG,但非加密的RNG會在一個點上執行。無論如何,攻擊者被假定知道鹽。拉伸到足以處理單個密碼需要大約0.1秒。這限制了攻擊者每秒嘗試破解密碼的十次。

如果您要存儲密碼以登錄到外部系統,則需要加密密碼並在需要時解密它們。 DES是您唯一真正的選擇,除非您也有3DES(又名三重DES或DESede)。我很驚訝AES/Rijndael不可用。如果它是我們它優先於DES。

+1

DES是**從不* *這個年齡段的選擇。在PHP land中使用[實現Rijndael(AES)](https://github.com/ircmaxell/PHP-CryptLib/blob/master/lib/CryptLib/Cipher/Block/Cipher/Rijndael.php)比使用更好DES非常細碎... – ircmaxell

1

您應該將密碼存儲爲散列,如上所述,未加密。

散列函數基本上是一種單向轉換,它總是爲相同的輸入參數生成相同的散列。應該不可能將散列轉換回其原始形式,否則散列函數將被視爲中斷。

加密是一種雙向轉換,您可以將加密數據轉換回其原始形式,如果您有密鑰。

通過將密碼存儲爲散列,並且由於它們是單向轉換的,即使有人要獲取數據庫也無法提取它們。

在檢查密碼時,只需使用您在存儲的密碼上使用的相同散列函數進行轉換,並檢查數據庫。