我正在学习Linux密码安全性(比任何有用的更好奇),我知道真正的密码被散列并存储在影子密码文件中。 我不确定的,在我简短的谷歌search中找不到的是用什么编码来编码哈希值(以及盐的值)。 显然不是hex,显然是文本,不包括:
字符。 任何人都可以告诉我这是什么编码?
编辑:我明白哈希(MD5,SHA-X),盐和哈希说明符。 我正在寻找的是将散列结果(一个字节数组(byte []))转换为我在文件中看到的字符序列(即:编码)的方法。
在MD5 crypt()的情况下,salt只是一个从[a-zA-Z0-9./]起最多8个字符的随机string。
然后将salt和密码散列在一起,通过加强函数,然后使用Base64上的变体进行编码:
$之间的散列的第一部分指示正在使用什么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”。