2016-06-16 7 views
0

Облицовка проблемы при создании SHA1 из javascript и java. Проблема в том, что они разные. Он используется для проверки запроса клиента на веб-сервер. Это означает, что клиент отправляет закодированный ключ безопасности на основе 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 

...

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. 

Значения 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, а output также является bytearray. Но в javascript параметр var (string), а return также var (string). Я также сравнивал вывод CryptoJS.SHA1 с некоторыми инструментами генерации SHA1 в Интернете. Сравнение верно. Я не эксперт в этой области. Если вы можете объяснить больше, это будет более полезно.

+0

Это может помочь: http://stackoverflow.com/questions/4895523/java-string-to-sha1. Javascript sha1 и sha1 одной строки в командной строке «echo -n» value1value2server_key «| openssl sha1» соответствуют. –

+0

Ссылка, которую вы указали, объясняет проблему в коде Java. Но для меня я хорошо разбираюсь в Java-коде. Я сталкиваюсь с проблемой с кодом Javascript. – user867662

+0

В javascript-коде hash.toString() равно sha1, сгенерированному в командной строке, с использованием метода «openssl sha1» выше. Ваш метод Java не подходит, потому что результаты из javascript и командной строки находятся в шестнадцатеричном формате. В приведенной ссылке дается простое решение. –

ответ

0

Мне удалось это сделать по-другому. Мое приложение - приложение на основе кордовы. Так что сгенерировал sha1 и закодировал его из java и objC и вызвал его с помощью плагинов cordova.