Java 计算字符串的 SHA-1 摘要的十六进制表示形式

2022-08-31 16:00:23

我将用户密码存储在数据库上作为sha1哈希。

不幸的是,我得到了奇怪的答案。

我将字符串存储为:

MessageDigest cript = MessageDigest.getInstance("SHA-1");
              cript.reset();
              cript.update(userPass.getBytes("utf8"));
              this.password = new String(cript.digest());

我想要这样的东西-->

aff --> “0c05aa56405c447e6678b7f3127febde5c3a9238”

而不是

aff --> V@\D~fx : 8


答案 1

使用 apache 通用编解码器库:

DigestUtils.sha1Hex("aff")

结果为 0c05aa56405c447e6678b7f3127febde5c3a9238

就是这样:)


答案 2

发生这种情况是因为 cript.digest() 返回一个字节数组,您尝试将其打印为字符串。您希望将其转换为可打印的十六进制字符串。

简单的解决方案:使用Apache的commons-codec库

String password = new String(Hex.encodeHex(cript.digest()),
                             CharSet.forName("UTF-8"));

推荐