我编写了这个 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
。仅当您碰巧生成相同的盐时,这才匹配,其概率可以忽略不计(您的计算机在您的一生中不会两次生成相同的盐)。但您不需要猜测盐:它就在密码哈希中。
推荐阅读:如何安全地散列密码?