メッセージダイジェスト(ハッシュ)は、byte [] in byte [] outです。
メッセージダイジェストは、生のバイト配列を取り、生のバイト配列(別名byte[]
)を返す関数として定義されます。たとえば、SHA-1(Secure Hash Algorithm 1)のダイジェストサイズは160ビットまたは20バイトです。生のバイト配列は通常、UTF-8のような文字エンコーディングとして解釈できません。これは、すべての順序のすべてのバイトがそのエンコーディングとして正当であるとは限らないためです。したがって、それらをwithに変換します:String
new String(md.digest(subject), StandardCharsets.UTF_8)
いくつかの不正なシーケンスを作成するか、未定義のUnicodeマッピングへのコードポインターを持っている可能性があります。
[�a�ɹ??�%l�3~��.
バイナリからテキストへのエンコード
そのために、バイナリからテキストへのエンコーディングが使用されます。ハッシュの場合、最もよく使用されるのはHEXエンコーディングまたはBase16です。基本的にバイトの値持つことができる0
に255
(又は-128
へ127
のHEX表現に相当する符号付きの)0x00
- 0xFF
。したがって、16進数は必要な出力の長さを2倍にします。つまり、20バイトの出力では、40文字の16進数文字列が作成されます。例:
2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
16進エンコーディングを使用する必要はないことに注意してください。base64のようなものを使用することもできます。人間が読みやすく、パディングを必要とせずに出力長が定義されているため、16進数がよく使用されます。
JDK機能のみでバイト配列を16進数に変換できます。
new BigInteger(1, token).toString(16)
ただし、BigInteger
指定されたバイト配列はバイト文字列ではなく数値として解釈されます。つまり、先行ゼロは出力されず、結果の文字列は40文字より短い場合があります。
ライブラリを使用してHEXにエンコードする
あなたは今可能性がコピーして、スタックオーバーフローからテストされていないバイトツー進法を貼り付けるかのような大規模な依存関係を使用しグアバ。
ほとんどのバイト関連の問題を解決するために、これらのケースを処理するユーティリティを実装しました:bytes-java(Github)
メッセージダイジェストバイト配列を変換するには、次のようにします。
String hex = Bytes.wrap(md.digest(subject)).encodeHex();
または、組み込みのハッシュ機能を使用することもできます
String hex = Bytes.from(subject).hashSha1().encodeHex();
SHA1
ハイフンがありません。違いがあるかどうかはわかりません。