Javaのメッセージダイジェストで文字列を暗号化(ハッシュ化)

Programming プログラミング

Javaで文字列を暗号化(ハッシュ化)する場合、「メッセージダイジェスト」というものを使用するようだ。

メッセージダイジェスト」とは、一方向ハッシュ関数とも呼ばれ、任意の文字列から固定長の擬似乱数(ハッシュ値)を生成するアルゴリズムのことらしい。

実際にやってみた。

スポンサーリンク

Javaのメッセージダイジェスト

使用するクラス名は、「MessageDigest」。

そのままで分かりやすい。

コーディングは以下のようになる。

なお、メッセージダイジェストで生成されたハッシュ値はbyte配列なのだが、それだと人間に優しくないし、DBに格納する時に少し面倒かなと思い、16進数の文字列に変換する(+α負の数は正の数へ)メソッドにした。

本来なら、文字列に変換せずに「isEqual」メソッドで2つのハッシュ値が等しいか確認するみたい。

暗号化アルゴリズムは「SHA-1」や「MD5」などが指定できるが、これらでは突破される脆弱性があるらしく「SHA-256」以上が推奨されているようです。

/**
* 文字列をハッシュ化するメソッド
*
* @param text ハッシュ化するテキスト
*
* @return ハッシュ化した計算値(16進数)
*/
public static String encryptStr(String text) {
    // 変数初期化
    MessageDigest md = null;
    StringBuffer buffer = new StringBuffer();

    try {
        // メッセージダイジェストインスタンス取得
        md = MessageDigest.getInstance("SHA-256");
    } catch (NoSuchAlgorithmException e) {
        // 例外発生時、エラーメッセージ出力
        System.out.println("指定された暗号化アルゴリズムがありません");
    }

    // メッセージダイジェスト更新
    md.update(text.getBytes());

    // ハッシュ値を格納
    byte[] valueArray = md.digest();

    // ハッシュ値の配列をループ
    for(int i = 0; i < valueArray.length; i++){
        // 値の符号を反転させ、16進数に変換
        String tmpStr = Integer.toHexString(valueArray&#91;i&#93; & 0xff);

        if(tmpStr.length() == 1){
            // 値が一桁だった場合、先頭に0を追加し、バッファに追加
            buffer.append('0').append(tmpStr);
        } else {
            // その他の場合、バッファに追加
            buffer.append(tmpStr);
        }
    }

    // 完了したハッシュ計算値を返却
    return buffer.toString();
}
&#91;/java&#93;

<h2>呼び出し用メソッド</h2>

呼び出し用メソッドはこんな感じです。

コマンドライン引数を渡しています。


/**
* メインメソッド
*/
public static void main (String[] args) {
    // コマンドライン引数を出力
    System.out.println(args[0]);

    // コマンドライン引数をメッセージダイジェストで暗号化(ハッシュ化)して出力
    System.out.println(encryptStr(args[0]));
}

実行結果

「SHA-256」のハッシュ値の文字列長は、どんな長さの文字列を与えても64桁であった。

#文字列「12345」
C:\>java MessageDigestTest 12345
12345
5994471abb01112afcc18159f6cc74b4f511b99806da59b3caf5a9c173cacfc5

#文字列「1234567890」
C:\>java MessageDigestTest 1234567890
1234567890
c775e7b757ede630cd0aa1113bd102661ab38829ca52a6422ab782862f268646

セキュリティ関係を勉強せなー。

GitHub(ソースはコチラで公開中)

Javaのメッセージダイジェストテストクラス

参考サイト

MD5 - Wikipedia

MD5 – Wikipedia

Java 入門 | メッセージダイジェスト

MessageDigest (Java Platform SE 6)

スポンサーリンク
スポンサーリンク
プログラミング
えふめんをフォローする
この記事が気に入ったら
いいね!しよう
最新情報をお届けします。
俺の開発研究所

コメント

タイトルとURLをコピーしました