要验证没有加盐的散列密码,您需要计算MD5(privided_password)
并与存储在数据库中的数据进行比较。它对哈希表进行简单的搜索以解码您的大量密码。(我知道 MD5 对于密码存储很弱,我使用它只是因为哈希值比 SHA-512 短,例如。)
如果使用 salt,则必须计算MD5(provided_password + salt)
并与数据库进行比较。由于盐是散列的一部分,因此您将盐存储在数据库中,并将密码存储在用户中。
如果您的 3 个用户有passw0rd
密码,并且您使用不加盐的 MD5 对您的密码进行哈希处理,并且有人窃取了您的数据库,它会看到如下内容:
|username | password |
|user1 | 71d00b760d017b2999eb54e32f41f592 |
|user7 | 71d00b760d017b2999eb54e32f41f592 |
|user13 | 71d00b760d017b2999eb54e32f41f592 |
因此,一旦黑客在哈希表中找到一个密码(网上有很多密码),他就知道所有其他密码。
第一步是使用盐。每个密码在散列之前都会有额外的数据,但使用相同的盐:
|username | salt | password |
|user1 | SALT | a66a96b36d78e452202c12d36b6d198c |
|user7 | SALT | a66a96b36d78e452202c12d36b6d198c |
|user13 | SALT | a66a96b36d78e452202c12d36b6d198c |
使用此方案,黑客将不得不暴力破解哈希以获取密码。这需要一些时间,但是一旦破解了一个密码,其他所有密码也会被泄露。
下一步是随机盐。每个密码都有不同的随机盐:
|username | salt | password |
|user1 | SALT | a66a96b36d78e452202c12d36b6d198c |
|user7 | ASDF | 8062279f0ba04fa6ee41d0a9e04f4c93 |
|user13 | ABCD | 5743092bfb79214247c50c4102af0b99 |
在这种情况下,即使您的所有用户都拥有相同的密码,黑客也无法通过暴力破解每个密码。在这个例子中,salt 非常短,只有 4 个字节,但是您可以使用更大的 salts(128 个字节或更多)并增加暴力破解密码的难度。