谁能告诉我为什么下面的代码并不总是返回相同的哈希值?据我所知,哈希值可能不同的唯一方法是随机盐,但根据文档,我通过将盐大小设置为 0 来禁用盐。
public static void main(String[] args ) {
char[] password = "test_pass".toCharArray();
String str = encodePassword(password);
System.out.printf(
"Byte digest '%s'\n",
String.valueOf(Hex.encodeHex(Base64.decodeBase64(str)))
);
}
static StandardByteDigester digester = new StandardByteDigester();
{
digester.setAlgorithm("SHA-256");
digester.setIterations(100000);
digester.setSaltSizeBytes(0);
digester.initialize();
}
public static String encodePassword(char[] rawPass) {
return new String(Base64.encodeBase64(digester.digest(toBytes(rawPass))));
}
public static byte[] toBytes(char[] ch) {
Charset charset = Charset.defaultCharset();
ByteBuffer buff = charset.encode(CharBuffer.wrap(ch));
byte[] tmp = new byte[buff.limit()];
buff.get(tmp);
return tmp;
}
最佳答案
您的错误与您在实例初始化 block 而不是静态初始化 block 中初始化静态字段StandardByteDigester digester
有关这样它就不会被调用,因为您永远不会创建类的实例,所以最后它使用默认配置和随机盐。
试试这个:
static {
digester.setAlgorithm("SHA-256");
digester.setIterations(100000);
digester.setSaltSizeBytes(0);
digester.initialize();
}
如果您的方法 encodePassword
使用 String
而不是 char
数组,您的代码可以被简化,因为您可以简单地调用 getBytes (字符集)
如下:
public static String encodePassword(String rawPass) {
return new String(
Base64.encodeBase64(digester.digest(rawPass.getBytes(StandardCharsets.UTF_8))),
StandardCharsets.US_ASCII
);
}
注意:依赖平台的默认字符集不是一个好的做法,因为您的代码将依赖于平台,所以这里因为 base 64 字符都包含在 US_ASCII
,让我们使用这个字符集来解码。
关于java - 没有盐的 sha-256 并不总是返回相同的哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40398664/