2017-01-19 16 views
2

Я хочу реализовать хеширование SHA512 с использованием соли. Я начал here, ведущий к этому mcve:Хеширование SHA512 дает неправильные результаты (?), Когда «соленый»

import java.security.MessageDigest; 
import org.junit.Test; 

public class Sha512Mcve { 

    private final String ENCODING = "ISO-8859-1"; 

    @Test 
    public void test() { 
     System.out.println(computeHashFor("whatever")); 
    } 

    private String computeHashFor(String toHash) { 
     String salt = "salt"; 
     MessageDigest md; 
     try { 
      md = MessageDigest.getInstance("SHA-512"); 
//   md.update(salt.getBytes(ENCODING)); 
      byte[] bytes = md.digest(toHash.getBytes(ENCODING)); 

      return toUnixRepresentation(salt, bytes); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

    private String toUnixRepresentation(String salt, byte[] bytes) { 
     StringBuilder sb = new StringBuilder(); 
     sb.append("$6$"); 
     sb.append(salt); 
     sb.append("$"); 

     for (int i = 0; i < bytes.length; i++) { 
      int c = bytes[i] & 0xFF; 
      if (c < 16) sb.append("0"); 
      sb.append(Integer.toHexString(c)); 
     } 
     return sb.toString(); 
    } 
} 

вещи: когда я выхожу из линии md.update() закомментирована, этот код дает мне точные же результатов как некоторые онлайн хэш-генераторы (как этот one) ,

Например, хеширования слово «все» дает значение хеш-функции ae3d .... 63а.

Но когда я запускаю свой код с этой солью; Я получаю разные результаты (опять же по сравнению с этим онлайн-инструментом, который также позволяет установить солонку).

Результаты моей реализации 413 ... 623; онлайн-инструмент говорит F25 ... 686.

Любое объяснение, каким образом «соления» приводит к «реализации конкретных» результатов?

Есть ли что-то, что я должен делать по-другому в своем коде?

+0

Если вы ищете хэш-код пароля, то метод хэширования не просто использует один раунд хэширования. Пожалуйста, обратитесь к https://en.wikipedia.org/wiki/Crypt_%28C%29 Также, если вы хотите, у меня есть работающая реализация Java для этого hasing для sha256 и sha512 (написанная с нуля) –

ответ

2

Соль до или после?

Что калькулятор делает, когда вы установите параметр соли

whateversalt

Что вы делаете в вашем коде

saltwhatever

resutls из калькулятор

whateversalt

F2527142C752B05467EE53B44735397F5B4C870DF0F154A0CF3AC23B31CF42EE7E1002D326B57DF60ED4B7449CF101290BDC0BECCB677AAAD846CFBE140DF686 

saltwhatever

41333B9BAFC14CB3D1106D72A5D461F348B9EA1304A82989E00E5FC2D3239339492FCA12ED5EBF5F6802955C95B5F7ADA4CA035A911C2F29ABE905C3923CF623 

Поэтому, чтобы соответствовать расчет вы просто должны изменить порядок и добавить соль последнего

 md.update(toHash.getBytes(ENCODING)); 
     byte[] bytes = md.digest(salt.getBytes(ENCODING)); 

Или даже

 md.update(toHash.getBytes(ENCODING)); 
     md.update(salt.getBytes(ENCODING)); 
     byte[] bytes = md.digest();