![影子密码文件中的密码哈希是如何编码的?](https://linux22.com/image/499756/%E5%BD%B1%E5%AD%90%E5%AF%86%E7%A0%81%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%AF%86%E7%A0%81%E5%93%88%E5%B8%8C%E6%98%AF%E5%A6%82%E4%BD%95%E7%BC%96%E7%A0%81%E7%9A%84%EF%BC%9F.png)
我正在学习 Linux 密码安全(好奇心比任何有用的知识都多),我知道真正的密码是经过哈希处理的并存储在影子密码文件中。我不确定,而且在简短的谷歌搜索中也没有找到,用于对哈希值(以及盐值)进行编码的编码是什么。它显然不是十六进制,而且显然是文本,不包括字符:
。这里有人能告诉我那个编码是什么吗?
编辑:我了解哈希(MD5、SHA-X)、盐和哈希说明符。我正在寻找将哈希结果(字节数组(byte[]))转换为我在文件中看到的字符序列的方法,即:编码。
答案1
对于 MD5 crypt() 来说,盐只是一个来自 [a-zA-Z0-9./] 的最多 8 个字符的随机字符串。
然后将盐和密码一起进行哈希处理,通过强化函数,然后使用 Base64 的变体进行编码:
- MD5 状态(128 位)被打乱并分成 6 组,每组包含 3 个字节(最后一组包含 2 个字节的零填充)
- 每组 3 个字节被分成 4 个块,每个块 6 位
- 最后,每个 6 位组映射到 [a-zA-Z0-9./] 范围内的字符
答案2
如果你只想知道密码是如何编码的,crypt()
可以使用以下变体Base64
编码。
Base64
编码具有以下字符集:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
然而crypt()
编码字符集如下:
./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
crypt()
编码也不使用=
字符在末尾进行填充,与Base64
编码。
此外,crypt()
的哈希函数实现(例如MD5
)SHA-1
除了生成随机盐、执行哈希函数以及使用前一个字符集对结果摘要进行编码之外,还有其他步骤。
我建议你阅读以下两篇精彩的文章:“使用 MD5-crypt 对密码进行哈希处理,与 MD5 相关”和“SHA512-crypt 与 MD5-crypt 的实现”,以获得更完整的解释。
答案3
$ 之间的哈希值的第一部分表示正在使用的算法。
查看http://en.wikipedia.org/wiki/Crypt_%28Unix%29了解不同值的含义的列表。
答案4
您正在寻找所使用的算法吗?
传统上,Unix 和早期的 Linux 变体使用基于最多 8 个字符的密码的弱化 DES。大多数现代 Linux 安装使用 MD5 哈希作为密码,有些支持 SHA。此外,还出现了对其他算法的更多模块化支持,包括 Blowfish。大多数 Linux 使用的 GNU libc 支持 DES、MD5 和 SHA,为您提供了几个选项。
具体使用的哈希算法类型以密码开头的$DIGIT$来指定。例如$1$就是MD5。
您可以从维基百科获取更多详细信息(请参阅Crypt_(Unix)) 或谷歌搜索“crypt unix”或“crypt linux”。