代码之家  ›  专栏  ›  技术社区  ›  Evernoob

当我使用salted crypt_md5加密我的密码时,加密的是什么?

  •  4
  • Evernoob  · 技术社区  · 15 年前

    对字符串使用MD5总是会产生字母数字加密的结果,即:没有符号。

    但是,当我使用php crypt()函数时,特别是crypt_md5(它是打开的,我已经检查过)使用salt时,它返回的假定MD5哈希看起来不像MD5哈希。

    例如:

    如果我md5字符串“password”,我会得到:

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

    如果我使用crypt_md5,它由前缀“$1$”和后缀“$”表示,其中salt为“salt”:

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

    现在,使用的算法和salt如预期所示,$1$表示使用了crypt_md5,salt在$符号之间显示为“salt”。

    然而。。最后一个$符号之后的哈希密码看起来不像MD5…它有斜线和句号。

    为什么要这样散列?这不是真正的MD5吗?

    请你问我是否需要澄清这些。呃。

    4 回复  |  直到 15 年前
        1
  •  10
  •   Douglas Leeder    15 年前
    1. MD5是一种哈希算法,而不是加密。
    2. MD5的输出是128位数据。第一个示例是将128位编码为32个十六进制数字(每个数字4位)。第二个例子是在crypt字母表中,/0-9a-za-z-21个字符,每个字符6位。

    有关密码算法的更多详细信息,请参阅 http://www.gnu.org/software/libtool/manual/libc/crypt.html

        2
  •  1
  •   vy32    15 年前

    正确,5f4dcc3b5aa765d61d8327deb882cf99是字符串“password”的MD5。它没有添加盐,但您可以通过使用MD5(“密码”)轻松添加盐。“盐”

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

    在输出前面加上“$1$”以便可以验证哈希。如果没有包含,就无法从存储的哈希中知道应该使用哪种算法!这些信息必须存储在别处。为了避免这个问题,php在散列输出中包含了算法。

    因此,为了验证哈希,您将用户提供的密码作为密码,并将第三个dollarsign之前的所有内容作为salt,然后查看得到的结果是否与存储的结果匹配。

    混淆的下一部分是md5()函数给您一个十六进制散列,而crypt()函数给您一个用base64编码的散列。这是因为base64更高效。

    简单吗?

        3
  •  0
  •   gamers2000    15 年前

    它是一个MD5哈希,只是格式不正确。不应该给你一个问题。

        4
  •  -1
  •   Tim    15 年前

    这些是我的想法-不确定是否正确。 MD5计算哈希,而Crypt执行加密——尽管使用MD5风格。 哈希是单向的,对于任意长度的输入给出固定长度的结果。 加密是双向的,不会产生固定长度的结果。

    我猜想MD5哈希RFC可能定义了使用[A-Z]、[A-Z]、[0-9]的结果,而加密没有这样的限制。