java - 当 "salted"时,SHA512 哈希给出不正确的(?)结果

标签 java hash salt sha

我想使用盐来实现 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() 行注释掉时,此代码给出的结果与某些在线哈希生成器相同/em> (像这样 one )。

例如,对单词“whatever”进行哈希处理会得到哈希值 ae3d....63a。

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

我的实现结果是 413...623;在线工具显示 F25...686。

有什么解释“加盐”会导致“特定于实现”的结果吗?

我的代码中是否应该做一些不同的事情?

最佳答案

之前加盐还是之后加盐?

设置盐选项时计算器会做什么

whateversalt

你在代码中做了什么

saltwhatever

计算器的结果

随便什么

F2527142C752B05467EE53B44735397F5B4C870DF0F154A0CF3AC23B31CF42EE7E1002D326B57DF60ED4B7449CF101290BDC0BECCB677AAAD846CFBE140DF686

盐随便

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

关于java - 当 "salted"时,SHA512 哈希给出不正确的(?)结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41744028/

相关文章:

Java 泛型 : assignment with nested wildcard parameters

java - 只需要在 Android 中上传 pdf 或任何 doc 类型格式

Perl - 如果您知道值,如何找到散列的键?

php - 我应该使用 urandom 还是 openssl_random_pseudo_bytes?

hash - 可以将用户的盐与密码哈希保存在同一个表中吗?

java - 如何从以编程方式膨胀的布局中访问 View ?

java - 如何最好地现代化2002年代的J2EE应用程序?

algorithm - 以两个值作为键的哈希表

c# - 创建唯一的 URL 安全哈希

mysql - 暴力破解盐的最后一个字符是个好主意吗?