Crypto.js SHA1与MessageDigest Java SHA1:为什么结果不同?

时间:2019-05-31 08:18:43

标签: javascript java

我需要加密一个字符串。初始版本是用Java编写的,但现在需要用javascript重写。但是我有不同的结果。 这是java中的代码:


Java版本:

private static String getEncrypt(String input, String salt) throws NoSuchAlgorithmException {
        byte[] raw_salt = Base64.getDecoder().decode(salt);
        byte[] raw_data = input.getBytes(StandardCharsets.UTF_8);
        byte[] test_data = new byte[raw_salt.length + raw_data.length];
        MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
        System.arraycopy(raw_salt, 0, test_data, 0, raw_salt.length);
        System.arraycopy(raw_data, 0, test_data, raw_salt.length, raw_data.length);
        mdTemp.update(test_data);
        byte[] bytes = mdTemp.digest();
        return new String(Base64.getEncoder().encode(bytes));
    }
input: 123456789
salt: pMm6kWsoWjR18sWKnoG4Az==
output: 6u/VAXS9ZKmLEbHw/OZ1AVarth4=

JS版本:(使用crypto.js)

const crypto = require("crypto");

function getEncrypt(input, salt){
   const sha1 = crypto.createHash('sha1');
   const beforeCrypto = salt + input;
   const afterCrypto = sha1.update(beforeCrypto).digest('base64');
   return afterCrypto;
}

input: 123456789
salt: pMm6kWsoWjR18sWKnoG4Az==
output: ie/3j+92nxvcNT5i+3WUJbWsEAg=

java中的MessageDigest方法要求我以byte[]格式输入输入。在使用javascript时,我使用·string·类型输入。 他们还使用salt使加密更加安全,但是它带来了更多不同,我无法用javascript重写它。 我尝试了多种方法来解决它。但是我仍然无法获得相同的结果。

1 个答案:

答案 0 :(得分:1)

以下代码段也为我提供了正确答案:

98O8HYCOBHMq32eZZczDTKeuNEE=

您的代码中必须有一些不同的细节。 我做的一件事是使用UTF8标准字符集,以避免与指定“ utf-8”和“ UTF8”等方式有关的任何麻烦。

您的代码无法编译(例如,缺少getEncrypt的返回类型),因此可能还有其他不同之处。

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

public class Main {

  private static String getEncrypt(String input) throws NoSuchAlgorithmException {
    byte[] raw_data = input.getBytes(StandardCharsets.UTF_8);
    MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
    mdTemp.update(raw_data);
    byte[] bytes = mdTemp.digest();
    return new String(Base64.getEncoder().encode(bytes));
  }

  public static void main(String[] args){

    try {
      System.out.println(getEncrypt("123456789"));
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    }

  }

}