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

tom*_*tom 2 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;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

你还没有给出足够的信息,但我怀疑你被这分心了:

System.out.println("raw = " + raw.toString());
Run Code Online (Sandbox Code Playgroud)

这是怎么回事打印出像[B@30a4effe它有什么做的字节数组中的数据.你应该打印出来hash- 如果真的是相同的话,对于所有的电话应该token相同的.

(正如Dan所说,你的方法名称不恰当:哈希不是加密.另外,请不要抓住Exception 只是吞下这样的例外.看来token失败也很奇怪.)

编辑:如上所述,我假设Base64.encode实际上返回一个字符串,它可能不会.我建议这个base64实现是公共域并且有一个合理的API - 编码调用返回一个String,这是完全合适的.当然,你也不需要显式toString()调用......