【问题标题】:sha-256 without salt not always returning the same hash没有盐的 sha-256 并不总是返回相同的哈希
【发布时间】:2017-03-16 20:53:14
【问题描述】:

谁能告诉我为什么下面的代码并不总是返回相同的哈希值? AFAIK 哈希可能不同的唯一方法是由于随机盐,但根据文档,我通过将盐大小设置为 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;    
}

【问题讨论】:

  • 您使用的是哪个版本的 jasypt?

标签: java encryption sha256 sha jasypt


【解决方案1】:

您的错误与以下事实有关因为你从不创建你的类的实例,所以最后它使用默认配置和随机盐。

试试这个:

static {
    digester.setAlgorithm("SHA-256");
    digester.setIterations(100000);
    digester.setSaltSizeBytes(0);
    digester.initialize();
}

如果您的方法 encodePassword 采用 String 而不是 char 数组,则您的代码可以简化,因为您可以简单地调用 getBytes(Charset) 作为下一个:

public static String encodePassword(String rawPass) {
    return new String(
        Base64.encodeBase64(digester.digest(rawPass.getBytes(StandardCharsets.UTF_8))),
        StandardCharsets.US_ASCII
    );
}

注意: 依赖平台的默认字符集不是一个好习惯,因为您的代码将依赖于平台,所以这里US_ASCII 中包含所有基本 64 个字符,让我们使用它要解码的字符集。

【讨论】:

    猜你喜欢
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 2023-03-18
    • 2012-05-20
    • 2014-08-01
    • 2013-01-09
    • 2016-01-08
    相关资源
    最近更新 更多