对于相同的输入,SHA1在java和javascript中有所不同

时间:2016-06-16 16:07:17

标签: javascript java base64 sha1 mismatch

从javascript和java创建SHA1时遇到问题。问题是两者都不同。它用于验证对Web服务器的客户端请求。这意味着客户端向服务器发送基于64位编码的安全密钥,并且服务器重新生成相同的密钥,并且两者都相同。请在下面找到用于在客户端和服务器中生成密钥的代码。 服务器

MessageDigest mDigest = null;
try {
    mDigest = MessageDigest.getInstance("SHA1");
} catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
}

String input = value1 + value1 + server_key;
byte[] result = mDigest.digest(input.getBytes());
String secret = Base64.encodeToString(result, Base64.NO_WRAP);
...
//comparison logic goes here

...

客户端(java脚本)

var input = value1 + value2 + server_key;
//http://code.google.com/p/crypto-js/
var hash = CryptoJS.SHA1(input);
var encoded  = base64Encode(hash.toString());

//WEB SERVICE INVOCATION FROM JAVASCRIPT GIES HERE.

值value1,value1,server_key将在客户端和服务器中都可用。我们面临的问题是,客户端和服务器中生成的SHA1不匹配。我理解问题是在java中使用getBytes()和javascript使用字符串值来生成SHA1。 CryptoJS.SHA1不支持bytearray作为参数。我们无法更改许多客户端应用程序使用的服务器代码。任何帮助将不胜感激。

在Java中 - >

byte[] result = mDigest.digest(input.getBytes()); 

并在JavaScript中 - >

var hash = CryptoJS.SHA1(input);. 

我相信这是问题所在。在java中,参数是bytearray,输出也是bytearray。但是在javascript中,参数是var(string),return也是var(string)。我还将CryptoJS.SHA1的输出与一些在线SHA1生成工具进行了比较。比较是真的。我不是这方面的专家。如果你能解释得更多,那将会更有帮助。

1 个答案:

答案 0 :(得分:0)

我以另一种方式管理它。我的应用程序是基于cordova的应用程序。因此生成了sha1并使用java和objC对其进行编码,并使用cordova插件调用它。