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


11

我正在学习Linux密码安全性(好奇心超过了所有有用的方法),而且我知道实际密码是经过哈希处理并存储在影子密码文件中的。我不确定并且在简短的Google搜寻中找不到的是使用哪种编码来编码哈希值(和盐的值)。它显然不是十六进制,而且显然是文本,不包括:字符。有人可以告诉我这种编码是什么吗?

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


您的问题与此问题
Broam

Answers:


11

对于MD5 crypt(),盐仅是[a-zA-Z0-9./]中最多8个字符的随机字符串。

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

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

8

如果只想知道密码的编码方式,则crypt()使用特殊的Base64类型的编码。

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

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

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

另一方面,MD5,SHA-X等的crypt()实现不只是生成随机盐,运行哈希函数并使用前一种编码对其进行编码,还可以做更多的事情。

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



2

您在寻找使用的算法吗?

传统上,Unix和早期Linux变体基于最多8个字符的密码使用弱化的DES。大多数现代Linux安装都使用MD5哈希作为密码,并且一些支持SHA。此外,还出现了对其他算法(包括河豚)的更多模块化支持。大多数Linux使用的GNU libc支持DES,MD5和SHA,为您提供了两种选择。

使用的哈希算法的特定类型被指定为$ DIGIT $作为密码的开头。例如,$ 1 $是MD5。

您可以从Wikipedia(请参阅Crypt_(Unix)上的页面)或google获取有关“ crypt unix”或“ crypt linux”的更多详细信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.