在 Node.js 中复制 Java 密码哈希代码 (PBKDF2WithHmacSHA1)

2023-12-10

编辑:我的问题已更新,请查看这篇文章的底部以了解最新一期。我把剩下的留给那些想阅读整个故事的人:)

我一直致力于将一个小型 Java 应用程序转换为 Node.js,大部分进展顺利。我必须查找大量 Java 函数来弄清楚它们的作用以及如何在 Node 中复制它们的行为(因为我几乎没有任何 Java 经验),但我现在已经可以使用大部分功能了。

不幸的是,有一点我似乎无法开始工作。它是一种用于生成密码哈希的方法,使用一组 Node.js 中似乎不存在的高级 Java 特定函数。我已经尝试了两天来让它工作,但我就是无法得到我想要的结果。

这是原始的Java代码:

public static String hashPassword(final String password, final String salt) throws NoSuchAlgorithmException, InvalidKeySpecException {
    final char[] passwordChars = password.toCharArray();
    final byte[] saltBytes = salt.getBytes();
    final PBEKeySpec spec = new PBEKeySpec(passwordChars, saltBytes, 1000, 192);
    final SecretKeyFactory key = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    final byte[] hashedPassword = key.generateSecret(spec).getEncoded();
    return String.format("%x", new BigInteger(hashedPassword));
}

注意:盐是一个固定值,不是随机的。我知道这不应该是这样,但这就是应用程序的设置方式。因此,由于 Java 代码总是得到相同的结果,因此在 Node 中也应该可以得到相同的结果。

我尝试过使用crypto.pbkdf2,使用各种看似相似的密​​码,但这一切都给了我与 Java 代码不同的结果。所以我想我会在这里问,看看是否有人知道如何做到这一点,或者对如何解决这个问题有任何建议。

请注意(正如我所说)我对 Java 一无所知,所以我让它工作的困难可能来自于这样一个事实:我很难掌握这个方法中发生的事情,也很难在谷歌上搜索所使用的各种函数给出了相互矛盾的答案,而且大多只是表明其他人也很难接受他们的答案。

所以我实际上要问三个问题:

  1. 这是否可以在 Node.js 中复制,或者 Java 是否使用 Node 中不存在的功能?
  2. 有更多 Java 经验的人可以解释一下这段代码中的各行以及每一行的作用吗?最好是具有相当水平的 Node.js 经验(和一些 PHP)但从未使用过 Java 的人能够理解:)
  3. 如果有人知道,我正在寻找哪些节点功能来使其正常工作?我可以使用内置加密模块来完成此操作还是需要其他模块?

最后,在您说“只需实现特定于节点的哈希算法”(这将是更简单的选择)之前,我不能这样做,因为这是要在已经包含这些哈希密码并且由其他现有的 Java 应用程序也是如此。目前无法更改其他应用程序或数据库。

UPDATE:我得到了一个非常有帮助的答案,现在我在 Node.js 代码中得到了这个:

hashPassword = function(password, salt){
    crypto.pbkdf2(password, new Buffer(salt), 1000, 24, 'sha1', function(err, key){

    }
}

这就是我再次陷入困境的地方。我无法从密钥中获取我需要的字符串值。我用谷歌搜索了一下,发现String.formatJava代码中的行将BigInteger转换为十六进制整数,但我似乎无法获得正确的值。

  • 我简单地尝试过key.toString('hex')但这没有用。
  • 我找到了这个节点大整数模块,并尝试过BigInteger.fromBuffer(1, key).toString(24)以及随之而来的一些变化,但它仍然给我带来了与 Java 应用程序截然不同的结果。

任何有关如何从缓冲区获取正确字符串值的帮助将非常感激。

Update2:我终于让我的应用程序工作了,因为事实证明它是一个输出错误哈希值的外部模块。正确实现加密模块可以修复它。


这些参数生成相同的缓冲区:

crypto.pbkdf2('test', 'salt', 1000, 24, 'sha1', function(err, key) {});

剩下的就是以相同的方式格式化字符串。这可能有点问题,因为BigInteger已签名,因此您也应该考虑签名。

您可以使用以下方法执行此操作bn.js:

function format(key) {
  if (key[0] >>> 7 === 0) {
    return key.toString('hex');
  }

  return '-' + new BN(key.toString('hex'), 16).notn(192).add(new BN(1)).toString(16);
}

bn.js 不会将前导位解释为符号,因此您必须先检查它,然后根据二进制补码表示。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Node.js 中复制 Java 密码哈希代码 (PBKDF2WithHmacSHA1) 的相关文章

随机推荐

  • 链接选择框 jquery php

    i found thisphp mysql jquery 三个链接选择框的插件 这适用于以下方法 选择框一可见 选择任意后optiononload selectbox 2 并选择任意之后option加载最后一个选择框 3 现在我的问题是 选
  • SwiftUI Inspector 消失在项目中

    在我的 Xcode 项目之一中 SwiftUI 检查器将不再显示 Example 当我创建一个新项目时 我有检查员 知道是什么原因造成的吗 我可以重置项目的设置吗 您必须打开 Canvas 才能在编辑器中包含 SwiftUI 上下文菜单项
  • Windows 窗体 DataGridView 中的折叠式

    我需要在 Windows 窗体 DataGridView 中实现某种手风琴效果 当用户选择一行时 该行将展开以显示更多信息 如果可能的话 还显示一些按钮或其他控件 问题是 我完全不知道如何做到这一点 我尝试在网络上搜索 但没有找到任何可以引
  • ImageField image_width 和 image_height 自动填充现有数据库?

    我有一个现有的数据库表ImageField已经有一堆现有的注册表 我想添加image width and image height在我的模型上 但我需要一些东西来自动填充现有的表格 class ItemImage models Model
  • 滚动时粘性导航栏?

    我目前正在为自己构建一个网站 我发现在多个网站上都有这种非常棒的效果 其中导航栏位于图像下方 但当您滚动经过它时 它会粘在顶部 Example 我怎样才能实现这个目标 另外 如何才能达到类似的效果该网站具有类似的导航栏样式 这是 Matth
  • 为什么设置断点可以让我的代码工作?

    我很新C所以我确信我做错了很多事情 但这让我感到困惑 我的代码应该从用户那里获取标题 并在路由目录中创建一个具有该名称的文件夹 仅当我在上面设置断点时它才有效makeFolder 执行 由于某种原因 在我点击之前稍作休息continue让它
  • Perl + POO 和 Mysql 错误

    我刚刚学了 poo 我开始使用 perl 实现了这一点 但我没有得到预期的输出 mysql 有问题吗 还是坏代码 另外 相同的查询在控制台和工作台上运行 并且此模块添加 chmod x module pm usr bin perl use
  • 如何从外部链接导航到 Bootstrap 4 的特定选项卡

    我想从外部页面链接打开 bootstrap 4 的特定选项卡 第 1 页 nav html 我想从这一页转到第二页 a href index html tab 1 tab 1 a a href index html tab 2 tab 2
  • 调整 QWidget 大小时忽略最小尺寸

    有没有办法让 QWidget 及其任何子类 完全忽略其最小大小 我想要的是 QPushButton 在尺寸太小时时被切断 而不是阻止窗口调整大小 默认行为 您可以使用 button setSizePolicy QSizePolicy Ign
  • 使用 selenium python 使用复合类解析 HTML 内容

    我的 GUI 中有一个显示按钮 用于显示连接状态 带有绿色勾号的按钮表示已建立连接 带有红色叉号的按钮表示没有连接 我必须使用我的代码检查状态 我正在解析该特定标题栏类名 容器流体 的内容 由此 我正在解析该显示按钮的显式内容 elem d
  • 如何从 SQLite 数据库中检索用户位置特定范围内的一组位置

    我有一些位置坐标存储在我的SQLite数据库表 我想检索距用户当前位置 1 公里范围内的位置 现在我正在从数据库中获取所有值 并编写了一个方法来检索我范围内的值 这给我带来了巨大的开销 因为我的表可能包含超过 1000 个坐标 所以我正在寻
  • EF 6:另一个复杂类型中的嵌套复杂类型

    假设我有一个名为 car 的实体 我使用复杂类型来定义 引擎 部分 TableName T CAR public sealed class Car IEngine public EngineType EngineType get set C
  • 使用 Angular js 进行应用程序设计

    一直致力于使用 Angular JS 构建一个巨大的应用程序 在同一主题上看到了太多关于如何最好地设计应用程序的问题 但仍然感到困惑 一个基本的应用程序通常有一个 1 登录页面 索引页面 2 主页 带页眉和页脚 身体是partial com
  • 将两个数据框导出为一个 Excel 文件,并在指定位置的 pandas 中包含两张表

    我有两个数据框 如下所示 df1 Date t factor plan plan score 0 2020 02 01 5 NaN 0 1 2020 02 02 23 NaN 0 2 2020 02 03 14 start 0 3 2020
  • Javascript如何获取所选项目的ID

    我正在使用 Web2Py 将值列表发送到我的视图 我的 HTML 是这样的
  • Excel VBA 计算另一张工作表中的公式

    已解决 问题出在我的公式中 我使用 INDIRECT 引用单元格 当工作表不同时 该单元格不起作用 查看答案 我在一张纸上有一个公式 我想要做的是使用另一张纸上的公式 使用 eval 来评估该公式 然而 结果并不如预期 该公式似乎使用工作表
  • 使用 Chrome 查找 JavaScript 内存泄漏

    我创建了一个非常简单的测试用例 它创建一个 Backbone 视图 将处理程序附加到事件 并实例化一个用户定义的类 我相信 通过单击此示例中的 删除 按钮 所有内容都会被清理 并且不会出现内存泄漏 代码的 jsfiddle 在这里 http
  • 使用单例进行单元测试

    我已经使用 Visual Studio Team Edition 测试框架准备了一些自动测试 我希望其中一项测试按照程序中完成的正常方式连接到数据库 string r providerName ConfigurationManager Co
  • Delphi 字典和排序数据

    我的代码是 procedure TfrmSettings btnFillDictClick Sender TObject var Dict TDictionary
  • 在 Node.js 中复制 Java 密码哈希代码 (PBKDF2WithHmacSHA1)

    编辑 我的问题已更新 请查看这篇文章的底部以了解最新一期 我把剩下的留给那些想阅读整个故事的人 我一直致力于将一个小型 Java 应用程序转换为 Node js 大部分进展顺利 我必须查找大量 Java 函数来弄清楚它们的作用以及如何在 N