5

メールに入れるために生成する必要のあるリンクがあります。ユーザーがこのリンクをクリックすると、システムは電子メールで送信されたコードをユーザーに一致させることを目的としているため、そのユーザーのレコードを取得できます。

ただし、どの暗号化/ハッシュ方法を使用するかはよくわかりません。このサイトの管理システムへのログインには、データベースのPBKDF2をパスワード(ソルトあり)とセッション変数に送信する際のAES暗号化に使用していますが、PBKDF2とAESで使用されている文字かどうかはわかりませんurlと互換性があります。

基本的に、データベースに保存するためのランダムコードをハッシュ/生成する最良の方法と、1年とコード(前述)をURLに配置できるようにする暗号化方法が必要です。それが助けになるなら、私はPHPとMySQLを使用しています。

皆さんはどう思いますか?

4

2 に答える 2

9

ほとんどの暗号化(またはハッシュなど)ルーチンの出力は任意のバイナリデータであり、エンコードせずにURLに安全に含めることはできません。

のように、データを使用urlencode()するだけで十分です。ただし、標準のURLエンコードは、ランダムなバイナリデータをエンコードするための最もコンパクトな方法ではない場合があります。 Base64エンコーディングの方が効率的ですが、+文字を使用しているため、残念ながら完全にURLセーフではありません。

幸い、 RFC4648で「base64url」として指定されているbase64エンコーディングの標準化されたURLセーフバリアントが存在します。これは、「gutzmer at usa dot net」によるこの回答に基づいて、PHPでこのエンコードを使用してデータをエンコードおよびデコードするための関数のペアです。

function base64url_encode($data) {
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

function base64url_decode($data) {
    return base64_decode(strtr($data, '-_', '+/'));
}

(少なくとも現在のバージョンのPHPは=、への入力にパディング文字を必要としないため、デコード機能を少し簡略化しましたbase64_decode()。)


追伸 そもそもランダムトークンを安全に生成するには、たとえばこの質問を参照してください。

于 2012-05-09T12:10:03.713 に答える
6

必要に応じてハッシュを実行urlencode()し、URLに挿入する前に結果を実行します。

于 2012-05-09T09:13:44.783 に答える