Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CryptoJS将Java SHA-1转换为javascript_Javascript_Java_Hash_Cryptojs - Fatal编程技术网

使用CryptoJS将Java SHA-1转换为javascript

使用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

我有这样一个用Java编写的生成密码的代码

        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=