2

メール確認用の一意の ID を作成する必要があるため、顧客がリンクをクリックするとメールを入力するページに移動し、メールを入力するとメールが送信されます。メールにはリンクが含まれており、リンクにアクセスすることでパスワードを変更できます。そのプロセスですが、私の手順を確認する必要があります。最初に乱数を生成し、ユーザーの ID に関連付けられたデータベースに追加します。そのページが開かれたら、パスワードを変更できるようにしますか?

4

4 に答える 4

3

手順はほぼ正しいです。ただし、次の点に注意する必要があります。

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で例を提供することはできませんが、原則は同じです。

于 2013-01-29T08:27:46.940 に答える
3

これにはjava.util.UUIDを使用します。

于 2013-01-29T06:39:50.103 に答える
0

これには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で少し錆びていたらごめんなさい。

于 2013-01-29T06:02:17.997 に答える
0
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?
于 2016-09-06T07:16:34.240 に答える