影子密码文件中的密码哈希是如何编码的?

C. *_*oss 11 security linux password

我正在学习 Linux 密码安全性(比任何有用的东西都更令人好奇),并且我知道真正的密码被散列并存储在影子密码文件中。我不确定并且在我的简短谷歌搜索中无法找到的是用于对散列值(以及盐的值)进行编码的编码。它显然不是十六进制,它显然是文本,不包括:字符。这里有人能告诉我那个编码是什么吗?

编辑:我了解散列(MD5、SHA-X)、盐和散列说明符。我正在寻找的是将哈希结果(字节数组(byte []))转换为我在文件中看到的字符序列的方法,即:编码。

Sim*_*onJ 11

在 MD5 crypt() 的情况下,salt 只是来自 [a-zA-Z0-9./] 的最多 8 个字符的随机字符串。

然后将盐和密码散列在一起,通过强化函数,然后使用 Base64 上的变体进行编码:

  • 将 MD5 状态(128 位)打乱并分成 6 组,每组包含 3 个字节(最后一组包括 2 个字节的零填充)
  • 每组 3 个字节然后被分成 4 个 6 位的块
  • 最后,每个 6 位组被映射到 [a-zA-Z0-9./] 范围内的一个字符


小智 9

如果您只想知道密码是如何编码的,crypt() 使用特殊的 Base64 类型的编码。

Base64 编码使用以下字符集:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

虽然crypt() 编码使用这个字符集:./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

此外,与 Base64 不同,没有“=”填充。

另一方面,MD5、SHA-X 等的 crypt() 实现不仅仅是生成随机盐,运行散列函数并使用前一种编码对其进行编码。

我建议阅读这两篇很棒的文章:“与 MD5 相关的 MD5-crypt 密码哈希”“SHA512-crypt 与 MD5-crypt 的实现”,以获得更完整的解释。