2016-06-16 13 views
0

javascriptとjavaからSHA1を作成する際に問題が発生しました。問題はどちらも異なっています。これは、Webサーバーへのクライアント要求の検証に使用されます。つまり、クライアントは64ビットの暗号化されたセキュリティキーをサーバーに送信し、サーバーは同じキーを再生成し、両方が同じであることを意味します。クライアントとサーバーで秘密鍵を生成するためのコードを以下で見つけてください。 サーバーSHA1はjavaとjavascriptで同じ入力になります

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 

は...

クライアント(ジャバスクリプト)

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()を使用し、SHA1を生成するためにJavaScriptを使用して文字列値を使用することです。 CryptoJS.SHA1はbytearrayをパラメータとしてサポートしていません。多くのクライアントアプリケーションで使用されているように、サーバーコードを変更することはできません。どんな助けでも大歓迎です。 Javaでは

- >

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

とJavaScriptで - >

var hash = CryptoJS.SHA1(input);. 

Iの信念これが問題です。 javaでは、パラメータはbytearrayであり、出力もbytearrayです。しかし、javascriptでは、パラメータはvar(string)で、戻り値はvar(string)です。また、CryptoJS.SHA1の出力といくつかのオンラインSHA1生成ツールを比較しました。比較は真です。私はこの分野の専門家ではない。あなたがもっと説明できるなら、もっと役に立つでしょう。

+0

これは役立つかもしれません:http://stackoverflow.com/questions/4895523/java-string-to-sha1コマンドライン "echo -n" value1value2server_key "| openssl sha1"で、同じ文字列のjavascript sha1とsha1が一致します。 –

+0

あなたが与えたリンクは、Javaコードの問題について説明しています。しかし、私にとってはJavaコードがうまくいきます。私はJavascriptコードの問題に直面しています。 – user867662

+0

javascriptコードでは、hash.toString()は上記の "openssl sha1"メソッドを使用してコマンドラインで生成されたsha1と同じです。 javascriptとコマンドラインからの結果が16進数であるため、Javaメソッドが一致しません。提供されるリンクには簡単な解決策があります。 –

答えて

0

私は別の方法でそれを管理しました。私のアプリケーションはコードベースのアプリケーションです。こうしてsha1が生成され、javaとobjCからコード化され、cordovaプラグインを使用して呼び出されました。

関連する問題