【问题标题】:Converting Java Encryption to Javascript with NodeJs Crypto使用 NodeJs Crypto 将 Java 加密转换为 Javascript
【发布时间】:2021-05-11 05:25:29
【问题描述】:

我有一个像下面这样加密密码的 Java 代码。我尝试将其转换为 Javascript,但出现错误:

错误 [ERR_CRYPTO_HASH_FINALIZED]:摘要已调用

我发现了一些类似的问题和答案说;将 hash.update() 放入你的 for 但结果会与 Java 不同。

我该如何解决这个问题?如何在 Javascript 中使用 Java 获得相同的结果? :/

Java

public String encryptNew(String password, String salt) throws IOException, NoSuchAlgorithmException {
    byte[] saltBytes = base64ToByte(salt);
    byte[] encryptedBytes = getHash(password, saltBytes);
    String result = byteToBase64(encryptedBytes);
    return result;
}

private byte[] getHash(String password, byte[] salt) throws NoSuchAlgorithmException,                 
UnsupportedEncodingException {
    MessageDigest digest = MessageDigest.getInstance("SHA-512");
    digest.reset();
    digest.update(salt);
    byte[] input = digest.digest(password.getBytes("UTF-8"));
    for (int i = 0; i < 1000; i++) {
        digest.reset();
        input = digest.digest(input);
    }
    return input;
}

我的 JavaScript

const pass = '12344321';
const salt = 'X9geKit5sd0=';
// 1. ToByte
const saltBytes = Buffer.from(salt, 'base64');
console.log('Salt:', saltBytes);
// 2. Hash
let hash = crypto.createHash('sha512');
hash.update(saltBytes);
var input = new TextEncoder();
input.encode(pass);
for (let i = 0; i < 1000; i++) {
  input = hash.digest(input);
}
// 3. ToBase64
const result = Buffer.from(input).toString('base64');
console.log('Result:', result);

【问题讨论】:

    标签: javascript java node.js hash


    【解决方案1】:

    node.js 中Hash 对象的方法签名与Java 中的MessageDigest 完全不同。您只能通过update 向其中输入数据。由于没有reset,所以每次都需要使用一个新的Hash 实例。

    这是产生预期结果的完整代码:

    let crypto = require('crypto');
    
    const pass = '12344321';
    const salt = 'X9geKit5sd0=';
    // 1. ToByte
    const saltBytes = Buffer.from(salt, 'base64');
    
    // 2. Hash
    let hash = crypto.createHash('sha512');
    hash.update(saltBytes);
    hash.update(Buffer.from(pass, 'utf8'));
    let input = hash.digest();
    for (let i = 0; i < 1000; i++) {
      hash = crypto.createHash('sha512');
      hash.update(input);
      input = hash.digest();
    }
    // 3. ToBase64
    const result = Buffer.from(input).toString('base64');
    console.log('Result:', result);
    

    请记住,这会快速散列您的密码,而盐仅用于第一次迭代。最好使用已建立的密码散列方法,例如 Argon2、scrypt、bcrypt 或 PBKDF2,工作系数较高。

    【讨论】:

      猜你喜欢
      • 2016-07-11
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多