« 秋ですね | Home | カミングアウト »

[Tech]   パスワードの保存方法

お仕事でパスワードによる認証があるサービスを立ち上げるにあたって、お客さんがパスワードを忘れたときのパスワードの救済措置(いわゆる、「パスワードを忘れましたか?」とか「パスワードリマインダ」ってやつです。)をどーするか、ちょっとした議論(そもそも要件で決めて置けという話もありますが)になったのでまとめてみました。

パスワードの保存方法として大きく三つ考えられます。

1. そのままの文字列として保存

・認証
ユーザーが入力した文字列と同じかどうか比較するだけです。

・リマインダ
文字列がそのまま保存されているのでそのまま送ればユーザーはそれを使ってログインできます。

・問題点
パスワードがそのまま保存されているのでデータベースなどを盗まれたらだだ漏れします。

2. 秘密鍵を使って復号可能なアルゴリズムで暗号化して保存

・認証
復号できるので保存されているパスワードを復号化してユーザーが入力した文字列を比較するか、ユーザーが入力した文字列を同じ秘密鍵で暗号化して比較すれば認証できます。

・リマインダ
復号化してからユーザーに送れば1.と同じです。

・問題点
秘密鍵と暗号アルゴリズムが漏れれば1.と同じリスクの可能性があります。また秘密鍵を忘れた場合認証そのものが出来なくなるし、秘密鍵を変更する場合は既存のパスワードを全て暗号化しなおす必要があります。

3. ハッシュ関数を使ってハッシュ値を保存

・認証
ハッシュ関数を使うと元の文字列を復号化するのは不可能なので、ユーザーが入力した文字列を同じハッシュ関数でハッシュ値を計算して保存されているハッシュ値と比較して認証します。

・リマインダ
復号化できないので、現在のパスワードを送ることは出来ません。代替策としてパスワードの再設定ページへのURLをワンタイムパスワードと絡めて生成して送るか、新たにランダムなパスワードを作成して送る必要があります。

・問題点
パスワードを忘れたユーザーはパスワード再設定を行う必要があります。(自動生成されたパスワードもランダムで覚えられないので、これも普通は変えるでしょうから同じです。)

こんな感じでしょうか。
他にもあったら教えてくださいな。

Trackbacks:

このエントリーのトラックバックURL:

コメントを投稿