针对 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
我的理解是 $ 字符充当三个字段的分隔符:
- 哈希算法(6为SHA512)
- 盐,base64编码。
- 加盐密码哈希,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 中的长度完美匹配。但是,哈希仍然非常不同。
我希望有人能阐明一些事情,因为我在这方面的互联网搜索技能已经达到极限。
重新搜索页面的链接:
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 比较了各种算法,包括 scrypt 和 crypt 的 SHA512 部分,您应该会感兴趣,尤其是在安全方面。
我正在尝试获取明文密码并将其散列以与存储在 FreeBSD 的 /etc/master.passwd 中的密码散列进行比较。我的目标是让 node.js 程序能够使用现有帐户凭据对 master.passwd 数据库进行身份验证。
我已经建立了一个名为 test1 的 FreeBSD 帐户。我给了它一个密码“password”。查看 master.password,我在密码字段中看到:
$nEIifU2XZ9VDx3l5$RUW0Udy60Hon9OsoTAz8DcH0uvZ4E3p5CXFScrC694EF1Cpkf8/5GUtC750NZXnMFYZsMlBZE52INFlBUvWMb0
我的理解是 $ 字符充当三个字段的分隔符:
- 哈希算法(6为SHA512)
- 盐,base64编码。
- 加盐密码哈希,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 中的长度完美匹配。但是,哈希仍然非常不同。
我希望有人能阐明一些事情,因为我在这方面的互联网搜索技能已经达到极限。
重新搜索页面的链接:
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 比较了各种算法,包括 scrypt 和 crypt 的 SHA512 部分,您应该会感兴趣,尤其是在安全方面。