sha1 java哈希错误的结果

时间:2015-02-18 18:05:34

标签: java hash sha1

我想用Java哈希文字,“()_ | \ \} {] [?/>。<,〜`”,哈希后我得到了“82101f0ba1cb0fd017e5b670b7475a95c831d016”,但预计“ef89e75ce03a4fd9df7f9283d332d9a7f01fe09f”。我一直在寻找谷歌上的哈希来测试,而且这个版本几乎在网页上很常见。我希望始终使用UTF-8 enter image description here

public abstract class PasswordHasher {

protected String algorithm;
protected MessageDigest md;

protected PasswordHasher(String algorithm) {
    try {
        md = MessageDigest.getInstance(algorithm);
    } catch (NoSuchAlgorithmException e) {
        System.err.println("Operacja nieprzewidziana");
        throw new Error();
    }
    this.algorithm = algorithm;
}

public String getAlgorithm() { return algorithm; }

public String hashText(String text) {
    StringBuilder sb = new StringBuilder();

    try {
        md.update(text.getBytes("UTF8"));
    } catch (Exception e) {
        System.err.println("Null pointer or UTF8 does not exists");
        return null;
    }

    byte byteData[] = md.digest();

    for(byte b : byteData)
        sb.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));

    return sb.toString();
} }

public class PasswordHasherSHA1 extends PasswordHasher {

public PasswordHasherSHA1() {
    super("SHA1");
} }

3 个答案:

答案 0 :(得分:1)

是否可以使用Apache commons-codec?总是更好地使用构建良好的库来做这种事情。

如果你可以使用commons-codec,那么为一个字符串生成SHA1哈希只需要一行。

String sha1hash = DigestUtils.sha1Hex("()_ |\}{][?/>.<,~`");

此外 - 您需要注意字符串中的'\'字符 - 它可能会被视为转义序列。

答案 1 :(得分:0)

首先你的字节到HexString很奇怪:

使用这个(可能没有更快):

private static final char[] CRYPTOCHARS = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

public static String byteArrayToHexString(final byte... args)
{
    final char[] chars = new char[args.length * 2];
    for (int i = 0; i < args.length; i++)
    {
        chars[i * 2] = CRYPTOCHARS[(args[i] >> 4) & 0xF];
        chars[i * 2 + 1] = CRYPTOCHARS[(args[i]) & 0xF];
    }
    return new String(chars);
}

或现有的图书馆。

你应该在使用之后/之前重置md。

无论是什么字符集,我都会得到82101f0ba1cb0fd017e5b670b7475a95c831d016。 你如何获得其他价值?一些登录库最多可以加密密码10000次。

或者单元测试错了吗?

答案 2 :(得分:0)

您的测试数据错误或您对实际真实哈希的假设不正确:

$ echo -n '()_ |\}{][?/>.<,~`' | sha1sum -
82101f0ba1cb0fd017e5b670b7475a95c831d016  -

有两个反斜杠:

$ echo -n '()_ |\\}{][?/>.<,~`' | sha1sum -
ef89e75ce03a4fd9df7f9283d332d9a7f01fe09f  -