認証にDeviseを使用してRailsのWebサイトを作り直しています。以前のWebサイトは、md5パスワードを持つユーザーのデータベースで動作するため、このパスワードをDeviseが使用する暗号化に移行したいと思います。どうすれば解決できますか?
4 に答える
Oleksiとjosnidhinは、あなたの質問に答えるのに素晴らしい仕事をしました。移行フェーズで何をすべきかについて、いくつかのアイデアを追加したかっただけです。
DBを2つの「パスワードハッシュ」列に移行します。1つは既存の古いMD5ハッシュを含み、もう1つは新しいbcryptハッシュ用で、最初はすべてNULLで埋められます。次回ユーザーがログインするときは、次の手順を実行します。
1)bcrypt列にすでに値があるかどうかを確認します。その場合は3に進み、そうでない場合は2に進みます。
2)MD5列の値を使用して、古いMD5メカニズムでユーザーを認証します。成功した場合は、さらに新しいbcryptハッシュを計算し、それを新しい列に保存します。終わり。
3)brypt値を使用してユーザーを認証します。MD5値は無視してください。
次に、時々、新しいbcrypt列がいっぱいになっているかどうかを確認します。その場合は、MD5列を破棄し、新しいメカニズムのみを使用するようにアプリを更新します。
しかし、それは希望に満ちた考えです。その間にログインしていないユーザーが常にいます。あなたが何をしているのか、それが彼らの最善であると彼らに伝えるメールを彼らに送ってください、そして彼らにすぐにログインするように親切に頼んでください。
数週間後、bcryptのステータスをもう一度確認してください。それでもパスワードが不足している場合(:))、これらのユーザーのパスワードをリセットし、ランダムに生成してメールで通知するだけです。これは、ユーザーがパスワードを忘れた場合と同じです。
次に、最終的にMD5列を削除し、対応するコードを破棄して、新しい認証のみを使用するようにアプリをアップグレードできます。
別の解決策があります:
- bcrypt 列を追加します。
- bcrypt アルゴリズムを使用して MD5 ハッシュを実行し、bcrypt 列に入力します。
- ログインを変更して、常にbcrypt 列とハッシュ関数を使用するようにします
plain text->md5->bcrypt
。
このようにして、すべてのパスワードを一度に移行し、MD5 ハッシュを完全に破棄できます。これを自分で行うことを考えると、このアイデアで欠点を見つけることはできません。テイカーはいますか?明らかな何かが欠けていますか?
md5ハッシュを別の種類のハッシュに変換する方法はありません。古いシステムを使用してユーザーにログインさせてから、新しい方法を使用してユーザーが指定したパスワードをハッシュする必要があります。新しいハッシュを取得したら、古いmd5ハッシュを削除できます。
古いパスワードを使用してログインするようにユーザーに依頼し、それを変更する必要があります。たとえば、bcryptを使用してパスワードを保存する強制的なパスワード変更ページを表示します。新しいパスワードが与えられたら、システム内の古いパスワードを無効化/削除できます。