我最近一直在阅读密码散列方面的内容,我发现 PHP 有两个密码散列函数:password_hash()
和crypt()
.
crypt()
看起来更加通用和可配置,是我个人使用的,但我读过password_hash()
更好,即使它只需要两个参数并且只使用一种算法。
有人可以告诉我这两个功能之间的任何主要区别,或者在正确使用时一个比另一个更安全吗?如果没有真正的区别,那么有人可以向我解释为什么有两个功能看起来做同样的事情,只有一个更擅长吗?
我最近一直在阅读密码散列方面的内容,我发现 PHP 有两个密码散列函数:password_hash()
和crypt()
.
crypt()
看起来更加通用和可配置,是我个人使用的,但我读过password_hash()
更好,即使它只需要两个参数并且只使用一种算法。
有人可以告诉我这两个功能之间的任何主要区别,或者在正确使用时一个比另一个更安全吗?如果没有真正的区别,那么有人可以向我解释为什么有两个功能看起来做同样的事情,只有一个更擅长吗?
crypt
plain和.之间有 2 个主要区别password_hash
。还值得一提的是它的实现中password_hash
使用crypt
,所以我们在这里基本上将汽车电机(crypt)与整个汽车(password_hash)进行比较。
因此,两者之间的第一个区别crypt
是仅用于计算哈希。你必须自己做其他所有事情。您必须自己实现三件事:
使用password_hash
,除非您指定盐(除非您真的知道自己在做什么,否则不应该这样做),它将在您的操作系统上生成最安全的可用盐。盐生成可能是最复杂的部分,也是最容易做错的部分,您甚至都不知道自己做错了。crypt
验证哈希是必需的,但同样,您必须自己实现。甚至php.net 上的手册页也会出错。将其与password_verify()进行比较,您会发现它不仅仅是一个简单==
的哈希验证。
其次,crypt 允许您使用过时的哈希类型创建错误的哈希。在撰写本文时,password_hash
仅使用 bcrypt,但是使用 Using password_hash
withPASSWORD_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 函数之所以存在,是因为正确使用裸露的 crypt(3) 函数充满了危险。