如何在密码文件中编码密码哈希?

我正在学习Linux密码安全性(比任何有用的更好奇),我知道真正的密码被散列并存储在影子密码文件中。 我不确定的,在我简短的谷歌search中找不到的是用什么编码来编码哈希值(以及盐的值)。 显然不是hex,显然是文本,不包括:字符。 任何人都可以告诉我这是什么编码?

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

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

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

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

$之间的散列的第一部分指示正在使用什么algorithm。

查看http://en.wikipedia.org/wiki/Crypt_%28Unix%29了解不同值的含义。

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

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

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

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

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

我build议阅读以下两篇文章: “MD5密码与MD5相关的密码散列”和“SHA512-crypt与MD5-crypt的实现” ,以获得更完整的解释。

你在寻找使用的algorithm吗?

传统上,Unix和早期的Linux变体使用基于最多8个字符的密码的减弱的DES。 大多数现代Linux安装使用MD5散列作为密码,并且一些支持SHA。 此外,更多的模块支持其他algorithm已经出现,包括Blowfish。 大多数Linux使用的GNU libc支持DES,MD5和SHA,给你一些select。

所使用的哈希algorithm的具体types被指定为密码的开始,作为$ DIGIT $。 例如,$ 1 $是MD5。

您可以从维基百科获取更多深入的信息(请参阅Crypt_(Unix)上的页面)或Google的“crypt unix”或“crypt linux”。