メール確認用の一意の ID を作成する必要があるため、顧客がリンクをクリックするとメールを入力するページに移動し、メールを入力するとメールが送信されます。メールにはリンクが含まれており、リンクにアクセスすることでパスワードを変更できます。そのプロセスですが、私の手順を確認する必要があります。最初に乱数を生成し、ユーザーの ID に関連付けられたデータベースに追加します。そのページが開かれたら、パスワードを変更できるようにしますか?
4 に答える
手順はほぼ正しいです。ただし、次の点に注意する必要があります。
1)キーを予測できないようにして、コードの知識があっても、誰もそれ自体の有効なキーを作成できないようにします。とにかくデータベースにキーを保存しているので、「本当にランダムな」キーを作成できます。これは、電子メールやユーザーIDなどの既知の値を使用するよりもはるかに優れています。パスワードリセット機能は、多くの場合、Webアプリケーションのセキュリティにおける最も弱いリンクです。
// this (untested) code reads from the OS random source to create a random id
function createRandomKey($length)
{
$buffer = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM);
$encodedBuffer = base64_encode($buffer);
return substr($encodedBuffer, 0, $length);
}
2)このランダムキーをデータベースに直接保存するのではなく、パスワードのように扱い、そこからハッシュを保存します。これは、攻撃者がデータベースを読み取ることができる場合(SQLインジェクション)に役立ちます。それでも、攻撃者はすべてのキーを無料で取得することはできません。
3)各キーに有効期限を設定して、「忘れた」キーを使用できなくなるようにします。
4)パスワードリセットキーは使用後に削除する必要があるため、パスワードが正常に変更されたらデータベースから削除してください。
編集:
申し訳ありませんが、あなたの質問でJavaタグを見逃しました。私の例は、PHPです。残念ながら、Javaで例を提供することはできませんが、原則は同じです。
これにはjava.util.UUIDを使用します。
これにはPHPを使用しました。私は通常、後で確認できる追跡情報のハッシュを作成しました。電子メール アドレスまたはユーザー ID で MD5 または SHA1 ハッシュを使用するように。または、必要に応じて、2 つを組み合わせることができます。
Java スクリプト:hex_md5(random_number + user_id + something_else);
PHP:md5($email.$userID.$unique_server_key);
これにより、それらを追跡するための一意のキーが得られます。これを生成に使用した変数と同様にデータベースに保存して、後で追跡できるようにします。サーバー側であるため、悪意のあるユーザーがトークン生成アルゴリズムを知るのを防ぐのに役立つため、PHP バージョンを強くお勧めします。
JavaScript ハッシュ ライブラリ: http://pajhome.org.uk/crypt/md5/
編集:申し訳ありませんが、私も間違った言語を想定していました。Java の場合、暗号ライブラリを使用してハッシュを生成する必要があります。このコードを試してください(テストされていません。入力しただけです)
import java.security.*;
.....
string hash = unique_salt_key.concat(user_id).concat(email);
byte[] hashBytes = hash.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] emailCrypt = md.digest(hashBytes);
string emailToken = new String(emailCrypt)
それがMD5の正しい使い方だと思います。変数 user_id と email は、データベースに既に保存されているため、使用するだけです。そして、データベースから複数の定数を使用するのが最善です。私のJavaで少し錆びていたらごめんなさい。
import java.security.*;
.....
string hash = unique_salt_key.concat(user_id).concat(email);
byte[] hashBytes = hash.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] emailCrypt = md.digest(hashBytes);
string emailToken = new String(emailCrypt)
How to decrypt it again to get user_id and email?