【问题标题】:Generating a base64 encoded hash from CLI to match Java从 CLI 生成 base64 编码哈希以匹配 Java
【发布时间】:2012-10-03 12:42:18
【问题描述】:

我有一个 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?

【问题讨论】:

  • 您的第一个错误是您在提交给 sha256sum 的字符串中包含换行符,请改用“echo -n”。

标签: java base64 gnu sha256


【解决方案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());

【讨论】:

  • 我认为与此有关。当我将十六进制表示形式传递给 b64 编码器时,如何将其转换为字节数组?
  • 不确定我是否能够在 base64 编码之前将 Java 代码库更新为十六进制编码,但至少现在可以匹配。谢谢大卫。
  • echo -n testString | sha256sum |剪切-d" "-f1 | xargs 回声-n | base64 @David - 是的,因为对 Java 代码库的访问受限。实际上只是在 bash 中进行测试,但最终会在 python 脚本中。
  • @Brett 编码两次有点不寻常。你不应该修复你的命令行吗?
  • 我无权访问 java 代码库,并尝试使用 bash / python 来使其工作。我可能会编写一个与 CLI 一起使用的 java 哈希,使用相同的代码库,然后通过管道传输到 java Hasher testString。我认为这将是最好的方法。
【解决方案2】:

您可以使用 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 命令中不包括换行符,在这里工作......

【讨论】:

    猜你喜欢
    • 2018-12-20
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多