我正在研究构建一个登录系统,在阅读php手册后,当您将2位数字的salt传递给crypt()函数时,它将返回一个哈希字符串,字符串的前2位是您使用的salt。

例子:

$salt = "kr";
echo crypt("mysecret",$salt); //returns "kreOI.F7eOQMY"

我的第一个想法是,这是否对试图反转您的哈希的人没有帮助?

我在Wikipedia上查询了salt,其中说:



因此,我不明白为什么crypt函数会返回所有以所使用的salt值作为前缀的哈希值?

是否有一个原因?这应该是安全问题吗?

最佳答案

crypt()函数已过时。在影子密码支持出现之前,它曾用于哈希老式Unix系统的密码。在那里加盐会增加暴力破解密码的复杂性。但是,由于盐是由密码子系统随机生成的,因此必须将其透明存储,以便以后进行任何密码操作。如果在加密之前已将salt嵌入到密码中,那么将没有实际的方法来验证密码-您必须在完成密码检查后尝试每一种可能的salt-高度不切实际。因此,盐是加密密码的前缀,因此您可以再次将其拔出以备将来使用。

crypted password: xxabcdefghijklmn
                  ^^- salt
                    ^^^^^^^^^^^^^^-- crypted pw

if ('xx' + crypt('xx' + password) == 'crypted string') then
     password is ok
endif

如今,crypt()的安全性等同于 Cereal 盒解码器环。出于历史目的,那里的安全性很低,“谁在乎它是否会被闯入”存储。对于任何现代密码用法,最好使用更现代的哈希值,例如sha1/sha256/md5。甚至这些天md5也被认为是损坏的,sha1的边缘周围有裂纹,并且(我最后检查过)sha256仍然很安全。

关于php - 为什么PHP crypt()在盐之前添加盐?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4807677/

10-11 19:10