我生成md5的代码看起来像
@Nonnull
static String getAuthCode(@Nonnull final String email, @Nonnull final String memberExternalId,
@Nonnull final String clientId, @Nonnull final String clientSecret) {
final MessageDigest messageDigest = getMessageDigest("MD5");
final String stringForHashCode = email + ":" + memberExternalId + ":" + clientId + ":" + clientSecret;
messageDigest.update(stringForHashCode.getBytes());
return new BigInteger(1, messageDigest.digest()).toString();
}
我以
运行测试@Test
public void test() {
System.out.println(getAuthCode("a", "b", "c", "d"));
}
我输出
306937959255909402080036399104389354327
当我在在线website上运行相同的测试时,我得到输出为
e6ea19c62a3763c7b78c475652c51357
对于相同的输入a:b:c:d
问题
e6ea19c62a3763c7b78c475652c51357
?答案 0 :(得分:3)
注释中指出的问题是问题 - 您应该定义要使用的编码。我建议使用UTF-8,例如
messageDigest.update(stringForHashCode.getBytes(StandardCharsets.UTF_8));
更大的问题是,您要打印出从摘要中创建的BigInteger
- 这是以十进制打印出来的。您从在线工具获得的结果是十六进制。
虽然您可以将BigInteger
转换为十六进制,但我个人会首先避免创建BigInteger
- 您需要计算填充等。相反,只需使用其中一个许多库可用于将byte[]
转换为十六进制,例如Apache Commons Codec及其Hex
类。