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」導致「實現特定」結果的任何解釋?
有沒有什麼我應該在我的代碼中做不同?
如果您正在尋找密碼哈希,那麼哈希方法不僅僅是簡單地使用一輪哈希。請參閱https://en.wikipedia.org/wiki/Crypt_%28C%29如果您願意,我還有一個可以用於sha256和sha512的Java實現(從頭開始編寫) –