2012-05-09 8 views
3

電子メールに入れるために生成する必要があるリンクがあります。ユーザーがこのリンクをクリックすると、電子メールで送信されたコードとユーザーが一致するので、そのユーザーのレコードをプルアップできます。URLに送信される変数のハッシュまたは暗号化

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

基本的には、データベースに格納するためのランダムコードの生成と暗号化方法の最適な方法が必要です。これにより、年とコード(前述)をURLに配置できます。私はPHPとMySQLを使用しています。

あなたはどう思いますか?

+0

そこに心配はありません。URLは、適切にエンコードされている限り、マルチバイトの文字であっても表現できます。 – netcoder

答えて

6

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

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

幸いにも、RFC 4648にbase64urlとして指定された、base64エンコーディングの標準化されたURLセーフバリアントが存在します。ここではPHP、based on this answer by "gutzmer at usa dot net"にこのエンコーディングを使用したデータの符号化および復号のための関数のペアです:

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

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

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


Ps。ランダムトークンを安全に生成するためには、例えば、 this question

+0

base64を使用している場合は、phpのbase64_encode()およびbase64_decode()関数を使用するとどうなりますか? –

+0

@Phil:私はそれらを使用していますが、それらを 'strtr()'と組み合わせてURLセーフ出力を生成する必要があります。 –

+0

@llmariコードを生成するためにそのリンクから取得した擬似乱数のバイトを保存する最も良い方法は何ですか? –

4

希望するハッシュを実行してから、URLに挿入する前に結果をurlencode()にしてください。

関連する問題