当" salted"时,SHA512散列会给出不正确的(?)结果。

时间:2017-01-19 14:18:45

标签: java hash salt sha

我想使用salt实现SHA512哈希。我开始here,导致这个mcve:

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()注释掉时,此代码为我提供了与在线哈希生成器完全相同的相同结果(如此{ {3}})。

例如,哈希这个词&#34;无论什么&#34;给出一个散列值ae3d .... 63a。

但是当我用盐操作运行我的代码时;我得到不同的结果(再次与该在线工具进行比较,该工具也允许设置盐字符串。)

我的实施结果是413 ... 623;在线工具说F25 ...... 686。

以何种方式解释&#34;腌制&#34;导致&#34;具体实施&#34;结果如何?

我的代码中是否应该采用不同的方式?

1 个答案:

答案 0 :(得分:3)

盐之前或之后?

设置salt选项时计算器的作用

  

whateversalt

您在代码中正在做什么

  

saltwhatever

从计算器中重新开始

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