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

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

我正在学习 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()的哈希函数实现(例如MD5SHA-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”。

相关内容