私は小さなコミュニティサイトを運営しており、パスワードを忘れた場合の機能を実装する必要があります。現在、パスワードはDBに保存されており、MD5
。
ある種の「復号化」を行ってユーザーに電子メールで送信することは可能ですか、それともパスワード リセット ページが必要ですか?
ベストアンサー1
MD5ハッシュパスワードは元に戻せません。(MD5はハッシュであり、実際には暗号化ではないため、微妙な違いがあります)。そしてはいパスワードを「リセット」するプロセスを必ず提供する必要があります(単にパスワードを電子メールで送信するのではなく)。
安全なパスワード リセットのための高レベルのワークフローを提供します...
- ユーザーがパスワードのリセットを要求したら、メールアドレスを入力するようにする
- そのメール アドレスが有効かどうかは示さないでください (メールが送信されたことだけを伝えてください)。これは、ユーザビリティを低下させる (つまり、どのメール アドレスで登録したかがわからない) ため議論の余地がありますが、実際にどのメール アドレスがサイトに登録されているかに関する情報を収集しようとしているユーザーに提供する情報が少なくなります。
- トークンを生成し(ソルトを使用してタイムスタンプをハッシュするなど)、ユーザーのレコード内のデータベースに保存します。
- ユーザーにhttpへのリンクを添えたメールを送信するsリセット ページ (URL にトークンとメール アドレスが含まれます)。
- トークンとメールアドレスを使用してユーザーを検証します。
- 古いパスワードを置き換えて、新しいパスワードを選択できるようにします。
- さらに、一定の時間(通常は 24 時間)が経過すると、それらのトークンを期限切れにすることをお勧めします。
- オプションとして、「忘れられた」試行が何回発生したかを記録し、大量のメールをリクエストしている場合には、より複雑な機能を実装することもできます。
- オプションとして、リセットを要求した個人の IP アドレスを (別のテーブルに) 記録します。その IP からカウントを増やします。たとえば、10 を超える場合は、今後の要求を無視します。
ハッシュについてもう少し詳しく説明します...
PHP の md5() 関数を使用してパスワードなどの値をハッシュすると、どのサーバーで実行しても、そのパスワードの最終値は同じになります。(ハッシュと暗号化の間には、すぐにわかる違いが 1 つあります。それは、秘密鍵や公開鍵が関係していないことです)。
ここで脆弱性について言及する人が出てきますレインボーテーブルレインボー テーブルの基本的な説明は、一連の辞書の単語 (弱いパスワード) を md5() ハッシュして、それらの md5() ハッシュ値を取得することです。それらをデータベース テーブル (レインボー テーブル) に格納します。
さて、Web サイトのデータベースが侵害された場合、ユーザーのハッシュ化されたパスワードをレインボー テーブルに対して実行して、ハッシュを (本質的に) パスワードに「逆変換」することができます。 (実際にハッシュを「逆変換」しているわけではありませんが、その意味はわかります)。
そこで、パスワードに「ソルト」を加えるのがベストプラクティスです。これは(これも非常に基本的な考え方ですが)ユーザーのパスワードにランダムな値を追加することを意味します。前にハッシュします。これで、レインボー テーブルがデータベースに対して実行されると、「password」の md5() ハッシュが「password384746」と異なるため、簡単に「逆引き」できなくなります。
役に立つと思われる、すばらしい SO Q/A がここにあります。PHP パスワードの安全なハッシュとソルト