關於PHP中token的產生的解析

來源:互聯網
上載者:User
這篇文章給大家分享的內容是關於PHP中token的產生的解析,有一定的參考價值,有需要的朋友可以參考一下。

背景

很多時候我們需要用 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了, 看著也舒服些了, 我目前是這樣用的...

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

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.