如何使用河豚自动生成用于crypt方法的盐

时间:2012-11-25 23:05:12

标签: php passwords blowfish crypt

我刚刚开始学习PHP,我想创建一个登录我最后一年大学项目的网站。我已经读过,河豚是在这里的许多地方进行散列的最佳方法:openssl_digest vs hash vs hash_hmac? Difference between SALT & HMAC?

我读到的关于crypt方法的所有地方都包含一个像$2y$07$usesomesillystringforsalt$这样的字符串我的主要问题是:我如何随机生成这个?我读过时间戳和mt_rand()不安全的地方。

我也听说AES是最近的首选技术,但从我看来,在PHP中实现它似乎相当棘手!河豚仍然是保护存储密码的可接受方法吗?

3 个答案:

答案 0 :(得分:6)

salt应该唯一(对于每个密码)和不可预测。这两个标准在确定性计算机上有点难以实现,因此您可以做的最好的事情是,使用操作系统的随机源来生成盐。

时间戳以及mt_rand()功能并不理想,因为可以说它们是可预测的。至少攻击者可以在一段时间内缩小(并因此预先计算)可能的组合。虽然这可能对实践没有太大影响,但为什么不尽力做到最好?

从PHP 5.3开始,您可以安全地使用mcrypt_create_iv()函数从随机源中读取,然后您必须将二进制字符串编码为允许的字母表。这是possible implementation

PHP 5.5将拥有自己的函数password_hash()password_verify(),以简化此任务。 PHP 5.3 / 5.4还有一个compatibility pack,可在password_compat下载。

答案 1 :(得分:4)

对于PHP 5.3.7或更高版本,我相信这是最好的:

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

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

答案 2 :(得分:3)

Blowfish仍然可以接受,并且优于快速散列方法。

盐的目的是防止预先计算的表攻击。只要你有一个非平凡的盐,比如microtime,你就会挫败任何没有使用过这种盐的预计算表。