簡體   English   中英

對於相同的輸入,SHA1在Java和javascript中有所不同

[英]SHA1 varies in java and javascript for same input

從javascript和java創建SHA1時遇到問題。 問題是不同的。 它用於驗證對Web服務器的客戶端請求。 這意味着客戶端向服務器發送一個基於base64編碼的安全密鑰,並且服務器重新生成相同的密鑰並等同於兩者相同。 請在下面找到用於在客戶端和服務器中生成密鑰的代碼。 服務器

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不支持字節數組作為參數。 我們無法更改服務器代碼,因為許多客戶端應用程序都在使用它。 任何幫助都感激不盡。

在Java中->

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

並在JavaScript中->

var hash = CryptoJS.SHA1(input);. 

我相信這是問題所在。 在Java中,參數是字節數組,輸出也是字節數組。 但是在javascript中,參數是var(字符串),返回值也是var(字符串)。 我還比較了CryptoJS.SHA1和一些在線SHA1生成工具的輸出。 比較是正確的。 我不是這方面的專家。 如果您能解釋得更多,將會更有幫助。

我設法用另一種方式來做。 我的應用程序是基於cordova的應用程序。 因此生成了sha1並從java和objC對其進行了編碼,並使用cordova插件對其進行了調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM