如何在MySQL的`encrypt`函数中使用`bcrypt`算法来验证密码?

14

我有一个加密过的密码值 ($2y$10$zQaDT8hXM4pLmBdwN0xEseda/oKJAQKMKMzUrV8jbs6Epz28BXzBS),对应的原始密码是qwe。但在验证时,得到的哈希值不正确。

mysql> select '$2y$10$zQaDT8hXM4pLmBdwN0xEseda/oKJAQKMKMzUrV8jbs6Epz28BXzBS' = encrypt('qwe', '$2y$10$zQaDT8hXM4pLmBdwN0xEseda/oKJAQKMKMzUrV8jbs6Epz28BXzBS') as is_valid; 
+----------+
| is_valid |
+----------+
|        0 |
+----------+

select encrypt('qwe', '$2y$10$zQaDT8hXM4pLmBdwN0xEseda/oKJAQKMKMzUrV8jbs6Epz28BXzBS') as hash;
+---------------+
| hash          |
+---------------+
| $2tBKnsbV2Szg |
+---------------+

md5 运行良好

mysql> select '$1$$.dCRcHz4ApIYzcA0g/qz3/' = encrypt('qwe', '$1$$.dCRcHz4ApIYzcA0g/qz3/') as is_valid; 
+----------+
| is_valid |
+----------+
|        1 |
+----------+

如何为MySQL添加对bcrypt的支持?


22
绝对不能将明文密码输入到MySQL数据库中,即使在查询级别上也不行。否则您可能会将密码写入日志(查询日志、通用日志、慢查询日志等),这是非常可怕的后果。所以不要尝试这样做... - ircmaxell
2
使用bcrypt来存储密码是一个很好的选择。即使你的方法有缺陷,这也比大多数Web应用程序更加安全。继续努力! - Benjamin Barenblat
3
MySQL知道这个问题。密码和日志5.5密码和日志5.6 - sectus
1
@ircmaxell,有些情况是无法避免的,我就遇到了这样的情况...我开发了一个应用程序,需要在每次交易后发送一些自动报告邮件(使用我们自己的邮件服务器)。我被迫将电子邮件密码以明文形式保存在数据库中,因为我不想让用户输入应用程序报告邮件的密码,让邮件登录到服务器并在该交易之后发送报告邮件。如果我加密密码,那么我如何自动登录到我的邮件服务器呢?同时,这不是我的用户要关心的事情,他们不需要输入报告邮件的密码... - Mehdi
显示剩余5条评论
1个回答

27

不行。MySQL的ENCRYPT()函数使用操作系统的crypt()函数 - 如果您的操作系统不支持bcrypt哈希,则MySQL也不支持。

此外,请勿使用MySQL的ENCRYPT()函数。正如ircmaxell所指出的那样,您传递给MySQL查询的任何数据都可能最终出现在服务器日志文件中,因此在密码相关的任何事情上使用它可能是不安全的。


但是我可以通过PHP中的crypt生成哈希。我猜测我的系统支持bcrypt。 - sectus
5
PHP 5.3 及以上版本使用了自己的 crypt() 实现,而不再使用操作系统提供的实现。 - user149341

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接