我正在学习Linux密码安全性(好奇心超过了所有有用的方法),而且我知道实际密码是经过哈希处理并存储在影子密码文件中的。我不确定并且在简短的Google搜寻中找不到的是使用哪种编码来编码哈希值(和盐的值)。它显然不是十六进制,而且显然是文本,不包括:
字符。有人可以告诉我这种编码是什么吗?
编辑:我了解哈希(MD5,SHA-X),盐和哈希说明符。我正在寻找的是将哈希结果(字节数组(byte []))转换为我在文件中看到的字符序列的方法,即:编码。
我正在学习Linux密码安全性(好奇心超过了所有有用的方法),而且我知道实际密码是经过哈希处理并存储在影子密码文件中的。我不确定并且在简短的Google搜寻中找不到的是使用哪种编码来编码哈希值(和盐的值)。它显然不是十六进制,而且显然是文本,不包括:
字符。有人可以告诉我这种编码是什么吗?
编辑:我了解哈希(MD5,SHA-X),盐和哈希说明符。我正在寻找的是将哈希结果(字节数组(byte []))转换为我在文件中看到的字符序列的方法,即:编码。
Answers:
如果只想知道密码的编码方式,则crypt()使用特殊的Base64类型的编码。
Base64编码使用以下字符集:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /
虽然crypt()编码使用以下字符集:./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
另外,与Base64不同,没有“ =”填充。
另一方面,MD5,SHA-X等的crypt()实现不只是生成随机盐,运行哈希函数并使用前一种编码对其进行编码,还可以做更多的事情。
我建议阅读这两篇很棒的文章:“使用MD5-crypt与MD5相关的密码哈希”和“ SHA512-crypt vs MD5-crypt的实现”,以获取更完整的说明。
$之间的哈希的第一部分表示正在使用哪种算法。
请查看http://en.wikipedia.org/wiki/Crypt_%28Unix%29,以获取不同值含义的列表。
您在寻找使用的算法吗?
传统上,Unix和早期Linux变体基于最多8个字符的密码使用弱化的DES。大多数现代Linux安装都使用MD5哈希作为密码,并且一些支持SHA。此外,还出现了对其他算法(包括河豚)的更多模块化支持。大多数Linux使用的GNU libc支持DES,MD5和SHA,为您提供了两种选择。
使用的哈希算法的特定类型被指定为$ DIGIT $作为密码的开头。例如,$ 1 $是MD5。
您可以从Wikipedia(请参阅Crypt_(Unix)上的页面)或google获取有关“ crypt unix”或“ crypt linux”的更多详细信息。