2016-06-16 23 views
0

Mit einem Problem beim Erstellen von SHA1 aus JavaScript und Java konfrontiert. Das Problem ist, dass beide anders sind. Es wird verwendet, um die Client-Anfrage an den Webserver zu validieren. Das bedeutet, dass der Client einen based64-codierten Sicherheitsschlüssel an den Server sendet und der Server den gleichen Schlüssel neu generiert und beide gleich sind. Nachfolgend finden Sie einen Code zum Generieren von geheimen Schlüsseln in Client und Server. ServerSHA1 variiert in Java und Javascript für die gleiche Eingabe

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 

...

Client (Java Script)

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. 

Die Werte value1, value1, server_key wird in Client und Server zur Verfügung stehen. Das Problem, dem wir gegenüberstehen, ist, dass der SHA1, der in Client und Server generiert wird, nicht übereinstimmt. Ich verstehe, dass das Problem in Java ist, das getBytes() und in Javascript verwendet, das Zeichenfolgenwert für das Erzeugen von SHA1 verwendet. Das CryptoJS.SHA1 unterstützt Bytearray als Parameter nicht. Wir können den Servercode nicht ändern, wie er von vielen Client-Anwendungen verwendet wird. Jede Hilfe wird sehr geschätzt.

In Java ->

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

und in JavaScript ->

var hash = CryptoJS.SHA1(input);. 

Ich Glaube das ist das Problem. In Java ist der Parameter ein Bytearray und Ausgabe ist auch ein Bytearray. Aber in Javascript ist der Parameter var (string) und return ist auch var (string). Ich habe auch die Ausgabe von CryptoJS.SHA1 mit einigen Online-SHA1-Generierungstools verglichen. Der Vergleich ist wahr. Ich bin kein Experte in diesem Bereich. Wenn Sie mehr erklären können, wird es hilfreicher sein.

+0

Dies kann helfen: http://stackoverflow.com/questions/4895523/java-string-to-sha1. Das Javascript sha1 und das sha1 derselben Zeichenfolge in der Befehlszeile "echo -n" value1value2server_key "| openssl sha1" stimmen überein. –

+0

Der Link, den Sie angegeben haben, erklärt das Problem in Java-Code. Aber ich bin gut mit Java-Code. Ich habe Probleme mit Javascript-Code. – user867662

+0

In dem JavaScript-Code entspricht der Wert von hash.toString() dem sha1, der in der Befehlszeile mit der obigen Methode "openssl sha1" generiert wurde. Ihre Java-Methode stimmt nicht überein, da die Ergebnisse von JavaScript und der Befehlszeile in hex stehen. Eine einfache Lösung ist in dem angegebenen Link angegeben. –

Antwort

0

Ich schaffte es auf andere Weise. Meine Anwendung ist eine cordova-basierte Anwendung. So erzeugte das sha1 und codierte es von Java und ObjC und rief es mit Cordova-Plugins an.

Verwandte Themen