5

我刚刚开始学习 PHP,我想为我最后一年的大学项目创建一个登录网站。我读过河豚是在许多地方进行散列的最佳方法,例如:openssl_digest vs hash vs hash_hmac?盐和 HMAC 的区别?

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

此外,我听说 AES 是最近的首选技术,但据我所知,在 PHP 中实现似乎相当棘手!河豚仍然是一种可以接受的方法来保护存储的密码吗?

4

3 回答 3

6

盐应该是唯一的(对于每个密码)并且不可预测。这两个标准对于确定性计算机来说有点难以满足,所以你能做的最好的事情就是使用操作系统的随机源来生成盐。

时间戳以及mt_rand()功能并不理想,因为人们可能会争辩说它们是可预测的。至少攻击者可以缩小(并因此预先计算)特定时期的可能组合。虽然这在实践中可能不会产生很大的影响,但为什么不尽力而为呢?

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

PHP 5.5 将拥有自己的功能password_hash()password_verify()准备就绪,以简化此任务。还有一个适用于 PHP 5.3/5.4 的兼容包,可在password_compat下载。

于 2012-11-26T09:05:34.463 回答
5

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

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

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

于 2013-07-22T19:01:52.700 回答
3

河豚仍然是可以接受的,并且比快速散列方法更受欢迎。

盐的目的是防止预先计算的表攻击。只要你有一个非平凡的盐,比如微时间,你就会阻止任何没有碰巧使用精确盐的预先计算的表。

于 2012-11-25T23:32:36.640 回答