2017-01-19 74 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) 。

例如,散列單詞「whatever」給出散列值ae3d .... 63a。

但是,當我運行我的代碼與鹽操作;我得到不同的結果(再次與該在線工具進行比較,該工具也允許設置鹽串)。

我的執行結果爲413 ... 623;在線工具說F25 ... 686。

以何種方式「salting」導致「實現特定」結果的任何解釋?

有沒有什麼我應該在我的代碼中做不同?

+0

如果您正在尋找密碼哈希,那麼哈希方法不僅僅是簡單地使用一輪哈希。請參閱https://en.wikipedia.org/wiki/Crypt_%28C%29如果您願意,我還有一個可以用於sha256和sha512的Java實現(從頭開始編寫) –

回答

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();