1

文字列からURLセーフなbase64でエンコードされたハッシュを生成するJavaコードベースがあり、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

StringBuilderを使用して、16進数を意味のある文字列に変換できます。

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 に答える
1

ハッシュのバイト値ではなく、16進文字列を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 に答える