/etc/shadow 中的密码字符串是经过什么编码的吗?

2019-04-18 15:26:38 +08:00
 leavic
我现在知道这个密码是密码+salt,用对应的 hash 算法算出来的,

现在我用 python 来重现这个过程(使用 hashlib ),出来的结果只有 digest 和 hexdigest 两种,
这两个一个是 bytes 数据,一个是 hex 数据,和 shadow 文件里的字符串都不同。

那么,shadow 文件中的密码字符串是用 hex 数据或者 bytes 数据重新编码的吗?具体是什么编码方式呢?

https://gist.github.com/lifetyper/e0936e4634aa2bc838839edc48551f4d

其实我的问题类似这个:
https://stackoverflow.com/questions/53416164/md5-hash-in-python

但是我想知道如果不用 crypt 模块能不能实现。
4378 次点击
所在节点    Linux
9 条回复
unclewang81
2019-04-18 15:50:57 +08:00
如果格式为”$id$salt$hashed ”,则表示该用户密码正常。其中$id$的 id 表示密码的加密算法,$1$表示使用 MD5 算法,$2a$表示使用 Blowfish 算法,”$2y$”是另一算法长度的 Blowfish,”$5$”表示 SHA-256 算法,而”$6$”表示 SHA-512 算法,
目前基本上都使用 sha-512 算法的,但无论是 md5 还是 sha-256 都仍然支持。$salt$是加密时使用的 salt,hashed 才是真正的密码部分。
leavic
2019-04-18 15:52:34 +08:00
@unclewang81 你说的这些部分我都知道,现在的关键是 hashed 部分,到底是什么格式编码的字符串?
leavic
2019-04-18 15:54:02 +08:00
@unclewang81 举个最简单的例子,我们一般看到的 md5 hash 都是 hex string 格式的,但 shadow 文件里的明显是不 hex string
leavic
2019-04-18 15:57:08 +08:00
例如假定密码是 mypassword,盐是 mysalt,那么用 openssl 生成的 shadow 密码如下:

openssl passwd -1 -salt mysalt mypassword
$1$mysalt$JyKGOJR1343sJ7N91hXVI/

但用 hashlib 生成的 md5 hexdigest 如下:
399b1141e55e53a9df428ed4585ca3e9

这两个数据如何转换呢?
ysc3839
2019-04-18 17:47:59 +08:00
你给的链接已经是较好的答案了,直接使用 crypt 即可。
不想用?那就自己实现吧。我帮你找到了 glibc 的实现。
https://code.woboq.org/userspace/glibc/crypt/crypt-entry.c.html#__crypt_r
joesonw
2019-04-18 18:17:16 +08:00
mikeguan
2019-04-18 18:20:20 +08:00
leavic
2019-04-19 09:25:32 +08:00
@joesonw 感谢,看来 crypt 是用了自己的编码方式。
xyjincan
2019-11-06 10:44:15 +08:00
哇!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/556432

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX