我一直在研究在php应用程序中保护密码的更好的方法。在形式上,我会使用类似的东西(只是一个例子,不要开枪!):
$salt = md5(rand() . md5(rand() . '$%E$%SDRT');
$password = md5('supersecret', $salt);然后,我将为数据库中的每个密码生成不同的盐,以防止使用彩虹表。
但是从网上看,似乎大多数(明智的)人都在转向bcrypt()。关于它是如何工作的,为什么它是工作的等等,有很多问题,但我不明白的是它是如何更安全的?请注意,我可能在这里搞混了我的理解。
据我所知,当你使用crypt($pass,$salt)时,盐实际上是作为crypt的指示器,告诉它要使用什么算法。根据php手册,你使用的是"$2a$07“,它告诉crypt在log2轮次中使用河豚。然后,它会输出一个字符串,其中包含作为前缀的盐。
手册中的示例:
Blowfish: $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi似乎所有密码的salt都是静态的。我不明白这是怎么安全的。对于黑客来说,找到盐似乎更容易(甚至不需要从盐柱中拉出),并且在开始时有一个信标,指示使用的轮次和算法。怎样才能更安全呢?我知道更多的轮次会对硬件造成更高的代价,使其具有可伸缩性,并增加破解密码所需的时间(由于成本),但它也表明了它是如何完成的。
此外,我喜欢自己编写尽可能多的应用程序代码,以便对工作原理有更高的理解,如果可能的话,我更喜欢远离openwall。我不喜欢依赖其他人的代码,进而吸收他们的漏洞。我宁愿对我自己的漏洞负责,并自己修复它们。
还有一件事。如果增加轮数,这是否意味着当前密码散列将与数据库中的散列不匹配?您是否必须重置所有用户的密码,或者您是否在下次登录时慢慢地将其移动到新的轮数?
正如我所说的,这只是我的理解,所以可能只是我的理解混淆了。我不认为这是你可以“尝试并失败”的情况之一,因为如果你失败了,你可能看到的不仅仅是一个坏掉的应用程序……
我一直在读的是:
What is the correct format for a blowfish salt using PHP's crypt?
PHP Manual - Crypt
Openwall phpass
How to create and store password hashes with Blowfish in PHP
发布于 2013-01-21 22:16:39
据我所知,你的问题是“为什么使用可变盐进行散列更安全?”
只有一件事:它总是暴力的,如果盐是恒定的,那么只需一个暴力循环就可以“破解”所有的密码。(如果hash等于数据库中的1-我们知道用户密码)。
对于简单的md5()和sha1()散列函数,还可以将生成的强制密码散列存储在数据库中(以备将来使用)。这种方法可以让黑客在几秒钟内确定几乎所有的密码。
发布于 2013-01-21 22:28:35
似乎所有密码的salt都是静态的。我不明白这是怎么安全的。
您需要以不同的方式使用bcrypt。不要将真实密码作为password参数传递。您可以在字符串的前面、后面或中间添加一些生成的"salt“字符串。然后将盐与输出散列一起存储到您的存储中。
当用户输入他/她的密码,然后获得盐,对盐和bcrypt()再次做同样的事情,并将结果与您存储的散列进行比较。
以这种方式使用盐会阻止使用@clover提到的普通彩虹表。
此外,简单的解决方案通常是更好的解决方案。简单的rand()应该足以作为密码salt。
https://stackoverflow.com/questions/14433843
复制相似问题