java - SHA 将相同的字符串散列到不同的 blob 中

标签 java passwords sha

我正在使用以下代码对传入的字符串进行哈希处理,期望多次应用于该方法的同一事物总是会得到相同的结果。该方案将用于密码散列和以后的验证。但它似乎不起作用 - 我为同一个输入字符串得到了两个不同的 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/

相关文章:

android - iOS 中的 SHA 加密

python - 在 python 中计算字符串的 SHA1

JavaScript 隐藏类似于密码的纯文本

java - 如何在 MVEL 中公开常量值?

java - 将字节数组转换为 OutputStream

java - 无法阻止用户使用带有自定义 UserDetail 和 AuthenticationProvider 的 spring security 多次登录

python - 如何以编程方式更改 django 中用户的用户名和密码?

java - Android 中刷新按钮

php - 正则表达式检查整个字符串是否是单个重复字符 - 通过 PHP

javascript - 发送密码的散列而不是未散列的密码是个坏主意吗?