メール確認コードとしてユーザーに送信する文字列を作成している次のスニペットがあります。
$confirmation_code = $user_id . time() . date('d-m-Y',time());
$confirmation_code = sha1($confirmation_code);
$confirmation_code
どのステップでも重複する可能性はありますか?
注:$user_id
各ユーザーに固有のものであることを覚えておいてください
メール確認コードとしてユーザーに送信する文字列を作成している次のスニペットがあります。
$confirmation_code = $user_id . time() . date('d-m-Y',time());
$confirmation_code = sha1($confirmation_code);
$confirmation_code
どのステップでも重複する可能性はありますか?
注:$user_id
各ユーザーに固有のものであることを覚えておいてください
ユーザーごとに一意であることを考えると$user_id
、これは (理論的には) 確認コードが決して衝突しない (「一意でない」) ことを意味するはずです。
ただし、実際には、SHA1 ハッシュが衝突する可能性があります (詳細については、この MSDN ブログ記事を参照してください)。
したがって、この質問をしている理由がUNIQUE
、データベースに列を作成するかどうかを決定できるようにするためである場合は、しないでください。
はい、毎秒ユーザーごとに複数のコードを生成しない限り、コードは一意である必要があります。また、非常に予測可能です。攻撃者がユーザーの ID と、コードが生成されるおおよその時間を知っている場合、コードを推測するのは簡単です。攻撃者に無制限の推測が許可されている場合、大まかな時間であっても、過去 2 年間の有効なコードをすべて簡単に試すことができるため、問題にはなりません。
かなり静的なデータに基づくコードではなく、 (疑似) ランダムコードを実際に生成する必要があります。Linux では、以下から読み取るだけです/dev/random
。
$code = bin2hex(file_get_contents('/dev/random', false, null, -1, 32));
^^
desired length/2