ビジネスアプリケーションが 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