当我使用盐水CRYPT_MD5来加密我的密码时会加密什么?

时间:2010-01-14 14:36:00

标签: php security hash passwords

在字符串上使用md5始终会生成字母数字加密结果,即:无符号。

然而,当我使用php crypt()函数,特别是CRYPT_MD5(并且它已启用,我已经检查过)时,它返回的假定md5哈希看起来不像md5哈希。

例如:

如果我md5字符串'password',我得到:

$pass = md5('password');
echo $pass;
//5f4dcc3b5aa765d61d8327deb882cf99

如果我使用CRYPT_MD5,它由'$ 1 $'前缀表示,'$'后缀表示盐为'salt':

$pass = crypt('password', '$1$salt$');
echo $pass;
//$1$salt$qJH7.N4xYta3aEG/dfqo/0

现在,所使用的算法和盐显示为预期,'$ 1 $'表示使用了CRYPT_MD5,并且盐在$符号之间显示为“盐”。

然而..在最后一个$符号之后的哈希密码看起来不像md5 ......它有斜线和全停止。

为什么这样哈希呢?这不是真正的md5吗?

请问您是否需要我澄清这些内容。啊。

4 个答案:

答案 0 :(得分:10)

  1. MD5是一种不加密的散列算法。
  2. MD5的输出是128位数据。您的第一个示例是将128位编码为32个十六进制数字(每位4位)。第二个例子是地穴字母./0-9A-Za-z - 每个字符6位的21个字符。
  3. 有关crypt算法的更多详细信息,请参阅http://www.gnu.org/software/libtool/manual/libc/crypt.html

答案 1 :(得分:1)

你是对的,5f4dcc3b5aa765d61d8327deb882cf99是字符串“password”的MD5。它没有添加盐,但你可以通过服用MD5(“密码”。“$ salt”)轻松添加一个。

但是,PHP crypt()函数可以使用各种不同的哈希值来计算哈希值。当您使用“$ 1 $”为盐添加前缀时,您将获得带有MD5的哈希值。当你用$ 2 $加前缀时,你会得到一个带有河豚的地穴,这样更安全。

“$ 1 $”以输出为前缀,以便验证散列。如果没有包含,则无法从存储的哈希中知道应该使用哪种算法!这些信息必须存储在其他地方。为了省去这个麻烦,PHP在哈希输出中包含了算法。

因此,为了验证哈希值,您将用户提供的密码作为密码,并将所有内容作为salt获取第三个元素,并且您可以看到获得的结果是否与存储的结果相匹配。

你的困惑的下一部分是MD5()函数给你一个十六进制哈希,而crypt()函数给你一个在Base64编码的哈希。那是因为Base64更有效率。

简单?

答案 2 :(得分:0)

它是一个MD5哈希,没有正确格式化为字符串。不应该给你一个问题。

答案 3 :(得分:-1)

这些是我的想法 - 不确定是否正确。 md5计算哈希值,而crypt执行加密 - 虽然使用md5风格。 散列是单向的,并为任意长度输入提供固定长度的结果。 加密是双向的,不会给出固定长度的结果。

我的猜测是md5哈希rfc可能定义了使用[a-z],[A-Z],[0-9]的结果,而加密没有这样的限制。