關於PHP中token的生成的解析

關於PHP中token的生成的解析

 

背景

很多時候我們需要用 token 來作爲一些標識, 比如: 一個用戶登錄後的認證標識.

實現方式

md5 的方式:

1

2

3

4

$v = 1; // 自己定義的 需要hash 的value 值

$key = mt_rand(); // 這裏用 隨機串作爲key

$hash = md5($key . $v . mt_rand() . time());

echo $hash;

執行結果: b63426a38f86b726ce0d327d48e47376 看着不是很舒服, 作爲強迫症的我 是受不了的.

md5 + base64 的方式

1

2

3

4

5

$v = 1;

$key = mt_rand();

$hash = md5($key . $v . mt_rand() . time());

$token = base64_encode($hash);

echo $token;

執行結果: MWQyMjE2NmI3NDA1MmRjZTQwOTQzZDZjMWU1OTE5OGU= 看着稍微舒服些了, 但是還不夠好, 反觀微信的 openid , 一般是不會有後面的 = 號的

優化

1

2

3

4

5

$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 的方式

1

2

3

4

5

$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, 這顯然不是我們想要的

繼續優化

1

2

3

4

5

$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了, 看着也舒服些了, 我目前是這樣用的...

但是這是不是最優方案呢?

目前沒發現什麼更好的方案, 只是說出了我認爲的比較好的方案

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章