使用CryptoJS将Java SHA-1转换为javascript
我有这样一个用Java编写的生成密码的代码使用CryptoJS将Java SHA-1转换为javascript,javascript,java,hash,cryptojs,Javascript,Java,Hash,Cryptojs,我有这样一个用Java编写的生成密码的代码 MessageDigest messageDigestPassword = MessageDigest.getInstance("SHA1"); messageDigestPassword .reset(); byte[] password = "password".getBytes(); messageDigestPassword .update(password); b
MessageDigest messageDigestPassword = MessageDigest.getInstance("SHA1");
messageDigestPassword .reset();
byte[] password = "password".getBytes();
messageDigestPassword .update(password);
byte[] encryptedPassword = messageDigestPassword .digest();
String date = "2019-10-22T11:33:13.393Z";
byte[] dateBytes = date.getBytes(StandardCharsets.UTF_8);
int offset = 0;
byte[] outputBytes = new byte[dateBytes.length + encryptedPassword .length];
System.arraycopy(dateBytes, 0, outputBytes, offset, dateBytes.length);
offset += dateBytes.length;
System.arraycopy(encryptedPassword , 0, outputBytes, offset, encryptedPassword .length);
MessageDigest finalMessageDigeset = MessageDigest.getInstance("SHA-1");
finalMessageDigeset.reset();
finalMessageDigeset.update(outputBytes);
byte[] finalPasswordBytes= finalMessageDigeset .digest();
String finalBase64Password = new String(Base64.encode(finalPasswordBytes));
我正试图将其重写为JavaScript,以便在postman中使用-
到目前为止,我已经:
function wordArrayToByteArray(wordArray, length) {
if (wordArray.hasOwnProperty("sigBytes") &&
wordArray.hasOwnProperty("words")) {
length = wordArray.sigBytes;
wordArray = wordArray.words;
}
var result = [],
bytes,
i = 0;
while (length > 0) {
bytes = wordToByteArray(wordArray[i], Math.min(4, length));
length -= bytes.length;
result.push(bytes);
i++;
}
return [].concat.apply([], result);
}
function stringToBytes ( str ) {
var ch, st, re = [];
for (var i = 0; i < str.length; i++ ) {
ch = str.charCodeAt(i); // get char
st = []; // set up "stack"
do {
st.push( ch & 0xFF ); // push byte to stack
ch = ch >> 8; // shift value down by 1 byte
}
while ( ch );
// add stack contents to result
// done because chars have "wrong" endianness
re = re.concat( st.reverse() );
}
// return an array of bytes
return re;
}
var dateFixed = "2019-10-22T11:33:13.393Z";
var fixedDateBytes = stringToBytes(dateFixed);
var sha1Password= CryptoJS.SHA1("password");
console.log("sha1Password",sha1Password.toString(CryptoJS.enc.Hex));
var sha1PasswordBytes= wordArrayToByteArray(sha1Password, 20);
var concatedBytes= fixedDateBytes.concat(sha1PasswordBytes);
var finalShaPassWords= CryptoJS.SHA1(concatedBytes);
console.log("finalShaPassWords",finalShaPassWords.toString(CryptoJS.enc.Hex));
console.log("finalShaPassWords",finalShaPassWords.toString(CryptoJS.enc.Base64));
函数wordArrayToByteArray(wordArray,长度){
if(wordArray.hasOwnProperty(“sigBytes”)&&
wordArray.hasOwnProperty(“单词”)){
长度=wordArray.sigBytes;
wordArray=wordArray.words;
}
var结果=[],
字节,
i=0;
而(长度>0){
bytes=wordToByteArray(wordArray[i],Math.min(4,长度));
长度-=字节数。长度;
结果推送(字节);
i++;
}
返回[]。concat.apply([],结果);
}
函数stringToBytes(str){
var ch,st,re=[];
对于(变量i=0;i>8;//将值下移1字节
}
while(ch);
//将堆栈内容添加到结果
//之所以这样做是因为字符具有“错误”的endianness
re=re.concat(st.reverse());
}
//返回字节数组
返回re;
}
var dateFixed=“2019-10-22T11:33:13.393Z”;
var fixedDateBytes=stringToBytes(日期固定);
var sha1Password=CryptoJS.SHA1(“密码”);
log(“sha1Password”,sha1Password.toString(CryptoJS.enc.Hex));
var sha1PasswordBytes=wordArrayToByteArray(sha1Password,20);
var concatedBytes=fixedDateBytes.concat(sha1PasswordBytes);
var finalShaPassWords=CryptoJS.SHA1(concatedBytes);
log(“finalShaPassWords”,finalShaPassWords.toString(CryptoJS.enc.Hex));
log(“finalShaPassWords”,finalShaPassWords.toString(CryptoJS.enc.Base64));
然而不幸的是,用这两种语言编写的Base64表示不匹配
我已经检查过,从日期开始的字节是相等的。哈希密码中的字节不可用。因此,在JavaScript中concat失败后进行哈希
我已经检查了第一个密码哈希和生成的字节,它们都是相同的。因此,我的猜测行var sha1PasswordBytes=wordArrayToByteArray(sha1Password,20)代码>导致行var finalShaPassWords=CryptoJS.SHA1(concatedBytes)代码>返回错误的值
有人能告诉我怎么了吗?也许它应该写得不同 因为您使用的是CryptoJS,所以还可以使用和,这大大简化了代码:
var CryptoJS = require("crypto-js");
// Input
var inPwd = "password";
var inDate = "2019-10-22T11:33:13.393Z";
// Processing
var pwdHash = CryptoJS.SHA1(inPwd); // hash and convert to WordArray
var date = CryptoJS.enc.Utf8.parse(inDate); // convert to WordArray
var joinedData = date.clone().concat(pwdHash); // join date and hashed password
var joinedDataHash = CryptoJS.SHA1(joinedData); // hash joined data
var joinedDataHashB64 = CryptoJS.enc.Base64.stringify(joinedDataHash); // convert to Base64 string
// Output
console.log("Result: " + joinedDataHashB64 ); // Output: D235TBTZMfpSyB/CDl5MHAjH5fI=
此代码的输出与Java代码的输出相同:D235TBTZMfpSyB/CDl5MHAjH5fI=