SHA 256 计算错误

3

我需要为我的密码计算SHA 256。

我已经知道可以使用Apache的常见编解码器,但是我工作的地方不允许这样做

我尝试创建一个简单的函数来返回明文的sha 256,如下:

public static String getSHA1(String plainText) {
        MessageDigest md;
        try {
            md = MessageDigest.getInstance("SHA-256");

            md.update(plainText.getBytes());
            StringBuffer hexString = new StringBuffer();
            for (int i = 0; i < md.digest().length; i++) {
                hexString.append(Integer.toHexString(0xFF & md.digest()[i]));
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

我的问题是无论输入什么,结果都一样。我总是得到这个结果。

e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

我可以使用这个网站http://onlinemd5.com/在线计算SHA 256,

但是我需要从我的代码中计算它。

感谢和爱戴您的帮助。


1
请尽量不要使用StringBuffer,除非必须,因为它已经被StringBuilder替代了将近十年。 - Peter Lawrey
1个回答

3
digest()的Javadoc中可以看到:

通过执行最终操作(如填充)完成哈希计算。此调用后,摘要将被重置。

只需调用一次digest()并将结果存入变量中即可。

(顺便说一句,如果您搜索摘要(digest),这总是一个好主意,您会发现它是空字符串的SHA-256摘要。)


尊敬的chrylis先生,感谢您的回答。请问您能否帮我检查一下我的代码?我正在循环使用“digest()”。 - user3110137
@user3110137 对的。你一遍又一遍地调用它。在第一次调用md.digest()获取其长度后,md被重置。之后每次调用它,你都会得到空字符串的摘要。 - chrylis -cautiouslyoptimistic-
亲爱的chrylis先生,现在我明白了。您的意思是我只需要调用它一次并将结果分配给一个变量,然后循环这个变量。我现在会在我的代码中尝试。感谢您与我共度的时光。 - user3110137
亲爱的chrylis先生,非常感谢您,您是正确的。它可以工作,但有一件事不同。我的代码给了我a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3,但在线网站给了我A665A45920422F9D417E4867EFDC4FB8A04A1F3FFF1FA07E998E86F7F7A27AE3,它们除了大小写字母不同之外是相同的。这样做有问题吗? - user3110137
@user3110137,您正在以十六进制数字的形式打印出字节,这些数字不区分大小写(它们只是将AF视为更多的数字)。如果您需要其中一个(小写更常见,但没有重要的区别),只需将字符串转换为大写或小写,或使用格式化字符串以大写形式打印。 - chrylis -cautiouslyoptimistic-

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接