编辑:我的问题已更新,请查看这篇文章的底部以了解最新一期。我把剩下的留给那些想阅读整个故事的人:)
我一直致力于将一个小型 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 的人能够理解:)
- 如果有人知道,我正在寻找哪些节点功能来使其正常工作?我可以使用内置加密模块来完成此操作还是需要其他模块?
最后,在您说“只需实现特定于节点的哈希算法”(这将是更简单的选择)之前,我不能这样做,因为这是要在已经包含这些哈希密码并且由其他现有的 Java 应用程序也是如此。目前无法更改其他应用程序或数据库。
UPDATE:我得到了一个非常有帮助的答案,现在我在 Node.js 代码中得到了这个:
hashPassword = function(password, salt){
crypto.pbkdf2(password, new Buffer(salt), 1000, 24, 'sha1', function(err, key){
}
}
这就是我再次陷入困境的地方。我无法从密钥中获取我需要的字符串值。我用谷歌搜索了一下,发现String.format
Java代码中的行将BigInteger转换为十六进制整数,但我似乎无法获得正确的值。
- 我简单地尝试过
key.toString('hex')
但这没有用。
- 我找到了这个节点大整数模块,并尝试过
BigInteger.fromBuffer(1, key).toString(24)
以及随之而来的一些变化,但它仍然给我带来了与 Java 应用程序截然不同的结果。
任何有关如何从缓冲区获取正确字符串值的帮助将非常感激。
Update2:我终于让我的应用程序工作了,因为事实证明它是一个输出错误哈希值的外部模块。正确实现加密模块可以修复它。