暗号

【Kotlin】ハッシュ演算サンプルコード SHA-3 / SHA-2 / SHA-1 / MD5

この記事では、Kotlin でハッシュ演算する方法をサンプルコード付きで解説します。

SHA-256などのハッシュ演算は業務でもよく使いますが、毎回やり方を忘れてしまいますよね?

Kotlinでハッシュ値を計算する2つの方法について、見るだけですぐに思い出せるように、分かりやすいサンプルコードを記載しました!

もちろん、Java でもほぼ同じやり方でハッシュ演算することができるので、ぜひ参考にして下さい。

サンプルコード

MessageDigest を使うパターン

Java.security を使用した方法で、利用するに当たって特別なimportは必要ありません。

fun sha3(input: ByteArray): ByteArray {
    val md = MessageDigest.getInstance("SHA3-512")
    return md.digest(input)
}

fun sha256(input: ByteArray): ByteArray {
    val md = MessageDigest.getInstance("SHA-256")
    return md.digest(input)
}

fun sha1(input: ByteArray): ByteArray {
    val md = MessageDigest.getInstance("SHA-1")
    return md.digest(input)
}

fun md5(input: ByteArray): ByteArray {
    val md = MessageDigest.getInstance("MD5")
    return md.digest(input)
}

getInstanceに指定できるアルゴリズム名

アルゴリズム名説明
MD2RFC 1319で定義されたMD2メッセージ・ダイジェスト・アルゴリズム。
MD5RFC 1321で定義されたMD5メッセージ・ダイジェスト・アルゴリズム。
SHA-1
SHA-224
SHA-256
SHA-384
SHA-512
SHA-512/224
SHA-512/256
FIPS PUB 180-4で定義されたハッシュ・アルゴリズム。 安全なハッシュ・アルゴリズム- SHA-1, SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256 - 電子データの凝縮表現を計算するためのものです(message)。 メッセージがハッシュ・アルゴリズムに入力されると、結果はメッセージ・ダイジェストと呼ばれる出力になります。 メッセージ・ダイジェストの長さは、アルゴリズムに応じて160〜512ビットです。
SHA3-224
SHA3-256
SHA3-384
SHA3-512
FIPS PUB 202で定義されている順列ベースのハッシュ関数と拡張可能な出力関数。 入力メッセージの長さはさまざまです。出力ダイジェストの長さは固定されます。

SHA3-224は224ビットのダイジェストを生成します。
SHA3-256は256ビットのダイジェストを生成します。
SHA3-384は384ビットのダイジェストを生成します。
SHA3-512は512ビットのダイジェストを生成します。
MessageDigestのインスタンスを生成するときに指定できるアルゴリズム名 一覧

DigestUtils を使うパターン (オススメ)

Apache Common Codec のimportは必要になりますが、こちらの方法の方がシンプルなのでオススメです。
DigestUtilsの中でやっている処理は、MessageDigestを使うパターンとほぼ同じです。
ByteArrayの他に、Hex Stringなどで返せるメソッドが定義されているので何かと便利だと思います。

注意点として、SHA3が使えるのは Java9以降になります。(SHA3-224 / SHA3-256/ SHA3-384/ SHA3-512)

fun sha3(input: ByteArray): ByteArray {
    return DigestUtils.sha3_512(input)
}

fun sha256(input: ByteArray): ByteArray {
    return DigestUtils.sha256(input)
}

fun sha1(input: ByteArray): ByteArray {
    return DigestUtils.sha1(input)
}

fun md5(input: ByteArray): ByteArray {
    return DigestUtils.md5(input)
}

まとめ

最後に、この記事の内容をまとめます。

要点

  • Kotlinでは、MessageDigest と DigestUtils の2つの方法でハッシュを計算することができる
  • MessageDigest は Javaの標準機能だけで実装可能
  • DigestUtils はライブラリの importが必要になるが、便利なメソッドが用意されている

2022年現在では、SHA-256以上のハッシュ関数であれば強度的に問題ありません。
MD5やSHA-1は衝突可能性があり使用するべきでないとされています。(DigestUtilsでは、SHA-1のみ Deprecatedにされています)

今のところ、SHA-256,384,512などのSHA-2アルゴリズムが利用されるケースが多いですが、今後はSHA-3アルゴリズムの利用も広がってくると思います。
ブロックチェーン界隈では、SHA-3が既に利用されているようです。(興味があれば、以下の関連記事を参照して下さい)

Keccak と SHA-3 の違いについて【ハッシュ】

この記事では、ハッシュアルゴリズムの Keccak と SHA-3 の違いについて解説します。 SHA-3の元になったアルゴリズムがKeccakなので同一視されがちですが、SHA-3 = Keccak ...

続きを見る

それでは、また他の記事でお会いしましょう!

この記事は役に立ちましたか?

  • この記事を書いた人
アバター画像

ゴイチ

ソフトウェアエンジニア歴20年。 C/C++, C#, Java, Kotlinが得意で、組込系・スマホ・大規模なWebサービスなど幅広いプログラミング経験があります。 現在は某SNSの会社でWebエンジニアをしています。

-暗号
-, ,