パスワードをハッシュ化したい

Apache Commons CodecのDigestUtilsを使用する方法を紹介します。

ハッシュ関数には、同一性(同じデータからは常に同じダイジェストが出力される)、一方向性(ダイジェストから元のデータを導き出すことは不可能)といった性質が求められます。したがって自作するよりもライブラリを利用することを強く推奨します。

import org.apache.commons.codec.digest.DigestUtils;

public class DigestUtilsTest {

    public static void main(String[] args) {
        System.out.println(DigestUtils.sha256Hex("123456789"));
        System.out.println(DigestUtils.sha256Hex("123456789" + "salt"));
    }
}

<実行結果>

15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225
ab03db0c39851456931b33c525bf70aa4998172865c9adebf930894c4fe8e51f

ただし、6行目の例のようにハッシュ化をしただけの単純なパスワードはレインボーテーブル攻撃で破られてしまいます

そこで、7行目の例のようにソルトを加えたり、以下の例のようにストレッチングをすることをお勧めします。

注)ソルトはパスワードごとに変化させることが望ましいです。

ストレッチを1万回かけたサンプルコードです。

import org.apache.commons.codec.digest.DigestUtils;

public class DigestUtilsTest2 {

    public static void main(String[] args) {

        String pass = "123456789";
        for (int i = 0; i < 10000; i++) {
            pass = DigestUtils.sha256Hex(pass);
        }
        System.out.println(pass);
    }
}

<実行結果>

56708be877dd36e710637b4f39843996ac2a08a163e3493150243ccc9ba45361

以上。

パスワードをハッシュ化したい 最後までお読みいただきありがとうございます。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!