JavaのWebアプリケーションを構築した際に、ユーザ情報を管理することがあります。このときパスワードも管理することになりますが、パスワードを平文のままDBに入れるのはセキュリティの観点から好ましくありません。ここではCommons Codecを利用し、パスワードを簡単に暗号化する方法を説明します。

ハッシュを利用した認証

Commons Codecでは一方向ハッシュを実現するためのDigestUtilsクラスが用意されています。ハッシュとは、ある任意の値から、どのような値でも一様であり、衝突耐性のある値(ハッシュ値)を得ることです。また同じハッシュアルゴリズムであれば、元の値が同じであれば、ハッシュ値も同じです。例えば「ABCD」という値をハッシュ化し、「1234」というハッシュ値を得た場合、「ABCD」は何度ハッシュ化しても「1234」であり、「1234」をハッシュ値として持つ元の値を、発見することは限りなく困難です。

ハッシュは一方向に対してのみ有効であり、ハッシュ値から元の値を得ることはできません。実際にWebアプリケーションで認証をさせる場合は、パスワードをハッシュ値としてDBに入れ、認証時に入力された文字列から同一ハッシュアルゴリズムでハッシュ値を求め、ハッシュ値が一致を確認することで認証します。

Commons Codec

Commons CodecはApache Commonsプロジェクトの1プロジェクトです。OSSとして提供され、無償かつApache License 2.0のため、OSSの中でも比較的自由に利用可能です。

●対応するバージョン

バージョン Javaバージョン
1.3 1.2.2
1.4 1.4

 
●ハッシュ関連メソッド

DigestUtils
String md5Hex (String data)
          MD5でハッシュ化します。
String shaHex (String data)
          SHA-1でハッシュ化します。
String sha256Hex (String data)
          SHA-256でハッシュ化します。

サンプル

文字列からハッシュ値を求めるサンプルです。ここではMD5, SHA-1, SHA-256でハッシュ値を求めます。現状、この中ではSHA-256が一番強力なので、マシンパワーに余裕があればSHA-256を利用されることをお勧めします。

実行環境

  • Commons Codec:1.4
  • Java:6.0.21
例:文字列からハッシュ値を求める
import org.apache.commons.codec.digest.DigestUtils;

public class DigestUtilsSample {

    public static void main(String[] args) {
        String data = "test1234";

        //MD5でハッシュ
        System.out.println("MD5     = " + DigestUtils.md5Hex(data));

        //SHAでハッシュ
        System.out.println("SHA-1   = " + DigestUtils.shaHex(data));

        //SHA256でハッシュ
        System.out.println("SHA-256 = " + DigestUtils.sha256Hex(data));		
    }

}
実行結果
MD5     = 16d7a4fca7442dda3ad93c9a726597e4
SHA-1   = 9bc34549d565d9505b287de0cd20ac77be1d3f2c
SHA-256 = 937e8d5fbb48bd4949536cd65b8d35c426b80d2f830c5c308e2cdec422ae2244


Leave a Reply

preload preload preload