私は小さなコミュニティWebサイトを持っていますが、何らかの忘れられたパスワード機能を実装する必要があります。私は現在、パスワードを MD5
。
「復号」を並べ替えてメールでユーザーに送信することは可能ですか、それともパスワードリセットページが必要ですか?
MD5ハッシュパスワードは元に戻せません。 (MD5はハッシュであり、実際には暗号化されていないため、微妙な違いがあります)。そしてyesパスワードの「リセット」プロセスを提供することは間違いありません(パスワードをメールで送信するだけではありません)。
安全なパスワードリセットのための高レベルのワークフローを提供するには...
ハッシュについてもう少し詳しく説明するには...
PHPのmd5()関数を使用してパスワードのような値をハッシュすると、最終的な値は、実行するサーバーに関係なく、そのパスワードに対して同じになります。 (つまり、ハッシュと暗号化の間にすぐにわかる違いが1つあります。秘密鍵と公開鍵は関係ありません)。
そのため、人々は Rainbow tables に対する脆弱性について言及していることがわかります。レインボーテーブルの非常に基本的な説明は... md5()ハッシュ値を取得するために、md5()が辞書の単語(弱いパスワード)をハッシュします。それらをデータベーステーブル(レインボーテーブル)に入れます。
これで、Webサイトのデータベースを危険にさらした場合、Rainbowテーブルに対してユーザーのハッシュされたパスワードを実行して、ハッシュを(本質的に)パスワードに「逆変換」できます。 (あなたは実際にハッシュを「逆にする」わけではありません...しかし、あなたはアイデアを得ます)。
そこで、パスワードを「塩漬け」するのがベストプラクティスです。これは、(ここでも非常に基本的な考え方です)ハッシュする前に、ユーザーのパスワードにランダムな値を追加することを意味します。これで、Rainbowテーブルがデータベースに対して実行されると、「password」のmd5()ハッシュが「password384746」とは異なるため、「逆転」しにくくなります。
Nice SO役に立つQ/Aです。 PHP passwords
この投稿によると、 フォームベースのWebサイト認証の決定的なガイド 、ステップ3および4について、保存している同じトークンを送信する必要があるかどうかはわかりません。
トークンを送信してからハッシュし、ハッシュされたトークンをDBに保存する必要があると思います。そうしないと、データベースが危険にさらされた場合、パスワードのリセットページにアクセスできます。
要約する :
$token = md5(microtime (TRUE)*100000);
$tokenToSendInMail = $token;
$tokenToStoreInDB = hash($token);
ここで、hashはハッシュアルゴリズムです。
あなたが行うための最善のことは、登録時に人々が自分のメールアドレスを提出することを要求することです。次に、忘れてしまった場合は、パスワードを忘れた場合に、パスワードをランダムな値にリセットしてパスワードをリセットします。この値は電子メールで送信されるため、アクセスしてパスワードをより思い出深いものに戻すことができます。このようにして、セキュリティを侵害する必要はありません。ユーザー名を送信するだけのリンクを用意することもできますが、セキュリティを高めるために、質問と回答または覚えやすいWordを用意する必要があります。
パスワードを復号化することはできません。また、プレーンテキストを介してユーザーにパスワードを送信することも検討すべきではありません。 (これが私がサイトを二度と使用しないようにする一番の方法です。これは巨大なセキュリティホールです。)ユーザーのパスワード回復メールに送信される時間関連キーを含むリンクからトリガーされるパスワードリセットページを提供します;これがパスワード回復の最新技術です。
Marcus Reedが述べたように、2015/2016でPHP version> = 5.5を使用している場合、MD5を使用しないでください。password_hash()およびpassword_verify()は、コストを提供し、ハッシュを自動的にソルトする機能。
私は現在投票したりコメントしたりする能力を持っていないので、混乱を避けるために明確な声明を提供しています。
MD5は、一方向ハッシュにすることを目的としています。パスワードをリセットする必要があります。
組み込みのpassword_verifyおよびpassword_hashのphpを使用します。
取得パラメータとしてmd5と電子メールアドレスを受け入れるページを作成し、電子メールとmd5のパスワードをデータベースで検索します。 Jared Cobbのメモに続いて、それは正しい道を歩むはずです。私もいくつかの例を追加しました
例:送信するURL http://yourdomain.com/resetpassword.php?code=md5codesentviaemail
$code = isset($_GET['code']) ? $_GET['code'] : '';
$email = isset($_GET['email']) ? $_GET['email'] : '';
$checkPw = '';
if(empty($code) || empty($email))
{
die();
}
$sqlQuery = 'SELECT * FROM users WHERE email = "'.$email.'";
//remember to check for sql injections
//then get the results as an array, i use a database class eg $user
if(!empty($user['password']))
{
$checkPw = md5($user['password']);
}else
{
die();
}
if($checkPw !== $code)
{
die();
}else
{
//display form for user to change password
}
これは、ユーザーが有効なユーザーであることを知り、パスワードを変更するのに十分なはずです
いいえ、解読できません。それが全体のアイデアです。
一時パスワードを送信し、パスワードをリセットする必要があります。
パスワードリセットページを実行する必要があります。 PHPでMD5を復号化する方法はありません。
MD5
は一方向の関数です。解読できません。 SOパスワードリセットページが必要です。