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