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


Why does PHP have two password hashing functions?

我最近读了一些关于密码哈希的文章,发现PHP有两个密码哈希函数:password_hash()crypt()

crypt()看起来更通用、更可配置,也是我个人使用的,但我读到password_hash()更好,尽管它只需要两个参数,只使用一个算法。

有人能告诉我这两个功能之间有什么主要区别吗?或者如果正确使用,其中一个功能是否比另一个更安全?如果没有真正的区别,那么有人能向我解释为什么有两个函数似乎在做同样的事情,只有一个更擅长它吗?

普通cryptpassword_hash之间有两个主要区别。同样值得一提的是,password_hash在其实现中使用了crypt,因此我们在这里基本上将汽车电机(crypt)与整个汽车(password_hash)进行比较。

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

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

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

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

总之,请始终使用password_hash()。如果您没有php>=5.5,请下载Ircmaxell的兼容性包。

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

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

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

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