我现在知道这个密码是密码+salt,用对应的 hash 算法算出来的,
现在我用 python 来重现这个过程(使用 hashlib ),出来的结果只有 digest 和 hexdigest 两种,
这两个一个是 bytes 数据,一个是 hex 数据,和 shadow 文件里的字符串都不同。
那么,shadow 文件中的密码字符串是用 hex 数据或者 bytes 数据重新编码的吗?具体是什么编码方式呢?
https://gist.github.com/lifetyper/e0936e4634aa2bc838839edc48551f4d
如果格式为”$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 才是真正的密码部分。
你说的这些部分我都知道,现在的关键是 hashed 部分,到底是什么格式编码的字符串?
举个最简单的例子,我们一般看到的 md5 hash 都是 hex string 格式的,但 shadow 文件里的明显是不 hex string
例如假定密码是 mypassword,盐是 mysalt,那么用 openssl 生成的 shadow 密码如下:
openssl passwd -1 -salt mysalt mypassword
$1$mysalt$JyKGOJR1343sJ7N91hXVI/
但用 hashlib 生成的 md5 hexdigest 如下:
399b1141e55e53a9df428ed4585ca3e9
这两个数据如何转换呢?
你给的链接已经是较好的答案了,直接使用 crypt 即可。
不想用?那就自己实现吧。我帮你找到了 glibc 的实现。
https://code.woboq.org/userspace/glibc/crypt/crypt-entry.c.html#__crypt_r
https://serverfault.com/questions/88284/how-is-a-password-hash-encoded-in-the-shadow-password-file
找了个 bash 实现的
https://www.vidarholen.net/contents/junk/files/sha512crypt.bash
感谢,看来 crypt 是用了自己的编码方式。
哇!