Webセキュリティの小部屋

Twitter のフォローはこちらから Facebook ページはこちら Google+ページはこちら RSSフィードのご登録はこちらから
公開日:2019年2月10日
最終更新日:2019年2月11日

Webアプリケーションで安全なパスワード保存には専用のハッシュ関数を使う時代になった

はじめに

Web アプリケーションで安全にパスワードを保存するためには、ソルト+ハッシュ+ストレッチングという実装方法が2013年頃から啓蒙されてきていましたが、Webセキュリティの大家である徳丸浩さんによると独自実装は既に時代遅れであるようです。

これからの Web アプリケーションでは、ソルト+ハッシュ+ストレッチングを独自実装で行うのではなく、以下のように専用のハッシュ関数を利用することが推奨されます。

パスワード保存に適したハッシュ関数として、BCryptやPBKDF2、Argon2などがあります。

(中略)

また、PHPに限らず、パスワード保存機能は独自実装せずに、安全なライブラリやフレームワークの機能を用いることを推奨します。

体系的に学ぶ 安全なWebアプリケーションの作り方 第2版

この記事では、PHP, Java, .NET でパスワードを保存するのに適した実装方法を具体的にご紹介します。

ハッシュ関数の実装

BCryptやPBKDF2、Argon2などのハッシュ関数の具体的な実装ライブラリなどは以下のようになります。

PHP Java .NET 備考
BCrypt password_hash

password_verify

(>=PHP5.5.0)

※関数のデフォルト

Spring Security BCrypt.NET

(MIT)

主要なBCrypt関数はパスワードの72文字以降を切り捨てる模様。

(参考)BCryptのすすめ - Qiita

PBKDF2 hash_pbkdf2

(>=PHP5.5.0)

Spring Security Rfc2898DeriveBytes

(.NET)

Argon2 password_hash

password_verify

(>=PHP5.5.0)

- -

ハッシュ関数の実装例(PHP)

PHPでパスワードのハッシュ値を取得するには、password_hash 関数を使用します。

オプションで PASSWORD_DEFAULT と指定することで、BCrypt を使用できます。

ハッシュ値の出力例は以下のようになります。

パスワードをチェックするには password_verify 関数を使用します。

以下のソースで、$password にはユーザーが入力したパスワードを、$hashにはデータベースに格納されているユーザーのハッシュ値を指定します。

実行結果は以下のようになります。

ハッシュ関数の実装例(Java)

Java でパスワードのハッシュ値を取得するには、Spring Framework の Spring Security の機能を使用することがよいでしょう。

Spring Framework は現在デファクトスタンダードですし、活発に開発が行われているので信頼性が高いためです。

pom.xml の設定

Spring Framework でパスワード用のハッシュ関数を使用するには、pom.xml に以下の設定を追加する必要があります。

 

BCrypt の実装

BCrypt の Spring Security の実装は以下のようになります。Spring Boot での実装ですが、パスワードの部分は非常に簡単に実装できることが分かると思います。

このコードの実行結果は、以下のようになります。

 

PBKDF2 の実装

PBKDF2 は BCrypt とほとんど同じ実装で実現できます。

PasswordEncoder が変わるだけです。

実装コードは以下のようになります。

このコードの実行結果は、以下のようになります。

ハッシュ関数の実装例(.NET)

BCrypt

.NET で BCrypt の実装を行うには、BCrypt.Net (MIT ライセンス) を使用することが簡単です。

以下の実装は、.NET Core 2.1 のコンソールアプリケーションに、Nuget から BCrypt.Net-Next をインストールしたものになります。

実行結果は以下のようになります。

PBKDF2 の実装

.NET で PBKDF2 を実装するには、System.Security.Cryptography.Rfc2898DeriveBytes を使用します。

.NET の標準機能で実装できますが、若干手間がかかります。

ソルトとハッシュ値の両方を保存する必要があります。

以下の実装は、.NET Core 2.1 のコンソールアプリケーションになります。

実行結果は以下のようになります。

おわりに

パスワードを保存するのに適したハッシュ関数である BCrypt、PBKDF2、Argon2とその実装(PHP, Java, .NET) を見てきました。

この内容をまとめてある記事はあまりないと思うので、参考になれば幸いです。

また、この記事を書くにあたり、関連する記事のアップデートも行いました。

 


スポンサーリンク




カテゴリー:ブログ

Twitter でも、いろんな情報を発信しています。



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA