MySQL中的salt和hash密码

MySQL中的salt和hash密码,mysql,passwords,cryptography,Mysql,Passwords,Cryptography,我正在寻找一种用salt存储和验证mysql密码的方法。我没有访问PHP或任何其他加密软件的权限。我知道PASSWORD()函数,但它不允许使用salt 还有其他选择吗?这里有两个很棒的链接: 首先,你不想“加密”你的密码。加密意味着它们可以被解密,这。。。这不是一件好事。您希望对它们进行散列,以便它们是单程票(例如SHA512() 注意:MD5不应用于安全密码哈希。它很容易开裂 在我看来,这里对salt进行了简化/解释:salt将随机值添加到密码散列中。Salt对每个密码都是唯一的。(每个

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


还有其他选择吗?

这里有两个很棒的链接:

首先,你不想“加密”你的密码。加密意味着它们可以被解密,这。。。这不是一件好事。您希望对它们进行散列,以便它们是单程票(例如SHA512()

注意:MD5不应用于安全密码哈希。它很容易开裂

在我看来,这里对salt进行了简化/解释:salt将随机值添加到密码散列中。Salt对每个密码都是唯一的。(每个密码的salt需要与密码一起存储)。由于每个密码都有唯一的salt,字典攻击(密码破解技术)基本上没有机会

因此,只需在密码中添加盐,例如:

$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
并将其与密码一起存储,或作为cookie存储,或两者都存储


希望这能有所帮助。

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

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

虽然
SHA1()
MySQL函数不接受单独的salt参数,但您仍然可以对密码进行salt。事实上,我所知道的大多数散列函数都没有单独的salt参数

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

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

SELECT SUBSTRING(SHA1(RAND()), 1, 6) AS salt
当然,重要的是,你必须始终节约盐。你会再次需要它的

保存盐后,只需按如下方式散列密码:

SELECT SHA1(CONCAT(salt, 'password')) AS hash_value
通常,通过在哈希值前加上salt,将salt和哈希密码存储在同一列中

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


每个记录都应该有不同的随机salt。

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

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

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


这就是为什么数据库本身不应该对密码进行哈希处理的原因。首先,您必须根据给定的用户名查找哈希及其salt,然后您可以验证这一行的密码。

MySQL用户密码不使用salt。你确定这些是MySQL用户密码吗?你确定你不想要
SHA1()
?也许我是模棱两可的。我说的不是mysql用户,我说的是在我自己的表中存储密码。如问题中所述,我无法访问phpSalt的Dot help for dictionary攻击,这只是暴力攻击的一种形式。盐确实有助于彩虹攻击。简单地说,salt就是让具有相同密码的帐户仍然具有不同的散列值。请允许我有所不同。据我所知,字典攻击使用/操纵单词进入密码,例如,“secretpass”到“secretpassword”再到“s3cretp4ssw0rd”。然而,Salt会使其成为“secretpassword4:003f93j3fd3”(散列)。SHA1()会比PASSWORD()更好吗?下面的方法行吗?选择密码(CONCAT(salt,'PASSWORD')作为散列_value@trex005是的,那会有用的。PASSWORD()函数似乎与SHA1(UNHEX(SHA1(PASSWORD))相同,前面加了一个额外的星号,以便MySQL知道它的“新”格式。我不会使用
PASSWORD()
,除非他们更改了实现。为MySQL密码保留
PASSWORD()