
通常のWebアプリケーションであれば、パスワードはデータベースに保存します。ただ、そのままDBに保存するのは、セキュリティ上望ましくありません。その対策として、現在はDBにパスワードを保存する際は、ハッシュ関数を使ってハッシュ(digest)化させるのが普通になっています。
そもそもハッシュ化(digest)とは?
関数を使って、パスワードを別のもの(固定長の疑似乱数)に変換します。別のものになるので、元に戻せませんが、また関数を使えば元に戻せます。「元のパスワードが取り出せないよう」にしつつ、「パスワードが正しいか判定できる」ことを両立したのが「ハッシュ化」になります。関数に関しては、通常は各プログラミング言語の機能としてあります。
ハッシュの特性
- 入力データが同じであれば、常に同じメッセージダイジェストが生成される。
- 入力データが少しでも異なっていれば、生成されるメッセージダイジェストは大きく異なったものになる。
- メッセージダイジェストから元の入力データを再現することが困難(後述するように今は絶対安全ではないです)
ハッシュ化してもセキュリティ的に絶対安全ではない?
ハッシュ化すれば、流出しても大丈夫かというとそうではありません。変換後の値から、元のパスワードを探索するアルゴリズムが出回っているためです。ただ、攻撃者による攻撃も時間がかかるので、その間の時間稼ぎとはなりえます。
ハッシュ化する上での時間を稼ぐ上での対策
また、変換アルゴリズムは、非常に高速なので、それほど時間は稼げません。なので、通常は追加で下記の対策も行います。
ソルト
パスワードに追加の文字列を加えて長くする。
ストレッチ
変換処理を複数回行って処理時間を長くする。
良いハッシュ関数の条件
ハッシュ関数にも色々ありますが、良いハッシュ関数の条件としては、「入力データに対して出力データが予測できないこと」があります。
ハッシュ関数の種類
ハッシュ関数名 | 暗号強度 | ハッシュ長(bit) | 説明 |
---|---|---|---|
MD5 | 低 | 128 | 変換後の値から、元のパスワードを探索するアルゴリズムが発見されているので危険です。 |
SHA-1 | 中 | 160 | 変換後の値から、元のパスワードを探索するアルゴリズムが発見されているので危険です。 |
SHA-2 | 高 | 224、256、384、512 | まだ、解析されていないので、他のハッシュ関数に比べたら安全です。新しいプログラムを作成する際は、これを使いましょう。
ハッシュ長によりSHA-224、SHA-256などとも呼びます。SHA-224は暗号強度が低いため非推奨になっている。 |
Javaにおけるハッシュ化関数
通常は、自分で複雑なプログラムを考えて書くのは大変です。なので、ライセンス上問題ないアルゴリズム、プログラムを利用することになります。
Javaにおいては、「java.security.MessageDigest」クラスというのが、ハッシュ関数として有名です。
Railsにおけるパスワードのdigest化
has_secure_passwordというRailsのメソッドを使うと簡単にパスワードをdigest化することができます。
必要なgem
「bcrypt」というハッシュ関数を提供するgemが必要になります。
authenticateメソッド
bcryptのauthenticateメソッドによりモデルオブジェクトのパスワードに保管されているパスワードかをチェックすることができます。
確認用パスワードを設定することが普通
パスワードは間違っていたらユーザーがログインできなくなるというトラブルが発生する可能性があります。なので、通常のパスワードとは別に確認用パスワードを入力させる方式と取っているシステムがほとんどです。
この記事へのコメントはありません。