Как я могу скопировать javascript sha256 га sh в Java и получить тот же выход Hex? - PullRequest
2 голосов
/ 05 марта 2020

Мне нужно скопировать javascript sha256 га sh в java в моем приложении Groovy / java.

В версии javascript используется функция ha sh, включенная в angular, и я не могу ее контролировать. Учитывая одинаковые входные строки, мне нужно предоставить одинаковый шестнадцатеричный вывод.

В java, я использую https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/digest/DigestUtils.html

В java:

DigestUtils.sha256(cx2 + username):

дает мне что-то, что печатается как:

[- 114, -15, 57, -56, 81, 37, -95, 119, 102, 81, 63, 99, -3, -56, -116, -110, -114, -16, -18, 117, 118, 49, -120, 14, 68, 30, -37, 20, -70, -17 , -19, -88]

В сценарии java:

var s1 = Sha256.hash(cx2 + username)

дает мне строку байтов (тип Javascript скажет, что это строка), что-то, что печатается как показано ниже (не уверен, что это за кодировка):

ñ9ÈQ% ¡wfQ? cýÈðîuv1DÛºïí¨

Если я конвертирую обе строки байтов в Hex, я получаю одинаковый результат как в java и javascript:

console.log Sha256.toHexStrfromByteStr(s1)
// 478972ab3380187060494987ac7c597ac92decdac1c04dd1dcab8184995ec01b

Это было бы так, за исключением того, что код javascript делает секунду га sh, объединяя байтовую строку с другой строкой:

var s2 = Sha256.hash(cx1 + s1)

Когда Я пытаюсь повторить второй ха sh в Java, я получаю очень разные выходные данные (после преобразования обоих выходов в него x).

def s2 = DigestUtils.sha256(cx1 + s1)

Есть ли шаг, который я пропускаю?

import org.apache.commons.codec.digest.DigestUtils

String cx2 =  'Potato'
String cx1 = 'Bread'

def s1 = DigestUtils.sha256(cx2 + 'username')  
def s2 = DigestUtils.sha256Hex(cx1 + s1)

println s2

Javascript

var s1 = Sha256.hash(cx2 + 'username');
var s2 = Sha256.hash(cx1 + s1);

console.log (Sha256.toHexStrfromByteStr(s2))

Спасибо миллион!

1 Ответ

1 голос
/ 06 марта 2020

Делая

def s1 = DigestUtils.sha256(cx2 + 'username')

результат s1 имеет тип byte[]. Затем, выполнив

def s2 = DigestUtils.sha256Hex(cx1 + s1)

, вы объедините результат от <byte []>.toString() до cx1.

Вместо этого вы должны:

a) преобразовать s1 в "normal" String - new String(s1) - и concat двух строк, или
b) преобразование cx1 в byte[] и concat двух массивов.

...