gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:11:58 26 4
gpt4 key购买 nike

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

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

$6$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(`$6$${salt64}$${passwordHashed64}`);

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

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

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

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

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

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

重新搜索页面的链接:

https://stackoverflow.com/questions/34810547/what-is-freebsd-md5-and-why-does-it-produce-hashes-in-non-hexadecimal-notation?r=SearchResults&s=1|51.4889

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 ) // $6$nEIifU2XZ9VDx3l5$RUW0Udy60Hon9OsoTAz8DcH0uvZ4E3p5CXFScrC694EF1Cpkf8/5GUtC750NZXnMFYZsMlBZE52INFlBUvWMb0

可以找到更多用法示例 here .

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

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

关于node.js - 针对 FreeBSD/etc/master.passwd 进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63334116/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com