Webユーザーログイン時のパスワードのハッシュ化と検証

ビジネスアプリケーションが Web からアクセスされることが多くなり、その結果、脅威に晒されるようになったため、セキュリティはますます重要なトピックになってきています。4D は、セキュリティに細心の注意を払っており、4D v16 R5 では、いくつかのセキュリティの改善を提供しています。その一つが、ハッシュ化によるユーザーパスワードの保護です。

なお、4D がどのようにデータ保護や一般的なセキュリティに貢献しているか、もっと知りたい方は、こちらのブログ記事をご覧になることをお勧めします。

なぜパスワードはハッシュ化されるべきなのか?

具体的な例を挙げましょう。あるビジネスアプリケーションがあり、ユーザーは名前とパスワードをダイアログに入力することでサインインします。サインインしたユーザーは、他のテーブルやフィールドを読み書きするなどの “特別な権限” を得る場合があります (たとえば、人事部は従業員の給与テーブルにアクセスできますが、従業員自身にはアクセスできません)

サーバーは、ユーザーパスワードの検証に使用できる “何か” を保存しておく必要があります。最も基本的な “何か” は、パスワードそのものです。しかし、データベースに保存された安全でないパスワードは、盗まれ、アプリケーションとデータを危険にさらしかねません。ユーザーパスワードをデータベースに保存する前にハッシュ化すると、元のパスワードは見つからず、復号化もできません。しかし、ハッシュと元のパスワードを比較することで、有効性を確認することはできます。

ハッシュ化か暗号化か?

まず注意すべきは、暗号化されたパスワードと言いながら、実際にはハッシュ化されたパスワードを意味する人が多いということです。

暗号化はアルゴリズムを使ってデータを暗号化し、鍵によって復号化することで元のデータを取り出します。ハッシュ化では、一度データが暗号化されると、元のデータを取り出す方法はありません。したがって、パスワードは暗号化せず、ハッシュ化するべきです。

パスワードのハッシュ化すると、パスワードそのものを保存しないため (復元できなくてもパスワードを検証するのに十分なデータの一部だけが保存される)、パスワードを忘れたユーザーにそのパスワードを送り返すことができません。そのような場合には、新しいランダムな仮パスワードを発行するか、ユーザーに新しいパスワードを登録させる必要があります。

ハッシュ化に使うアルゴリズム

MD5 や SHA などのアルゴリズムは非常に高速ですが、総当たり攻撃に弱いため、パスワードのハッシュ化には使用するべきではありません。bcrypt アルゴリズムは、設計上低速であり、低速であることを目的としているので、パスワードのハッシュ化には最適です。より詳しい情報は、Coda Hale の記事 “How to safely store a password” (英文) をご覧ください。

パスワードハッシュ化のコマンド

ハッシュ化されたパスワードを生成し、検証するための新しいコマンドが 2つ作成されました。これらのコマンドは、bcrypt アルゴリズムを採用しています。

  • 新しいユーザーがパスワード “myPassword” でアカウントを作成します。新しい Generate password hashコマンドでパスワードをハッシュ化し、そのハッシュパスワードをデータベースに保存しました。

$varHash:=Generate password hash("myPassword")
[User]Login:=$varLogin
[User]HashPassword:=$varHash
SAVE RECORD([User])

  • ユーザーが接続しようとしたとき、パスワードを入力します。そして、ユーザーが入力したパスワードとデータベースに保存されているハッシュパスワードの有効性を新しい Verify password hash コマンドでチェックします。

C_TEXT($varLogin;$varPassword) // ユーザーが入力したログイン情報
QUERY([User];[User]Login;=;$varLogin)
If (Records in selection([User])=1) 

    // パスワードとハッシュパスワードを比較します
    If (Verify password hash($varPassword;[User]HashPassword))  
        SendToUser("ログインしました。ようこそ、 "+$varLogin+"さん。") 
    Else  
        SendToUser("パスワードに誤りがあります。")
    End if

Else
    SendToUser("ログイン情報に誤りがあります。")
End if

Vanessa Talbot
- プロダクトオーナー - Vanessa Talbotは、2014年6月に4Dプログラムチームに参加しました。プロダクトオーナーとして、彼女はユーザーストーリー(ユーザーが期待する新機能とその使用法)を書き、それを具体的な機能仕様に変換する役割を担っています。また彼女の役割は、実装された機能が顧客のニーズを満たしているかどうかを確認することでもあります。入社以来、4Dにおける主要機能の定義に関わってきました。プリエンプティブ/マルチスレッドの新機能の大部分と、非常に複雑なテーマである組み込みアプリケーションの新アーキテクチャに取り組んできました。VanessaはTelecom Saint-Etienneで学位を取得後、Criminal Research Institute でオーディオビジュアル部門の開発者としてキャリアをスタートさせました。また、メディアや医療の分野でも、技術サポートやプロダクションの分野で働いてきました。