6

ある程度まともなユーザーベースを持つPHPアプリケーションがあります。残念ながら、これはずっと sha1($password . $salt) を使用してきたので、bcrypt を優先してそれを捨てたいと思っています。Blowfish ハッシュを取得する良い方法をいくつか見つけましたが、使用すべき変換アプローチについてはまだ確信が持てません。ここに私のオプションがあります:

オプション1

ユーザーがログインするたびに、ハッシュが $2 で始まるかどうかを確認します。そうでない場合は、sha1 であると想定し、ユーザーが入力したパスワードを取得し、その bcrypt ハッシュを取得して、データベース内の古いハッシュを置き換えます。

オプション 2

これを行うために認証クラスを置き換えます。

$hash = password_hash("rasmuslerdorf", sha1($password . $salt));

そうすれば、変換が速くなります。

しかし、正直なところ、私はどちらのオプションもあまり好きではありません。どちらも、削除したいコードベースにレガシーチェックをまだ保持していることを示唆しています。

コーディング標準の観点から、上記の2つのうちどちらが優れているか提案はありますか? または、誰かがより良い解決策を持っていますか?

4

2 に答える 2

2

すべてのパスワード保存システムには、より優れたハッシュ アルゴリズムに切り替えるオプションが必要です。ご想像のとおり、問題は 1 回限りの移行の問題ではありません。BCrypt のような優れたパスワード ハッシュ アルゴリズムにはコスト要素があり、(ハードウェアが高速になるため) 時々このコスト要素を増やす必要があり、移行に必要な手順と同じ手順が必要になります。

Option1 は、ハッシュがひどく安全でない限り (無塩または非常に弱いアルゴリズム)、便利なアプローチです。PHP の新しいパスワード APIには、更新が必要かどうかを判断するための関数password_needs_rehash()もあります。

フォールバックをコードに残すことをお勧めします。これにより、顧客がユーザーに無効なパスワードを提示する手間を省くことができます。ユーザーとして、リンクをクリックしてパスワードを再入力するよう要求する電子メールは好きではありません。ユーザーは、フィッシングのためにそのような電子メールを無視するように教えられています。前に述べたように、コード内でのこのようなフォールバックは悪くありません。パスワードを安全に処理するために必要なステップです。

于 2013-07-11T07:53:25.467 に答える
0

新しい DB 列を追加します。[passNeedSystemUpdate] としましょう。デフォルト値は 1 になります。1 = true または yes で、0 = na です。

最後に到達するまで通常どおりユーザー ログインを処理し、passNeedsSystemUpdate = 1 かどうかを確認するためにチェックを実行します。パスワードの更新が必要な場合は、パスワード フィールドからユーザー入力を取得し、新しいパスワードを passNeedSystemUpdate と共に更新します。 0になります。

注: DB が侵害された場合、または侵害された場合、ユーザーは完全に新しいパスワードを作成する以外に選択肢がありません。上記は、現在の暗号化を sha256 から bycrypt などに変更する場合に使用するロジックのほんの一部です。

于 2016-12-07T14:20:37.627 に答える