PHPにおけるtokenの生成の解析について


PHPにおけるtokenの生成の解析について
.
 
背景
多くの場合、tokenをいくつかの識別子として使用する必要があります.例えば、ユーザーがログインした認証識別子などです.
インプリメンテーションモード
md 5の方式:
1 2 3 4 $v = 1; // hash value $key = mt_rand(); // key $hash = md5( $key . $v . mt_rand() . time()); echo $hash ;
実行結果:b63426a38f86b726ce0d327d48e47376 は見ていて気分が悪く、強迫症の私には耐えられない.
md 5+base 64の方式
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はそんなに長くありません.
種を変えてみる
sha 1+base 64の方式
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はできません.見ていても気持ちがいいです.私は今このように使っています.
しかし、これは最良の案ではないでしょうか.
今のところもっと良い案は見つからないが、私が考えているより良い案を言っただけだ.