背景
很多時候我們需要用 token 來作為一些標識, 比如: 一個使用者登入後的認證標識.
實現方式
md5 的方式:
$v = 1; // 自己定義的 需要hash 的value 值
$key = mt_rand(); // 這裡用 隨機串作為key
$hash = md5($key . $v . mt_rand() . time());
echo $hash;
執行結果: b63426a38f86b726ce0d327d48e47376
看著不是很舒服, 作為強迫症的我 是受不了的.
md5 + base64 的方式
$v = 1;
$key = mt_rand();
$hash = md5($key . $v . mt_rand() . time());
$token = base64_encode($hash);
echo $token;
執行結果: MWQyMjE2NmI3NDA1MmRjZTQwOTQzZDZjMWU1OTE5OGU=
看著稍微舒服些了, 但是還不夠好, 反觀微信的 openid , 一般是不會有後面的 = 號的
優化
$v = 1;
$key = mt_rand();
$hash = md5($key . $v . mt_rand() . time());
$token = str_replace(`=`, ``, base64_encode($hash));
echo $token;
執行結果: Yzg4MWU0OTQ0MTRiZTI0YWYwMDJjOTYyODBkNjFmMTM
這下沒有 = 號了, 舒服了些, 但是又太長了, 微信的 openid 可沒這麼長
換種 hash 試試
sha1 + base64 的方式
$v = 1;
$key = mt_rand();
$hash = hash_hmac("sha1", $v . mt_rand() . time(), $key, true);
$token = str_replace(`=`, ``, base64_encode($hash));
echo $token;
執行結果: 7pn0pWzO+/TOoISNtDaewa4CyuXw
是短些了, 可是裡面有 +/ 號, 很多情況下用 get 傳遞時會被 urlcode, urlcode 過後就這樣了 7pn0pWzO%2b%2fTOoISNtDaewa4CyuXw
, 這顯然不是我們想要的
繼續優化
$v = 1;
$key = mt_rand();
$hash = hash_hmac("sha1", $v . mt_rand() . time(), $key, true);
$token = str_replace(`=`, ``, strtr(base64_encode($hash), `+/`, `-_`));
echo $token;
執行結果: JM9AkY7SAIROrJ7fhjIU2ApbMsI
這下不會 urlcode了, 看著也舒服些了, 我目前是這樣用的…
但是這是不是最優方案呢?
目前沒發現什麼更好的方案, 只是說出了我認為的比較好的方案
Vue-cli3.0 + Element UI + ThinkPHP5.1 + RBAC許可權 + 響應式的後臺管理系統