6

我试图了解 Linux 如何在 etc/shadow 文件上加密我们的密码,所以我没有新的虚拟“测试”用户进行一些测试:

用户: newuser
密码: usrpw123
生成的盐: Ii4CGbr7

因此,操作系统使用 SHA512 加密系统 ($6$) 在 etc/shadow 文件中生成以下行: newuser:$6$Ii4CGbr7$IOua8/oPV79Yp.BwzpxlSHjmCvRfTomZ.bhEvjZV2x5qhrvk82lZVrEtWQQej2pOWMdN7hvKwNgvCXKFQm5999/:157::::::

现在,我从 python 中获取 SHA512 模块并尝试以下操作:

import hashlib
m = hashlib.sha512()
m.update('Ii4CGbr7'+'usrpw123')
print m.hexdigest

结果,这给了我以下哈希: c73156daca3e31125ce457f1343201cc8a26400b2974440af2cc72687922b48b6631d21c186796ea2756ad987a996d2b261fe9ff3af4cc81e14c3029eac5df55

如您所见,它与 /etc/shadow 文件中的另一个不同,我不知道为什么我使用相同的 salt+密码来生成哈希。
有人可以帮我解释一下为什么会发生这种情况吗?

另外,为什么 /etc/shadow 文件会生成带有一些点 (.) 的散列?
谢谢

4

3 回答 3

6

/etc/shadow 中的字段不是按照您认为的方式构建或解释的。您需要阅读手册页了解详细信息,但最明显的区别是它对 salt 和 hash 都使用了不寻常的 base64 编码。

于 2011-04-05T08:43:17.650 回答
6

在 /etc/shadow 中有一个生成密码哈希的算法。

有关说明,请参阅此文档:
http ://www.akkadia.org/drepper/SHA-crypt.txt

在 python 中有一个实现:
http ://packages.python.org/passlib/lib/passlib.hash.sha512_crypt.html

于 2011-04-05T08:47:50.283 回答
2

我陷入了同样的陷阱,因为我读到的所有内容都让我相信你可以用你写的同样的方式检索结果。

我能够通过使用盐和密码来确定密码 crypt.crypt()

import crypt
crypt.crypt(password, salt)

盐:$6$Ii4CGbr7 密码:usrpw123

不完全使用 hashlib 库,但它可以工作。

于 2014-01-14T07:34:14.670 回答