2

我最近一直在阅读密码散列方面的内容,我发现 PHP 有两个密码散列函数:password_hash()crypt().

crypt()看起来更加通用和可配置,是我个人使用的,但我读过password_hash()更好,即使它只需要两个参数并且只使用一种算法。

有人可以告诉我这两个功能之间的任何主要区别,或者在正确使用时一个比另一个更安全吗?如果没有真正的区别,那么有人可以向我解释为什么有两个功能看起来做同样的事情,只有一个更擅长吗?

4

2 回答 2

2

cryptplain和.之间有 2 个主要区别password_hash。还值得一提的是它的实现中password_hash使用crypt,所以我们在这里基本上将汽车电机(crypt)与整个汽车(password_hash)进行比较。

因此,两者之间的第一个区别crypt是仅用于计算哈希。你必须自己做其他所有事情。您必须自己实现三件事:

  • 生成盐
  • 验证哈希
  • 确定是否需要重新散列(可选,但推荐)

使用password_hash,除非您指定盐(除非您真的知道自己在做什么,否则不应该这样做),它将在您的操作系统上生成最安全的可用盐。盐生成可能是最复杂的部分,也是最容易做错的部分,您甚至都不知道自己做错了。crypt验证哈希是必需的,但同样,您必须自己实现。甚至php.net 上的手册页也会出错。将其与password_verify()进行比较,您会发现它不仅仅是一个简单==的哈希验证。

其次,crypt 允许您使用过时的哈希类型创建错误的哈希。在撰写本文时,password_hash仅使用 bcrypt,但是使用 Using password_hashwithPASSWORD_DEFAULT将始终保证您将使用最强推荐和可用的哈希进行哈希。crypt,在提供灵活性方面,还允许程序员在选择错误的哈希类型时犯错误的空间更大,除非您经常监控安全警告,否则您甚至可能不知道您所做的事情是错误的,或者(可能)一个新的更强大的哈希算法已在 PHP 中实现。password_hash从这个意义上说,它将是面向未来的,除非你强迫它不是。在接下来的几年里,当 scrypt 内置到 PHP 中时,我不会感到惊讶,它也将成为新的默认算法password_hash

所以总而言之,总是使用 password_hash()。如果你没有 php >= 5.5 下载Ircmaxell 的兼容包

于 2013-08-31T23:59:28.687 回答
0

它提供对 crypt(3) 函数的访问。这是一个比 PHP 早几十年的传统功能。

http://en.wikipedia.org/wiki/Crypt_(C)

它以多种模式运行,通常用于与其他系统之间共享的密码数据进行交互。

password_hash 函数之所以存在,是因为正确使用裸露的 crypt(3) 函数充满了危险。

于 2013-08-31T22:57:38.373 回答