2016-01-26 3 views
0

Нам нужна строка hash, использующая SHA-256.SHA-256 хэш возвращает разные результаты

Это код, у меня есть:

public String getSHA256HashedString(String clearString) { 
    String _LOC = "[SB_UtilityBean: getSHA256HashedString]"; 

    try { 
     MessageDigest md = MessageDigest.getInstance("SHA-256"); 
     md.update(clearString.getBytes()); 

     String _encrypted = bytesToHex(md.digest()); 
     System.out.println(_LOC + "1.0 " + " Result 1: " + _encrypted); 
     System.out.println(_LOC + "1.0 " + " Result 2: " + bytesToHex(md.digest())); 

     return _encrypted; 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } 
} 

private static String bytesToHex(byte[] bytes) { 
    String _LOC = "[SB_UtilityBean: bytesToHex]"; 

    StringBuffer result = new StringBuffer(); 
    for (byte byt : bytes) result.append(Integer.toString((byt & 0xff) + 0x100, 16).substring(1)); 

    return result.toString(); 
} 

Если bytesToHex(md.digest()) присваивается переменной _encrypted и сделать печать линии _encrypted, я получаю результат 1:

9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

Если я делаю линию печати bytesToHex(md.digest()), я получаю результат 2:

e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

ответ

6

Это, как ожидается. documentation говорит (курсив мой):

public byte[] digest()

Завершает хэш вычислений путем выполнения заключительных операций, таких как заполнение. Сборник сбрасывается после выполнения этого вызова.

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

+0

@AndrewMedico я вижу. Итак, Результат 1 - правильный хешированный? – bittersour

+2

@ bittersour Да. Второй хэш ('e3b ... 855') является суммой SHA256 пустого буфера. – duskwuff

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