如何找到用于散列密码的散列算法?

Dor*_*tan 11 hashsum passwd

我有工作密码并且可以看到哈希值 (/etc/passwd)。如何找到用于散列密码的散列算法,而无需手动尝试不同的算法,直到找到匹配项?

Ste*_*itt 28

这记录在crypt(3)的联机帮助页中,您可以通过 shadow(5)的联机帮助页passwd(5). 这些链接适用于基于 Linux 的现代系统;那里的描述是:

如果salt是一个以字符“$ id $”开头的字符串,后跟一个可选地以“$”结尾的字符串,则结果具有以下形式:

$id$salt$encrypted
Run Code Online (Sandbox Code Playgroud)

id标识使用的加密方法而不是 DES,然后它确定如何解释密码字符串的其余部分。支持以下 id 值:

ID  | Method
?????????????????????????????????????????????????????????
1   | MD5
2a  | Blowfish (not in mainline glibc; added in some
    | Linux distributions)
5   | SHA-256 (since glibc 2.7)
6   | SHA-512 (since glibc 2.7)
Run Code Online (Sandbox Code Playgroud)

河豚,也被称为bcrypt,也被确定前缀22b2x,和2y(见PassLib的文档)。

因此,如果以上述格式存储散列密码,则可以通过查看id找到使用的算法;否则它crypt是默认的 DES 算法(带有 13 个字符的散列),或“big”crypt的 DES(扩展为支持 128 个字符的密码,散列长度最多为 178 个字符),或 BSDI 扩展的 DES(带有_前缀)后跟一个 19 个字符的哈希值)。

一些发行版使用libxcrypt,它支持并记录了更多方法:

  • y: 是加密
  • gy: gost-yescrypt
  • 7: 加密
  • sha1: sha1crypt
  • md5: SunMD5

其他平台支持其他算法,因此请查看crypt那里的联机帮助页。例如,OpenBSDcrypt(3)只支持 Blowfish,它使用id “2b”来标识

  • 基于 DES 的密码总是 13 个字符长,由字母数字字符以及 `.` 和 `/` 组成。前 2 个字符是盐,其他 11 个字符是哈希值(排序)。它是 `crypt` 支持的唯一一种算法,它非常弱,您无法通过选择更强的密码来弥补它。 (2认同)