为什么PHP有两个密码散列函数?

时间:2013-08-31 22:54:21

标签: php passwords

我最近一直在读密码哈希,我发现PHP有两个密码哈希函数:password_hash()crypt()

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

有人可以告诉我这两个功能之间的任何重大差异,或者如果正确使用一个比另一个更安全吗?如果没有真正的区别,那么有人可以向我解释为什么有两个功能似乎做同样的事情,只有一个更好吗?

2 个答案:

答案 0 :(得分:2)

普通cryptpassword_hash之间存在两个主要差异。还值得一提的是password_hash在其实现中使用crypt,因此我们基本上将汽车电机(地穴)与整车(password_hash)进行比较。

因此,两者之间的第一个区别是crypt仅用于计算散列。你必须自己做其他一切。您必须自己实施三件事:

  • 生成盐
  • 验证哈希
  • 确定是否需要重新哈希(可选,但建议)

使用password_hash,除非您指定一个盐(除非您确实知道自己在做什么,否则不应该这样做),它将在您的操作系统上生成最安全的可用盐。盐生成可能是最复杂的部分,如果你不知道自己做错了,最容易做错的部分。 crypt 需要用于验证哈希值,但同样,您必须自己实现。即使是man page on php.net也是错的。将其与password_verify()进行比较,您会发现应该为哈希验证做一个简单的==

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

总而言之,总是使用password_hash()。如果你没有php> = 5.5下载Ircmaxell's compatibility pack

答案 1 :(得分:0)

它提供对crypt(3)功能的访问。这是一个传统的功能,可以在PHP之前使用几十年。

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

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

存在password_hash函数,因为正确使用裸crypt(3)函数充满了危险。