如何使用blowfish算法自动生成密码加密方法的盐值

5

我刚开始学习PHP,我想为我的大学最后一年的项目创建一个带有登录功能的网站。我读到很多地方都说blowfish是哈希方法中最好的,比如这里:openssl_digest vs hash vs hash_hmac? Difference between SALT & HMAC?

我在每个关于crypt方法的地方都看到一个字符串,如$2y$07$usesomesillystringforsalt$。我的主要问题是:我如何随机生成这个字符串?而我已经从某些地方了解到时间戳和mt_rand()不安全。

另外,我听说AES是最近首选的技术,但从我所看到的来看,用PHP实现起来似乎相当棘手!在存储密码时,blowfish仍然是可接受的保护方法吗?


2
它不是随机生成的,而是 $algo$cost$salt$,其中 salt 是微秒级别的时间戳加上您的域名,经过 sha1 加密后取前 21 个字符。超过 21 个字符将被删除。也许我早期做的东西会对你有兴趣 php-pdo-secure-login-script-example - Lawrence Cherone
3个回答

6

对于PHP版本5.3.7或更高版本,我认为以下是最好的:

$blowfish_salt = "$2y$10$".bin2hex(openssl_random_pseudo_bytes(22));

对于 PHP 版本 5.5 或更高版本,只需使用新的 password_hash() 函数,该函数可自动创建盐值。


小伙伴们要注意了,bin2hex(openssl_random_pseudo_bytes(22))会返回44个字符。对于php blowfish,您需要bin2hex(openssl_random_pseudo_bytes(11))。 - David Constantine

6
一个盐应该是唯一的(对于每个密码)和不可预测的。这两个标准对于确定性计算机来说有点难以实现,所以你能做的最好的事情是使用操作系统的随机源来生成盐。
时间戳以及mt_rand()函数都不是理想的选择,因为人们可以认为它们是可预测的。至少攻击者可以缩小(因此预先计算)某个时间段内可能的组合。尽管在实践中可能影响不大,但为什么不尽力呢?
自PHP 5.3以来,您可以安全地使用mcrypt_create_iv()函数从随机源读取,然后您将不得不将二进制字符串编码为允许的字母表。这是一个可能的实现
PHP 5.5将拥有自己的函数password_hash()password_verify(),以简化此任务。还有一个兼容性包可用于PHP 5.3/5.4,可在password_compat下载。

3

在IT技术领域,Blowfish算法仍然可接受,并且比快速哈希方法更受欢迎。

盐的作用是防止预先计算表攻击。只要使用了一个非平凡的盐(例如微秒数),就可以防止任何没有恰好使用该确切盐值的预计算表攻击。


那么类似于$password = crypt($_POST[passward], '$2y$07$'.microtime());这样的代码可以吗?感谢您的帮助。 - Connel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接