My PHP powered websiteでの登録の場合、メールでの確認が必要です。ユーザーが登録すると、次のコードで文字列が生成され、メールアドレスに送信されます。
$key = md5(mt_Rand(1000,999999).$_POST['email']);
その文字列もデータベースに保存され、ユーザーが確認ページに正しいキーを貼り付けると、アカウントが検証されます。
私が使用したキー生成コードは安全ですか?のように、キーを取得した場合に元のメール文字列を確認する方法はありますか?
短い回答:いいえ、キーの生成は安全ではありません。はい、攻撃者はコードからメールを見つけることができます。
非常に弱い乱数生成のため、攻撃者は任意の電子メールアドレスのアクティベーションコードを取得できます。 mt_Rand()
はこの目的には適していません 、それに加えて、システムの状態に関するいくつかの情報(生成時間など)を知ることで得られる利点。これにより、各電子メールの潜在的なキーのスペースを大幅に減らすことができます。
他の点については、メールがキーからブルートフォースされる可能性があることはそれほど大きな問題ではないと思います。それはあなたの心配事の最小のものであるべきです。鍵はおそらく存続期間が短く、電子メールアドレスにのみ送信されます。メールアドレスの所有者に自分のメールアドレスを見つけてもらうのは簡単です。
ただし、はい、キーからメールを総当たりすることはそれほど難しくありません。主な理由は、電子メールがランダムに生成されることはほとんどなく、辞書に他の組み合わせが存在する可能性が非常に高いためです。あなたの乱数はあなたに約100万の組み合わせを与えます、それは非常に低いです。
「どうすればもっと上手にできるのですか?」と尋ねます。とても簡単です。選択した言語で提供されている安全な乱数生成メソッド/ APIを使用します。あなたの場合、PHPでは openssl_random_pseudo_bytes()
を利用できます。ここにあなたの便宜のための例があります:
$activationKey = bin2hex(openssl_random_pseudo_bytes(16)); //128-bit
キーを生成してユーザーに送信したら、キーのハッシュをデータベースに保存します。ほとんどすべてのハッシュ関数で十分ですが、SHA-1をお勧めします。アクティベーションリンク/キーを使用する場合は、ハッシュ化してデータベースのエントリと比較するだけです。その後、アカウントをアクティブにしてキーを無効にすることができます。
のように、キーを取得した場合に元のメール文字列を確認する方法はありますか?
攻撃者がすでにMD5ハッシュ値を取得している(つまり、キーを取得している)場合、オフライン攻撃が可能になります。
oclHashcat 8x AMD R9 290Xstockコアクロックを使用すると、毎秒800億を超える(Bを使用した)テストでMD5試行を生成でき、乱数は100万を少し下回るので、これらのGPUを使用するoclHashcatは80,000をテストできます毎秒異なるメールアドレス。
電子メールアドレスは非常に予測可能であり、パスワードとして一般的に使用されることはなく、通常は公開情報と見なされ、以前のデータ侵害やメーリングリストの記録から大量に入手でき、販売などのため、非常に脆弱です。ルールベースの辞書攻撃と組み合わせ攻撃(a-z +姓+ @ hotmail.com、@ yahoo.com、@ gmail.comなど)。
さらに、フロントとエンドの数字は一般的なパスワードトリックであるので、ルールベースの辞書攻撃とそのようなものをチェックするマスク攻撃はすでに一般的に使用されています。
したがって、はい、メールアドレスが十分に一般的である場合、送信したハッシュだけからメールアドレスを見つけることができます。
Rand()は十分にランダムではないため、ハッシュの生成はそれほど問題にはなりません。
ランダムキージェネレーターの場合、linux/unixを使用している場合は、Rand()の代わりに/ dev/urandomから値を取得できます。これは、ユースケースに十分です。
そして、はい、アカウントが検証される有効なハッシュを送信することで、自分のメールアドレスを推測することができます(その時点で、アプリケーションはおそらく、検証ページにメールアドレスまたはユーザーのユーザー名を表示します同じこと)。
ただし、この方法でメールを取得できるにもかかわらず、アプリケーションがそのような条件に対応していない場合は、ログインページやパスワードを忘れた場合のページから推測できるため、それほど問題ではないと思います。もう1つのポイントは、ユーザーが検証された後、検証リンクをデータベースから削除して、攻撃者がそのメールアカウントのメールを推測できないようにすることです。したがって、推定される可能性のある電子メールアカウントは、アクティブではない(アカウントがまだ検証されていないため)アカウントか、新しいアカウントです。それでも、電子メールアドレスを取得してもあまり影響はありません単独はあまり効果がありません。
少しおかしいですが、多少関連があるので、これを言う必要があると思います。
それはさておき、ユーザーのアカウントの検証やユーザーの電子メールアドレスの取得を攻撃者に許可することはそれほど大きな問題ではありませんが、ユーザーがアカウントの検証後に直接ログインすることを許可すると、攻撃者は悪いユーザーのアカウント(残念ながら、これもある程度一般的です)。
したがって、適切な方法は、アクティベーション時にユーザーのアカウントのみを検証し、ユーザーがアカウントに直接ログインできないようにすることです。