ビジネスアプリケーションがウェブからアクセスされることが多くなり、その結果、脅威に対してより脆弱になるため、セキュリティはますます重要なトピックになってきています。4Dは、セキュリティに細心の注意を払っており、4D v16 R5では、いくつかのセキュリティの改善を提供しています。
ところで、4Dがどのようにデータ保護や一般的なセキュリティに役立っているか、もっと知りたい方は、こちらのブログ記事をご覧になることをお勧めします。
なぜパスワードはハッシュ化されるべきなのか?
具体的な例を挙げましょう。あるビジネス・アプリケーションがあり、ユーザーは名前とパスワードをダイアログに入力することでサインインします。一度サインインすると、ユーザは他のテーブルやフィールドを読み書きするような「特別な権利」を得ることができます(例えば、人事部は従業員の給与テーブルにアクセスできますが、従業員自身にはアクセスできません)。
サーバーは、ユーザーのパスワードを検証するために使用できる「何か」を保存しておく必要があります。最も基本的な “何か “は、パスワードそのものです。データベースに保存された安全でないパスワードは、盗まれ、アプリケーションとデータを危険にさらすために使用される可能性があります。ユーザーのパスワードをデータベースに保存する前にハッシュ化すると、元のパスワードは見つからず、復号化もできません。しかし、ハッシュと元のパスワードを比較することで、有効性を確認することはできます。
ハッシュ化か暗号化か?
まず注意すべきは、暗号化されたパスワードと言いながら、実際にはハッシュ化されたパスワードを意味する人が多いということです。
暗号化はアルゴリズムを使ってデータを暗号化し、鍵によって復号化することで元のデータを取り出します。ハッシュ化では、一度データが暗号化されると、元のデータを取り出す方法はありません。したがって、パスワードは暗号化せず、ハッシュ化する必要があります。
パスワードのハッシュ化の結果、パスワードそのものを保存しないので(復元できないままパスワードを検証するのに十分なデータの一部だけを保存する)、パスワードを忘れたユーザーにそのパスワードを送り返すことができません。その代わりに、新しいランダムなパスワードを選択するか、ユーザーに新しいパスワードを選択させる必要があります。
ハッシュ化にはどんなアルゴリズムを使うの?
MD5やSHAなどのアルゴリズムは非常に高速ですが、ブルートフォース攻撃に弱いので、パスワードのハッシュ化には使用しないでください。bcryptのアルゴリズムは、設計上、低速であることを目的としているので、パスワードのハッシュ化には最適です。より詳しい情報は、Coda Haleの記事「How to safely store a password」をご覧ください。
パスワードのハッシュ化コマンド
ハッシュ化されたパスワードを生成し、検証するための新しいコマンドが2つ作成されました。これらのコマンドは、bcryptアルゴリズムをベースにしています。
- 新しいユーザーがパスワード“myPassword“でアカウントを作成します。newコマンドでハッシュパスワードを生成し Generate password hashコマンドで生成し、そのハッシュパスワードをデータベースに保存しました。
$varHash:=Generate password hash("myPassword")
[User]Login:=$varLogin
[User]HashPassword:=$varHash
SAVE RECORD ([User])
- ユーザーが接続しようとしたとき、パスワードを入力します。そして、ユーザーが入力したパスワードとデータベースに保存されているハッシュパスワードの有効性をnewコマンドでチェックする。 Verify password hash コマンドでチェックします。
C_TEXT // Compare the password to the hash password ($varLogin;$varPassword)// information entered by user
QUERY ([User];[User]Login;=;$varLogin)
If (Records in selection([User])=1)
If (Verify password hash($varPassword;[User]HashPassword))
SendToUser("You are connected. Welcome "+$varLogin+".")
Else
SendToUser("パスワードの入力を間違えました。")
End if
Else
SendToUser("ログインの入力を間違えました。")
End if