【发布时间】:2016-03-31 11:03:39
【问题描述】:
编辑:我的问题已更新,请查看这篇文章的底部以获取最新问题。我把剩下的留给想要阅读整个故事的人:)
我一直致力于将一个小型 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 一无所知,所以我很难让它工作可能是因为我很难掌握这个方法中发生的事情,并在谷歌上搜索使用的各种函数给出了相互矛盾的答案,而且大多只是显示其他人也很难相处。
所以实际上我要问三个问题:
- 这是否可以在 Node.js 中复制,或者 Java 是否使用 Node 中不存在的功能?
- 有更多 Java 经验的人能否解释一下这段代码中的各行,以及每一行的作用?最好以某种方式让具有良好 Node.js 经验(和一些 PHP)但从未使用过 Java 的人能够理解:)
- 如果有人知道,我正在寻找哪些 Node 函数来使其正常工作?我可以使用内置的加密模块吗?还是需要额外的模块?
最后,在您说“只实现特定于节点的哈希算法”(这将是更简单的选择)之前,我不能这样做,因为这将用于已经包含这些哈希密码的现有数据库,并且也被其他现有的 Java 应用程序使用。更改其他应用程序或数据库目前不是一种选择。
更新:我得到了一个非常有帮助的答案,现在我在我的 Node.js 代码中得到了这个:
hashPassword = function(password, salt){
crypto.pbkdf2(password, new Buffer(salt), 1000, 24, 'sha1', function(err, key){
}
}
这就是我再次陷入困境的地方。我无法从键中获取我需要的字符串值。我搜索了一下,发现 Java 代码中的 String.format 行将 BigInteger 转换为十六进制整数,但我似乎无法获得正确的值。
- 我只是简单地尝试了
key.toString('hex'),但没有奏效。 - 我找到了这个 node-biginteger 模块,并尝试了
BigInteger.fromBuffer(1, key).toString(24)和一些变体,但它仍然给我一个与 Java 应用程序截然不同的结果。
非常感谢任何有关如何从缓冲区中获取正确字符串值的帮助。
Update2:我终于让我的应用程序正常工作了,因为它是一个输出错误哈希值的外部模块。实施加密模块正确修复它。
【问题讨论】:
标签: javascript java node.js hash pbkdf2