针对 FreeBSD /etc/master.passwd 进行验证

Validating against FreeBSD /etc/master.passwd

我正在尝试获取明文密码并将其散列以与存储在 FreeBSD 的 /etc/master.passwd 中的密码散列进行比较。我的目标是让 node.js 程序能够使用现有帐户凭据对 master.passwd 数据库进行身份验证。

我已经建立了一个名为 test1 的 FreeBSD 帐户。我给了它一个密码“password”。查看 master.password,我在密码字段中看到:

$nEIifU2XZ9VDx3l5$RUW0Udy60Hon9OsoTAz8DcH0uvZ4E3p5CXFScrC694EF1Cpkf8/5GUtC750NZXnMFYZsMlBZE52INFlBUvWMb0

我的理解是 $ 字符充当三个字段的分隔符:

  1. 哈希算法(6为SHA512)
  2. 盐,base64编码。
  3. 加盐密码哈希,base64 编码。

我试图像这样在 Node.js 中复制哈希算法:

const crypto = require("crypto");

let passwordPlain = "password"
let salt64 = "nEIifU2XZ9VDx3l5"

let salt = Buffer.from(salt64, "base64"); 
let passwordHashed = crypto.scryptSync(salt, passwordPlain, 64);
let passwordHashed64 = passwordHashed.toString('base64');

console.log(`$${salt64}$${passwordHashed64}`);

我本希望看到我的纯文本密码“password”用盐进行哈希处理并显示以匹配 master.password 中的内容。我得到的是非常不同的。

$nEIifU2XZ9VDx3l5$Y9/0OCikTExQlo0lLp5FVK6DuANVx7BOXZ/spLvTyFvJstUVpJGeanqE+U6Uca63PagSiGNDfMbg35MpTUT/dQ==

我试过在没有 base64 解码的情况下传递盐。我试过将 $ 定界符作为盐的一部分。我什至尝试了 Hmac 而不是 scrypt。没有任何效果。

我开始怀疑它是否不是 base64 编码的。表明它是相当过时的文件,只提到 MD5 散列。此外,我希望在我的 master.passwd 中至少看到一些带有等号的 base64 填充,但我没有。最后,我在 FreeBSD 网站上看到了一个示例,其中显示了一个带点的密码散列,据我所知,这不是 base64 字符集的一部分。 (仅限字母、数字和 + /)

我也在考虑 Node.js scrypt() 与 FreeBSD crypt()。这是我能找到的最接近的东西,当我使用默认密钥长度 64 并删除两个填充字符时,base64 编码长度与 master.passwd 中的长度完美匹配。但是,哈希仍然非常不同。

我希望有人能阐明一些事情,因为我在这方面的互联网搜索技能已经达到极限。

重新搜索页面的链接:

https://www.freebsd.org/doc/handbook/security-intro.html

sha512crypt-node 是基于 SHA512 的 crypt 实现的 NodeJS 实现。以下代码提供了所需的哈希值:

const crypt = require('sha512crypt-node')

const hash = crypt.b64_sha512crypt('password', 'nEIifU2XZ9VDx3l5')
console.log( hash ) // $nEIifU2XZ9VDx3l5$RUW0Udy60Hon9OsoTAz8DcH0uvZ4E3p5CXFScrC694EF1Cpkf8/5GUtC750NZXnMFYZsMlBZE52INFlBUvWMb0

可以找到更多用法示例 here

sha512crypt-node 以及 crypt 的 FreeBSD 实现的 SHA512 部分基于 here, see also [1][2] 描述的算法. 来自 NodeJS 的 crypto.scrypt(或 crypto.scryptSync)基于 scrypt 算法here, see also [3][4]。归根结底,这些是不同的算法,因此无法期望匹配的哈希值。

这篇文章 here 比较了各种算法,包括 scryptcrypt 的 SHA512 部分,您应该会感兴趣,尤其是在安全方面。