1

我有一个 java 代码库,它从一个字符串生成一个 URL 安全的 base64 编码哈希,并且想知道这是否/如何使用 linux 命令行工具实现。我猜我在这里所做的问题与字符集/编码有关,或者与将字符串转换为字节数组有关。Java代码:

MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] digest = md.digest("testString".getBytes());
// ^^ this is where the difference is?
String b64url = Base64.encodeBase64URLSafeString(digest);
// b64url: Ss8LOdnEdmcJo2ifVTrAGrVQVF_6RUTfwLLOqC-6AqM

命令行:

echo testString | sha256sum | cut -d" " -f1 | base64
# NDgxOGEyY2JkODYwOTY1NjJkODFmYzIwNmQ3ZTYyNWVlNGFjMTU5MmViNTc0MjQwMDQ4OTIzOTBl
# MDQzZTNlYwo=

是否可以通过 cli 工具生成 base64 编码的 sha256?

4

2 回答 2

1

您正在对十六进制字符串进行 base64 编码,而不是哈希的字节值,这相当于:

MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] digest = md.digest("testString".getBytes()); // Missing charset
String hex = Hex.encodeHexString(digest);
String base64 = Base64.encodeBase64(hex.getBytes());
于 2012-10-03T12:55:49.677 回答
1

您可以使用 StringBuilder 将您的十六进制转换为有意义的字符串:

MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] digest = md.digest("testString".getBytes());
StringBuilder sb = new StringBuuilder();
for (byte b : digest) {
    sb.append(Integer.toHexString(b & 0xff));
}
String base64 = Base64.encodeBase64(sb.toString());

结合在 echo 命令中不包括换行符,在这里工作......

于 2012-10-03T13:04:24.720 回答