LoginSignup
5
4

More than 3 years have passed since last update.

PHPでランダムトークン

Last updated at Posted at 2019-02-20
  • トークンはユニークにしたい。(衝突は知らない・・・)
  • トークンは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"
5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4