我的 Linux 操作系统如何实现如此快速的登录过程?

我的 Linux 操作系统如何实现如此快速的登录过程?

我编写了这个 shell 脚本来测试 sha-516 哈希密码字符串:

myhash='$6$nxIRLUXhRQlj$t29nGt1moX3KcuFZmRwUjdiS9pcLWpqKhAY0Y0bp2pqs3fPrnVAXKKbLfyZcvkkcwcbr2Abc8sBZBXI9UaguU.' #Which is created by mkpasswd for test

i=0
while [[ 1 -eq 1 ]]
do
        testpass=$(mkpasswd -m sha-512 "test")
        i=$[ $i + 1 ]
        if [[ "$testpass" == "$myhash" ]];
                then
                        echo -e "found\n"
                        break
        else
                echo -e "$myhash /= $testpass :-> $i Testing....\n"
        fi

done

运行后216107数字循环测试我从未找到匹配。但是在我的 Linux 操作系统(Ubuntu)系统中,可以如此快速地匹配登录凭据。我的问题是为什么我不能这么快获得相同的结果?

答案1

密码哈希(如您输入的内容myhash)包含一些元数据,指示使用哪个哈希函数以及使用哪些参数,例如成本、盐和哈希函数的输出。在现代 Unix 密码哈希格式中,各部分由以下分隔$

  • 6表示Unix 迭代 SHA-512 方法(与以下内容类似但不相同的设计PBKDF2)。
  • 没有参数,因此成本因子是默认值。
  • nxIRLUXhRQlj是盐。
  • t29nGt1moX3KcuFZmRwUjdiS9pcLWpqKhAY0Y0bp2pqs3fPrnVAXKKbLfyZcvkkcwcbr2Abc8sBZBXI9UaguU.是预期输出。

每次运行时mkpasswd -m sha-512,它都会使用随机盐创建密码哈希。因此,每次运行此命令都会产生不同的输出。

当您输入密码时,系统会计算iterated_sha512(default_cost, "nxIRLUXhRQlj", typed_password)并检查输出是否为"t29nGt1moX3KcuFZmRwUjdiS9pcLWpqKhAY0Y0bp2pqs3fPrnVAXKKbLfyZcvkkcwcbr2Abc8sBZBXI9UaguU.".

您的程序正在执行的操作有所不同:您生成一个随机盐,然后将其与密码哈希函数的输出进行比较myhash。仅当您碰巧生成相同的盐时,这才匹配,其概率可以忽略不计(您的计算机在您的一生中不会两次生成相同的盐)。但您不需要猜测盐:它就在密码哈希中。

推荐阅读:如何安全地散列密码?

答案2

mkpasswd还要求否则它会在您每次运行时为您生成一个。如果您使用解构原始字符串$作为分隔符然后你会看到散列法 6nxIRLUXhRQlj盐。

如果我们在跑步时添加盐mkpasswd,那么您一次性就会得到正确的结果。

$ mkpasswd -m sha-512 "test" "nxIRLUXhRQlj"
$6$nxIRLUXhRQlj$t29nGt1moX3KcuFZmRwUjdiS9pcLWpqKhAY0Y0bp2pqs3fPrnVAXKKbLfyZcvkkcwcbr2Abc8sBZBXI9UaguU.

用一个防止彩虹表攻击因为它在散列密码之前会向密码添加随机部分。

相关内容