talosのプログラミング教室

【Java】パスワードのハッシュ化とログイン認証

スポンサーリンク

こんにちは。たろすです。

今回は安全なアプリを開発するために重要なパスワードのハッシュ化について説明します。

ハッシュ化のアルゴリズムとしては「bcrypt」を使用します。

環境

言語:Java8
フレームワーク:Spring Security
DB:MySQL

下準備

mvnrepository.com

このサイトからjarファイルをダウンロードします。

f:id:talosta:20201227173038p:plain

Eclipseの動的Webアプリケーションであれば、ダウンロードしたjarファイルをWEB-INF/libにコピーしましょう。

解説

認証関連はAutuUtilクラスに実装されています。

まずはSpring Securityを使うために以下をインポートします。

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

パスワードのハッシュ化

/**
 * ユーザーを登録する
 * @param user
 * @return
 */
public boolean registerUser(UserSample user) {
	BCryptPasswordEncoder bcpe = new BCryptPasswordEncoder();
	// ハッシュ化
	String encodeedPassword = bcpe.encode(user.getPassword());
	user.setPassword(encodeedPassword);

	int result = userLogic.insertUser(user);
	if (result > 0) {
		return true;
	}
	return false;
}

ハッシュ化するときにはBCryptPasswordEncoder.encode()メソッドを呼びます。

引数は生のパスワード(ハッシュ化する前のパスワード)です。

ログイン認証

/**
 * ログイン処理を行う
 * @param user
 * @return
 */
public boolean login(UserSample user) {
	// IDをキーにユーザー情報を取得
	UserSample compUser = userLogic.getUserById(user.getId());
	BCryptPasswordEncoder bcpe = new BCryptPasswordEncoder();
	// 入力されたパスワードとDBのパスワード(ハッシュ化済み)を比較
	if (bcpe.matches(user.getPassword(), compUser.getPassword())) {
		loginUser.setUser(compUser);
		return true;
	}
	return false;
}

ユーザーから入力されたパスワードとDBに登録されているハッシュ化されたパスワードが一致しているかを確認するにはBCryptPasswordEncoder.matches()を使います。

第一引数は生のパスワード(ユーザーから入力されたパスワード)、第二引数はハッシュ化されたパスワード(DBに登録されたパスワード)です。


スポンサーリンク



実行

実行するとトップページが開くので「新規登録」を押します。

f:id:talosta:20201228230344p:plain

ID、名前、パスワードをすべて入力して「登録」を押します。

f:id:talosta:20201228230422p:plain

DBに登録されました。

パスワードはちゃんとハッシュ化されています。

f:id:talosta:20201228230448p:plain

先程登録したIDとパスワードを入力して「ログイン」を押します。

f:id:talosta:20201228232128p:plain

登録した名前が表示されます。

f:id:talosta:20201228232146p:plain

おわりに

今回はパスワードのハッシュ化とログイン認証について説明しました。

不明点があればコメントお願いします。