JavaでのSHA-256およびSHA3-256ハッシュ
1. 概要
SHA(Secure Hash Algorithm)は、一般的な暗号化ハッシュ関数の1つです。 暗号化ハッシュを使用して、テキストまたはデータファイルの署名を作成できます。 このチュートリアルでは、さまざまなJavaライブラリを使用してSHA-256およびSHA3-256ハッシュ操作を実行する方法を見てみましょう。
SHA-256アルゴリズムは、ほぼ一意の固定サイズの256ビット(32バイト)ハッシュを生成します。 これは一方向関数であるため、結果を元の値に復号化することはできません。
現在、SHA-2ハッシュは、暗号の分野で最も安全なハッシュアルゴリズムと見なされているため、広く使用されています。
SHA-3は、SHA-2以降の最新のセキュアハッシュ標準です。 SHA-2と比較して、SHA-3はユニークな一方向ハッシュを生成するための異なるアプローチを提供し、一部のハードウェア実装でははるかに高速です。 SHA-256と同様に、SHA3-256はSHA-3の256ビット固定長アルゴリズムです。
NISTは2015年にSHA-3をリリースしたため、当面はSHA-2ほど多くのSHA-3ライブラリはありません。 組み込みのデフォルトプロバイダーでSHA-3アルゴリズムが利用できるようになったのは、JDK9までではありません。
それでは、SHA-256から始めましょう。
参考文献:
Java-LSHを使用したJavaのローカリティ依存ハッシュ
java-lsh libraryを使用してJavaでLocality-Sensitive Hashingアルゴリズムを適用するための迅速かつ実用的なガイド。
2. JavaのMessageDigestクラス
Javaは、SHA-256ハッシュ用の組み込みのMessageDigestクラスを提供します。
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] encodedhash = digest.digest(
originalString.getBytes(StandardCharsets.UTF_8));
ただし、ここでは、カスタムバイトから16進数へのコンバーターを使用して、ハッシュ値を16進数で取得する必要があります。
private static String bytesToHex(byte[] hash) {
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < hash.length; i++) {
String hex = Integer.toHexString(0xff & hash[i]);
if(hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
return hexString.toString();
}
3. グアバ図書館
Google Guavaライブラリは、ハッシュ用のユーティリティクラスも提供します。
まず、依存関係を定義しましょう。
com.google.guava
guava
20.0
次に、Guavaを使用して文字列をハッシュする方法を説明します。
String sha256hex = Hashing.sha256()
.hashString(originalString, StandardCharsets.UTF_8)
.toString();
4. ApacheCommonsコーデック
同様に、Apache Commons Codecsも使用できます。
commons-codec
commons-codec
1.11
SHA-256ハッシュをサポートするユーティリティクラス(DigestUtils)は次のとおりです。
String sha256hex = DigestUtils.sha256Hex(originalString);
5. 弾む城図書館
5.1. メーベン依存
org.bouncycastle
bcprov-jdk15on
1.60
5.2. 弾む城ライブラリを使用したハッシュ
Bouncy Castle APIは、16進データをバイトに変換したり元に戻したりするためのユーティリティクラスを提供します。
ただし、最初に組み込みJava APIを使用してダイジェストを設定する必要があります。
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(
originalString.getBytes(StandardCharsets.UTF_8));
String sha256hex = new String(Hex.encode(hash));
6. SHA3-256
それでは、SHA3-256を続けましょう。 JavaでのSHA3-256ハッシュは、SHA-256とまったく違いはありません。
6.1. JavaのMessageDigestクラス
Starting from JDK 9、組み込みのSHA3-256アルゴリズムを使用するだけです。
final MessageDigest digest = MessageDigest.getInstance(SHA3_256);
final byte[] hashbytes = digest.digest(
originalString.getBytes(StandardCharsets.UTF_8));
String sha3_256hex = bytesToHex(hashbytes);
6.2. ApacheCommonsコーデック
Apache Commons Codecsは、MessageDigestクラスに便利なDigestUtilsラッパーを提供します。 このライブラリは、バージョン1.11およびrequires JDK 9+以降、SHA3-256のサポートを開始しました。
String sha3_256hex = new DigestUtils(SHA3_256).digestAsHex(originalString);
6.3. Keccak-256
Keccak-256は、別の一般的なSHA3-256ハッシュアルゴリズムです。 現在、標準のSHA3-256の代替として機能します。 Keccak-256は、標準のSHA3-256と同じセキュリティレベルを提供し、パディングルールのみがSHA3-256と異なります。 Monoroなどのいくつかのブロックチェーンプロジェクトで使用されています。
繰り返しになりますが、Keccak-256ハッシュを使用するには、Bouncy Castle Libraryをインポートする必要があります。
Security.addProvider(new BouncyCastleProvider());
final MessageDigest digest = MessageDigest.getInstance(KECCAK_256);
final byte[] encodedhash = digest.digest(
originalString.getBytes(StandardCharsets.UTF_8));
String sha3_256hex = bytesToHex(encodedhash);
また、yBouncy Castle APIを使用してハッシュを行うこともできます。
Keccak.Digest256 digest256 = new Keccak.Digest256();
byte[] hashbytes = digest256.digest(
originalString.getBytes(StandardCharsets.UTF_8));
String sha3_256hex = new String(Hex.encode(hashbytes));
7. 結論
この簡単な記事では、組み込みライブラリとサードパーティライブラリの両方を使用して、JavaでSHA-256およびSHA3-256ハッシュを実装するいくつかの方法を紹介しました。
上記の例のソースコードは、GitHub projectにあります。