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