MySQL密码功能

Posted

技术标签:

【中文标题】MySQL密码功能【英文标题】:MySQL password function 【发布时间】:2010-12-17 14:14:43 【问题描述】:

使用 mysql 的密码函数对应用程序使用的密码进行哈希处理是好还是坏?我可以看到优点和缺点。我很好奇对于它的好坏是否有普遍的共识。

【问题讨论】:

【参考方案1】:

如果您使用数据库函数来散列密码,那么根据定义,它们必须未经散列地到达数据库:因此,我更愿意在更接近“源”的地方进行操作,即在前端应用程序中,这样您就不会四处走动暴露信息。

【讨论】:

+1 加盐和散列帐户密码是一个应用程序问题,而不是您希望依赖 DBMS 的特定实现来解决的问题。 字,这不是你想用的东西。只需查看 OLD_PASSWORD 和 MySQL 更改其散列方法时发生的 PITA。在应用程序中执行此操作要好得多,imo。【参考方案2】:

我认为 MySQL 中实际的 PASSWORD 函数是不安全的,并且已被破坏,但我目前找不到链接。我知道较旧的(OLD_PASSWORD 5 岁及以上)绝对不安全。

当然,所有密码都应始终与盐一起存储(为了进一步模糊)。示例:

UPDATE users SET password=MD5(CONCAT('salt', 'user provided value')) WHERE id=54

还有MD5 函数,但随着巨大彩虹表的兴起,作为完全混淆存储密码的一种方式,它并不是 100% 可靠的。

更好的方法是在密码到达数据库之前对其进行哈希处理(使用盐)。示例:

<?php
$password = sha1(SALT.$_POST["password"]);
$sql = "UPDATE users SET password='".$password."' WHERE id=54";
?>

【讨论】:

看一下password.c的代码,MySQL 4.1+的密码只是简单地用SHA1对输入进行了两次编码(不加盐)并转换为十六进制字符串。 不应该使用普通的哈希值来存储密码(尽管它仍然比纯文本好得多),您应该使用 bcrypt 或其他密钥派生函数,它更能抵抗暴力破解-强制攻击。 我以为应该是 sha1 两次?参考:***.com/questions/17766978/… @zx1986 你从一个 7 岁的问题中引用了一个 3 岁的问题。这两种方法现在都被认为是不好的做法,被 PHP 的原生 password_hash 函数取代。【参考方案3】:

MySQL 的 PASSWORD() 函数的文档指出:

PASSWORD() 函数被 MySQL Server 中的认证系统使用;您不应该在自己的应用程序中使用它。

阅读“You're Probably Storing Passwords Incorrectly”以获得关于散列和存储密码的更好建议。

MD5 和 SHA-1 被认为太弱而无法用于密码。目前的建议是使用 SHA-256。

我为 MySQL 贡献了一个补丁以支持 SHA2() 函数,该补丁已被接受,但由于他们的路线图已更改,尚不清楚它何时会成为发布的产品。

与此同时,您可以在您的编程语言中使用散列和加盐,并将结果散列摘要存储在数据库中。如果您使用 PHP,则 SHA-256 可在 hash() 函数中使用。

更新: MySQL 5.5.8 于 2010 年 12 月发布,该版本包含对 SHA2() 函数的支持。

【讨论】:

这篇文章的任何更新,如果 SHA2() 仍然是最新的密码功能的替代品?谢谢 @Charlesliam,查看 bcrypt、scrypt 或 PBDKF2。【参考方案4】:

简介 在不涉及太多技术和数学细节的情况下,稍微解释一下加密散列加盐之间的区别可能会很有用。

加密 加密已经存在了很长时间。埃及人用它来创造神秘和娱乐,而罗马人用它来发送秘密信息。当您加密密码时,您会应用某种算法将其打乱。应用密钥,解密它。

ROT13 是加密算法的一个简单示例。它基本上用字母表中的 13 个位置替换每个字母。

不要喝酒。 = Qba'g qevax gur jvar。 ROT13 显然是一个相当弱的算法,但在这里说明关键点很有用 - 加密数据是可逆的。设计就是这样。如果另一端的人无法破译秘密信息,那么加密它就毫无意义。因此,它对于信用卡号或电子邮件等内容很有用。您正在阅读本文的网络浏览器也在使用加密。

服务器对数据进行加密,通过安全的 SSL 连接将其发送到您的浏览器,浏览器对其进行解密以便您阅读。

散列 散列与加密的不同之处在于,一旦数据被编码,就不能被解码。好吧,至少这样做非常困难。与加密不同,输出始终具有固定长度,具体取决于您使用的算法。

使用我们之前的短语,以及我们得到的 MD5 算法......

不要喝酒。 = b290557177ec5dd7098d1de84616dd04 如果我们尝试更长的短语...

请不要喝这种酒,味道很糟糕。 = fd870b20869d9ae05d84e3d7fbed0c94 您将看到结果的长度相同。这意味着,多个输入可能导致相同的输出,称为冲突

在存储不需要回读但需要检查的内容时,散列很有用。密码是主要的例子。您不存储明文,而是存储散列版本。然后,当有人输入他们的密码时,您应用相同的散列算法并将其与您在数据库中的内容进行比较。如果它们匹配,那么大门就会打开。

哈希函数也可以用来测试信息是否被篡改。发送电子邮件时,您首先共享一个只有您和接收者知道的秘密值。在发送电子邮件之前,您使用您的秘密值对其进行签名并生成哈希值。然后将您的明文电子邮件(不带秘密值)连同散列值一起发送。然后,您的朋友可以执行相同的过程,如果哈希值相同,那么他们就知道您的消息在此过程中没有被篡改。这种技术称为消息验证码或基于哈希的消息验证码。

散列算法的重要因素是它们只能以一种方式工作。计算出原始值的唯一方法是蛮力。尝试多个值以查看它们是否产生相同的哈希。

这对于通常较短且使用常见单词的密码尤其成问题。现代计算机不需要很长时间就可以遍历一个大字典(或使用现有的彩虹表)并计算出每个常见密码的哈希结果。

这就是加盐的用武之地。

腌制 除了阻塞你的动脉,盐还会阻塞任何试图破解散列密码的人。它们的工作原理是在输入的末尾添加一个额外的秘密值,延长原始密码的长度。

假设你的密码是 rocky,盐值是 i.love.salt。哈希值将由这两者一起组成 rockyi.love.salt。这为那些使用常用词作为密码的人提供了一些保护。但是,如果有人知道您使用的盐值,那么他们只需将其添加到他们在攻击中尝试的每个字典单词的末尾(或开头)。

为了使这更困难,您可以使用随机盐,每个密码一个。它显然需要存储在与用户帐户匹配的数据库中,但这确实使蛮力攻击变得更加困难。最后,您可以从多个部分创建盐,您可以使用当前日期时间、用户名、秘密短语、随机值或所有这些的组合。

【讨论】:

以上是关于MySQL密码功能的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的用户密码过期功能

macos怎样改变mysql密码

mac安装mysql忘记初始密码的解决办法

mysql差异备份和密码破解

mysql差异备份和密码破解

一键强制修改任意Mysql数据库的密码,修改任意环境Mysql数据库。