- トークンはユニークにしたい。(衝突は知らない・・・)
- トークンはURLセーフにしておいた方が良い。
- トークン自体はユーザーに教えるために出力しないといけないので復号できなければならないので、DBに保存する際は暗号化。
- セッションやKVSに一時的に保持するような長期間使わないようなもの(有効期限付きURLアクセスのトークンとか)は暗号化はしなくても良いと思う。
- 一度きりの画面表示の場合はハッシュ化したものを保存して付け合わせれば良いので暗号化は不要です。
$token = hash_hmac('sha1', uniqid(bin2hex(random_bytes(20))), 'key');
// ここで$tokenを暗号化して$encrypted_tokenを作る処理を記述
$token_pair['token'] = $token;
$token_pair['encrypt_token'] = $encrypt_token;// こっちをDBで保持
チェックは$token
を暗号化してDBに登録した$encrypt_token
を検索して取得できるかで判断
ハッシュ化しない例
var_dump(uniqid(), uniqid(bin2hex(random_bytes(20))));
string(13) "5c6d73835289f"
string(53) "5f583b866a5e252acfcc5b2321ac3951941447b75c6d7383528a5"
uniqidのみだと時間を元に出しているのでランダムな文字列になりません。5c6d7383528
が共通
ハッシュ化した例
var_dump(hash_hmac('sha1', uniqid(bin2hex(random_bytes(20))), 'key'));
var_dump(hash_hmac('sha256', uniqid(), 'key'));
string(40) "5d893e491a7ec752c05acc7602cab9f9adeb1b5c"
string(64) "6f3bd3a96ac0ddf7210f6f7b9cddd41c92d1992aac8bb562eee3aa9e0eea7576"