当 "salted" 时,SHA512 哈希给出不正确的 (?) 结果
SHA512 hashing gives incorrect (?) results when "salted"
我想使用盐实现 SHA512 哈希。我开始 ,导致这个 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("$");
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()
注释掉时,这段代码给我的结果与某些 在线哈希生成器 相同 =33=](像这样one)。
例如,对单词 "whatever" 进行散列运算得到散列值 ae3d....63a.
但是当我 运行 我的代码使用那个 salt 操作时;我得到 不同的 结果(再次与该在线工具进行比较,该工具也允许设置盐字符串)。
我的实施结果是 413...623;在线工具说 F25...686.
任何解释 "salting" 导致 "implementation specific" 结果的方式?
我的代码中是否应该做一些不同的事情?
盐之前还是之后?
设置加盐选项时计算器的作用
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();
我想使用盐实现 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("$");
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()
注释掉时,这段代码给我的结果与某些 在线哈希生成器 相同 =33=](像这样one)。
例如,对单词 "whatever" 进行散列运算得到散列值 ae3d....63a.
但是当我 运行 我的代码使用那个 salt 操作时;我得到 不同的 结果(再次与该在线工具进行比较,该工具也允许设置盐字符串)。
我的实施结果是 413...623;在线工具说 F25...686.
任何解释 "salting" 导致 "implementation specific" 结果的方式?
我的代码中是否应该做一些不同的事情?
盐之前还是之后?
设置加盐选项时计算器的作用
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();