我正在使用以下代码对传入的字符串进行哈希处理,期望多次应用于该方法的同一事物总是会得到相同的结果。该方案将用于密码散列和以后的验证。但它似乎不起作用 - 我为同一个输入字符串得到了两个不同的 blob。我的代码有什么错误或缺失吗?
public synchronized String encrypt(String token) {
try {
MessageDigest sha = MessageDigest.getInstance("SHA");
sha.reset();
sha.update(token.getBytes("UTF-8"));
byte[] raw = sha.digest();
System.out.println("raw = " + raw.toString());
String hash = Base64.encodeBase64(raw).toString();
return hash;
} catch (Exception e) {
}
return token;
}
最佳答案
你没有真正提供足够的信息,但我怀疑你被这个分散了注意力:
System.out.println("raw = " + raw.toString());
这将打印出类似 [B@30a4effe
的内容,它与字节数组中的数据没有有关。您应该改为打印出 hash
- 如果您的 token
确实相同,则所有调用的应该都相同。
(正如 Dan 所指出的,您的方法命名不当:散列不是加密。另外,请不要捕获 Exception
或 像这样吞下异常。在失败时只返回 token
似乎也很奇怪。)
编辑:如前所述,我假设 Base64.encode
实际上返回一个字符串,但它可能不会。我推荐 this base64 implementation这是公共(public)领域并且有一个合理的 API - 编码调用返回一个字符串,这是完全合适的。当然,您也不需要显式的 toString()
调用...
关于java - SHA 将相同的字符串散列到不同的 blob 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8731626/