java.security.MessageDigest

目的
MD5による認証

関連クラス

今回のソース
import java.awt.*;
import java.awt.event.*;
import java.security.*;
import java.util.Hashtable;

class Main
{
	public static void main(String args[])
	{
		new MainWindow();
	}
}

class MainWindow extends Frame
{
	TextField user,password;
	Hashtable list;

	public MainWindow()
	{
		super("Message Digest Test");

		// ウインドウリスナの定義
		WindowListener listener = new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		};
		addWindowListener(listener);

		// アカウントの発行
		list = new Hashtable();
		createAccount();

		// 3行1列のレイアウトに設定
		setLayout(new GridLayout(3,1));

		// ユーザー名入力部の生成
		Panel p1 = new Panel();
		user = new TextField(16);
		p1.add(new Label("UserName",Label.CENTER));
		p1.add(user);

		// パスワード入力部の生成
		Panel p2 = new Panel();
		password = new TextField(16);
		password.setEchoChar('*');
		p2.add(new Label("Password",Label.CENTER));
		p2.add(password);

		// ログインボタンの生成
		Button login = new Button("Login");
		ActionListener listener_login = new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				if(checkAccount(user.getText(),password.getText()))
					System.out.println("ログインに成功しました。");
				else
					System.out.println("パスワードが違います。");
			}
		};
		login.addActionListener(listener_login);

		// ウインドウへのコンポーネントの配置
		add(p1);
		add(p2);
		add(login);

		// ウインドウの表示
		setFont(new Font("monospaced",Font.PLAIN,16));
		pack();
		setVisible(true);
	}

	private void createAccount()
	{
		String user_name = "user";
		String password  = "ABCDE";
		byte valid_password[];

		try
		{
			// MD5アルゴリズム
			MessageDigest md5 = MessageDigest.getInstance("MD5");

			// パスワードから、ハッシュコードを生成する
			valid_password = md5.digest(password.getBytes());

			list.put(user_name,valid_password);
		}
		catch(NoSuchAlgorithmException ex)
		{
			System.err.println(ex);
		}
	}

	private boolean checkAccount(String user_name,String password)
	{
		try
		{
			// MD5アルゴリズム
			MessageDigest md5 = MessageDigest.getInstance("MD5");

			// パスワードから、ハッシュコードを生成する
			byte user_password[] = md5.digest(password.getBytes());

			// 入力されたユーザー名を元にテーブルを参照し、登録済みのパスワードを得る
			byte valid_password[] = (byte[])list.get(user_name);
			if(valid_password == null)
			{
				System.err.println(user_name + "はアカウントを持っていません。");
				System.exit(-1);
			}

			// 二つのハッシュコードを比較する
			return(MessageDigest.isEqual(user_password,valid_password));
		}
		catch(NoSuchAlgorithmException ex)
		{
			System.err.println(ex);
			return(false);
		}
	}
}
Source is here. (ZIP Format,Byte,Shift-JIS)

コンパイル&実行
javac .java
java

説明
(概略)

MD5アルゴリズムを用いた認証の方法です。
MD5アルゴリズムで得られたハッシュコード同士を比べることで、
それらが一致していれば、正しいパスワードとみなす。
という認証を行います。

また、MD5アルゴリズムは、一方向ハッシュ関数なので、
ハッシュコード(値)から、元のパスワード(キー)を得ることが出来ないので、
ネットワーク上でハッシュコードを奪われたとしても、
解読される危険性は低いと思われます。

(サンプルプログラムの説明)

Hashtable list;
ハッシュテーブルは、キーと値の組みを複数格納します。
値を取り出すには、get(Key)メソッドで、キーを指定することにより、
組みになっている値を取り出すことが出来ます。
ここでは、ユーザー名と暗号化されたパスワードが、一つの組みになっています。
パスワードから、ハッシュコードを生成する
MD5アルゴリズムを用いて、パスワードからハッシュコードを生成します。
このハッシュコードと、元々登録されているハッシュコードを比べることで、
正しいパスワードかどうかを比較し、認証を行っています。
また、MD5アルゴリズムは一方向ハッシュ関数のため、
このハッシュコードから元のパスワードを得ることは出来ません。