2016-12-14 5 views
1

Я конвертирую некоторые C# в Java. C# является:Хэш массива байтов в Java

// Return a SHA256 hash of a string, formatted in hex 
private static string HashPassword(string password) 
{ 
    SHA256Managed hash = new SHA256Managed(); 
    byte[] utf8 = UTF8Encoding.UTF8.GetBytes(password); 
    return BytesToHex(hash.ComputeHash(utf8)); 
} 

В Java я заменил SHA256Managed с MessageDigest:

private static String HashPassword(String password) 
{ 
    MessageDigest hash = MessageDigest.getInstance("SHA-256"); 
    byte[] utf8 = hash.digest(password.getBytes(StandardCharsets.UTF_8)); 

    return BytesToHex(hash.ComputeHash(utf8)); // ComputeHash? 
} 

но MessageDigest не ComputeHash() и я не вижу его эквивалент. MessageDigest правильный класс для использования здесь? Если да, то что мне делать для ComputeHash(). Если не какой класс я использую?

Отметьте, что BytesToHex Преобразует массив байтов в шестнадцатеричную строку.

+2

Вы читали Javadoc для 'MessageDigest'? Метод финализации хэша - 'digest()' для хэша, вычисленного в нескольких сегментах, или 'digest (byte [])' для односегментного вычисления (или в качестве конечного сегмента многосегментного хэша). –

+0

Я читал, но не внимательно. Виноват. –

ответ

4

MessageDigest Состояние с сохранением состояния. Вы передаете данные на него пошагово и вызываете digest(), чтобы вычислить хэш по всем данным, когда вы закончите.

Метод, который вы вызываете, является по существу сокращением для hash.update(byte[]), затем hash.digest().

Вызов digest() также сбрасывает экземпляр MessageDigest в исходное состояние.

3

В вашей Java переменная utf8 содержит ваш вычисленный хеш в отличие от C#. Чтобы соответствовать способу C# выглядит она должна быть:

byte[] utf8 = password.getBytes(StandardCharsets.UTF_8); 

return bytesToHex(hash.digest(utf8)); 

Side Примечание: Пожалуйста, уважайте стандарты кодирования Java относительно lowerCamelCased имен методов.

Смежные вопросы