私は Code Review に関する質問に触発されました:要約すると:データベースなしでユーザーを認証する適切な方法は何ですか?
資格情報を配列、XMLファイル、または単なるプレーンテキストファイルに保存した場合も、まったく同じプロセスでしょうか。
例、次のPHPコードを調べてみましょう:
$credentials = array(
'UserA' => '$2y$10$PassForA',
'UserB' => '$2y$10$PassForB'
);
$username = $_POST['username'];
$password = $_POST['password'];
if (isset($credentials[$username]) && password_verify($password, $credentials[$username])) {
// Successfully authenticated
} else {
// Permission denied
}
これは、資格情報を保存するための完全に受け入れ可能な方法ですか?ユーザー名とハッシュ化されたパスワードを外部ファイル(XML/txt)から取得する場合、状況を異なる方法で処理する必要がありますか?
ユーザー資格情報を保持するXMLファイルisデータベース。データベースの定義は、MySQL(またはあなたが考えていたもの)に限定されません。
ユーザーの認証方法と、ユーザーの資格情報が正確に保存される場所は、2つのまったく別の問題です。 bcryptハッシュは、プレーンテキストファイル、MySQLテーブル、MongoDBドキュメントのいずれに保存されているかに関係なく、bcryptハッシュです。
もちろん、データベースシステムのタイプが異なると動作も異なり、データの更新とロードの方法も異なりますが、これは特にユーザー認証とは関係ありません。これらはデータストレージの一般的な問題です。
データベースなしで認証
これを意味として解釈します
challenge-response system を設計することは可能ですか? principal は、プリンシパルの数に対応するストレージの量を使用せずに、彼らが本人であることを証明できます?つまりO(1) w.r.t.プリンシパルの数であるストレージを使用します。
プリンシパルを認証する1つの方法は、プリンシパルを自分だけまたは自分が知っているものだけを提示させることです。誰かがそれを知っていて、誰かがあなたではないなら、それは彼らです:)
暗号署名 を使用すると、次の文字列(トークン)を生成できます
認証プリンシパルがアカウントへのアクセスをゲートするシークレットを漏らさないことが信頼できる場合は、署名された出力を提供し、署名チェックを使用してそれらを認証できます。
シークレットを漏らさないように信頼できない場合は、とにかくデータベースにハッシュしたパスワードを漏らさないように信頼できないため、単純なユーザーが再生できるシークレットを漏らす可能性はありません。署名よりもパスワードを優先する理由。
単純な署名チェックでは、きめ細かい revocation は提供されませんが、これは承認の問題であり、厳密には認証の問題ではありません。
その方法で認証することは問題ありませんが、本当の秘訣は資格情報の管理と更新を行うことです。ユーザーはどのようにパスワードを変更しますか?そのためにソースを書き換えていますか?
XML、JSON、CSVファイルに保存された認証資格情報は確かに見ました。通常はデータベースで処理される、ファイルの変更時のロックの取得、クラッシュの処理などの手順を実行する必要があります。
参考までに、UNIXパスワードシステムはデフォルトで、「データベース」ではないフラットファイル(/ etc/passwdおよび/ etc/shadow)を認証します。 DBを持つことは、セキュリティではなく、パフォーマンスに関するものです。ユーザーJohnDoeを見つけるために数百万行を調べる必要がある場合、パフォーマンスが低下します。一方、インデックスが適切に作成されたDBでは、同じユーザーをほぼ瞬時に見つけることができます。
これは、ユーザー資格情報を配列に直接保存する場合にも当てはまります。データを永続化する方法と、すべてがハードコードされている場合にレコードを更新する方法を教えてください。
セキュリティページで質問しているので、フラットファイルシステムにパスワードを保存するためのベストプラクティスは何かと質問していると思います。まあ、答えはそれがDBである場合と同じです。パスワードをソルトおよびハッシュして、ファイルが侵害された場合に誰もがすべてのパスワードをリバースエンジニアリングできないようにする必要があります。