我正在寻找一种用盐存储和验证mysql密码的方法。我无法访问PHP或任何其他加密软件。我知道PASSWORD()函数,但这不允许使用salt。
还有其他选择吗?
答案 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具有成本因子。如果必须检查每一行,并且每个计算都需要一些时间,那么如果用户表增长,则会遇到问题。
这就是为什么密码不应该由数据库本身进行散列的原因。首先,您必须通过给定的用户名找到哈希及其盐,然后您可以验证此单行的密码。