我需要加密一个字符串。初始版本是用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重写它。
我尝试了多种方法来解决它。但是我仍然无法获得相同的结果。
答案 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();
}
}
}