/etc/shadow 中的哈希值是如何生成的?

/etc/shadow 中的哈希值是如何生成的?

我正在读维基百科文章在影子文件上,它提到的行的格式如下:

$id$salt$hashed

那么,我的问题是,它是如何工作的?

我尝试计算我有密码的帐户的哈希值,因此我使用了以下命令:

sha512sum {salt} + {my_clear_text_password}

但输出与我看到的哈希值不同。那么它是如何工作的?我遗漏了什么?

答案1

有几件事需要考虑(你必须阅读 Linux coreutils 和 glibc2 中的源代码来确认)

  • sha512sum 的输出似乎是可打印的十六进制表示法,而存储在影子文件中的输出似乎是 base64,因此它们会有所不同。

  • 我认为影子文件中的 sha512sum 已多次通过哈希函数(#define ROUNDS_DEFAULT 5000),而 sha512sum 仅将“文件”通过哈希一次。

  • 可能有一个或两个命令添加了填充来对齐数据,但数据可能会有所不同。

答案2

如果您想以与文件存储相同的方式创建哈希/etc/shadow,请使用以下命令:

mkpasswd --method=sha-512 --salt=YOUR_SALT PASSWORD

答案3

来自shadow(5)手册页

加密密码

參閱墓穴(3)了解有关如何解释该字符串的详细信息。

如果密码字段包含一些无效的字符串墓穴(3)例如!或*,用户将无法使用unix密码登录(但用户可以通过其他方式登录系统)。

此字段可以为空,在这种情况下,无需密码即可以指定的登录名进行身份验证。但是,如果密码字段为空,则读取 /etc/shadow 文件的一些应用程序可能决定根本不允许任何访问。

以感叹号开头的密码字段表示密码已被锁定。该行剩余的字符表示密码被锁定之前的密码字段。

来自crypt(3)手册页

crypt() 是密码加密函数。它基于数据加密标准算法,并带有一些变体,旨在阻止使用硬件实现的密钥搜索(除其他外)。

key 是用户输入的密码。

salt 是从 [a–zA–Z0–9./] 中选择的两个字符串。此字符串用于以 4096 种不同方式之一扰乱算法。

通过取密钥前八个字符的最低 7 位,可获得一个 56 位密钥。此 56 位密钥用于重复加密一个常量字符串(通常是一个全零的字符串)。返回值指向加密的密码,即一系列 13 个可打印的 ASCII 字符(前两个字符代表盐本身)。返回值指向静态数据,其内容每次调用都会被覆盖。

相关内容