MySQL中的Salting和hashing密码

时间:2014-04-24 19:56:01

标签: mysql passwords cryptography

我正在寻找一种用盐存储和验证mysql密码的方法。我无法访问PHP或任何其他加密软件。我知道PASSWORD()函数,但这不允许使用salt。

还有其他选择吗?

3 个答案:

答案 0 :(得分:2)

我认为既然你在谈论盐,那你真的是指散列,这是一种单向加密,而不是一种加密。哈希保证给定的输入值总是产生相同的输出值。使用安全散列算法,除了在散列函数中尝试每个明文值之外,没有更好的方法来导出原始明文。

虽然SHA1可能足以保护许多系统的密码,但肯定有更好的散列算法。然而,SHA1在MySQL中可用。

虽然SHA1() MySQL函数不接受单独的salt参数,但您仍然可以加密密码。实际上,我所知道的大多数哈希函数都没有单独的salt参数。

要为明文值加盐,只需将随机字符串连接到明文值的开头即可。不幸的是,MySQL并没有一种简单的方法来生成随机字符串,但这会让你接近。

生成6个字符(仅限十六进制值)的随机字符串:

SELECT SUBSTRING(SHA1(RAND()), 1, 6) AS salt

当然,重要的是你必须始终保存盐。你再次需要它。

一旦您保存了盐,只需将密码哈希,如下所示:

SELECT SHA1(CONCAT(salt, 'password')) AS hash_value

通常通过在哈希值前加上salt来将salt和哈希密码存储在同一列中。

要验证输入的密码,只需重复此过程即可。使用存储的salt作为明文密码的前缀,对连接的字符串进行散列,然后将生成的散列值与存储的密码散列进行比较。

每条记录应该有不同的随机盐。

答案 1 :(得分:0)

以下是两个很棒的链接:

http://www.aspheute.com/english/20040105.asp

http://alias.io/2010/01/store-passwords-safely-with-php-and-mysql/

首先,您不想“加密”您的密码。加密意味着它们可以被解密,而......这不是一件好事。您想要哈希它们以便它们是单向票证(例如SHA512())。

注意:MD5绝不应用于安全密码散列。它容易破裂。

这是盐简化/解释,因为我看到:Salt将随机值添加到密码哈希。 Salt是每个密码唯一的。 (每个密码的盐需要与密码一起存储)。对于每个密码都有独特的盐,字典攻击(密码破解技术)基本上没有机会。

所以只需使用以下内容为您的密码添加salt:

$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');

并将其与密码一起存储,或作为cookie存储,或两者兼而有之。

希望有所帮助。

答案 2 :(得分:0)

不幸的是,仅使用SQL命令无法安全地存储密码。

由于您应该向散列方案添加随机盐,因此如果用户尝试登录,则无法验证密码。您必须读取用户表中每一行的salt并计算用于比较的哈希值。

可以调整安全散列函数以需要一定量的时间(例如10ms),例如BCrypt具有成本因子。如果必须检查每一行,并且每个计算都需要一些时间,那么如果用户表增长,则会遇到问题。

这就是为什么密码不应该由数据库本身进行散列的原因。首先,您必须通过给定的用户名找到哈希及其盐,然后您可以验证此单行的密码。