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[i] &amp;amp; 0xff); if(tmpStr.length() == 1){ // 値が一桁だった場合、先頭に0を追加し、バッファに追加 buffer.append('0').append(tmpStr); } else { // その他の場合、バッファに追加 buffer.append(tmpStr); } } // 完了したハッシュ計算値を返却 return buffer.toString(); }呼び出し用メソッド
呼び出し用メソッドはこんな感じです。
コマンドライン引数を渡しています。
/** * メインメソッド */ 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セキュリティ関係を勉強せなー。
参考サイト
MD5 - Wikipedia
コメント