Python MD5、SHA512 (+salt) 加密问题

6 投票
3 回答
5687 浏览
提问于 2025-04-16 15:06

我想了解Linux是如何在/etc/shadow文件中加密我们的密码的,所以我创建了一个新的虚拟用户'test'来做一些测试:

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

操作系统在/etc/shadow文件中为我生成了以下这一行,使用的是SHA512加密系统($6$):newuser:$6$Ii4CGbr7$IOua8/oPV79Yp.BwzpxlSHjmCvRfTomZ.bhEvjZV2x5qhrvk82lZVrEtWQQej2pOWMdN7hvKwNgvCXKFQm5CB/:15069:0:99999:7:::

现在,我从Python中取出SHA512模块并尝试这个:

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

这给我的结果是以下这个哈希值:c73156daca3e31125ce457f1343201cc8a26400b2974440af2cc72687922b48b6631d21c186796ea2756ad987a996d2b261fe9ff3af4cc81e14c3029eac5df55

如你所见,这个哈希值和/etc/shadow文件中的那个不同,我不知道为什么,因为我使用的是相同的盐值和密码来生成哈希。
有没有人能帮我解释一下为什么会这样?

还有,为什么/etc/shadow文件生成的哈希中会有一些点(.)呢?
谢谢

3 个回答

2

我也遇到了同样的问题,因为我看到的所有资料都让我相信可以用我写的那种方式来获取结果。

我通过使用盐值和密码,利用 crypt.crypt() 方法成功找到了密码。

import crypt
crypt.crypt(password, salt)

盐值: $6$Ii4CGbr7
密码: usrpw123

虽然这并不是用 hashlib 库,但它确实有效。

6

有一种算法可以用来生成存储在 /etc/shadow 文件中的密码哈希值。

想了解更多,可以查看这个文档:
http://www.akkadia.org/drepper/SHA-crypt.txt

这里有一个用 Python 实现的例子:
http://packages.python.org/passlib/lib/passlib.hash.sha512_crypt.html

6

/etc/shadow 文件里的字段并不是你想的那样构建或理解的。你可以查看一下手册页来获取更多细节,但最明显的区别是,它对盐值和哈希值使用了一种不常见的 base64 编码。

撰写回答