用戶登錄之cookie信息安全
一、cookie信息加密法
cookie信息加密法即用一種加密方法,加密用戶信息,然后在存入cookie,這樣偽造者即使得到cookie也只能在cookie有效期內(nèi)對(duì)這個(gè)cookie利用,無法另外偽造cookie信息。
這里附上一個(gè)加密函數(shù):
<!--?php
function
authcode(
$string
,
$operation
=
'DECODE'
,
$key
=
''
,
$expiry
= 0) {
// 動(dòng)態(tài)密匙長度,相同的明文會(huì)生成不同密文就是依靠動(dòng)態(tài)密匙
$ckey_length
= 4;
// 密匙
$key
= md5(
$key
?
$key
:
$GLOBALS
[
'discuz_auth_key'
]);
// 密匙a會(huì)參與加解密
$keya
= md5(
substr
(
$key
, 0, 16));
// 密匙b會(huì)用來做數(shù)據(jù)完整性驗(yàn)證
$keyb
= md5(
substr
(
$key
, 16, 16));
// 密匙c用于變化生成的密文
$keyc
=
$ckey_length
? (
$operation
==
'DECODE'
?
substr
(
$string
, 0,
$ckey_length
):
substr
(md5(microtime()), -
$ckey_length
)) :
''
;
// 參與運(yùn)算的密匙
$cryptkey
=
$keya
.md5(
$keya
.
$keyc
);
$key_length
=
strlen
(
$cryptkey
);
// 明文,前10位用來保存時(shí)間戳,解密時(shí)驗(yàn)證數(shù)據(jù)有效性,10到26位用來保存$keyb(密匙b),
//解密時(shí)會(huì)通過這個(gè)密匙驗(yàn)證數(shù)據(jù)完整性
// 如果是解碼的話,會(huì)從第$ckey_length位開始,因?yàn)槊芪那?ckey_length位保存 動(dòng)態(tài)密匙,以保證解密正確
$string
=
$operation
==
'DECODE'
?
base64_decode
(
substr
(
$string
,
$ckey_length
)) :
sprintf(
'%010d'
,
$expiry
?
$expiry
+ time() : 0).
substr
(md5(
$string
.
$keyb
), 0, 16).
$string
;
$string_length
=
strlen
(
$string
);
$result
=
''
;
$box
= range(0, 255);
$rndkey
=
array
();
// 產(chǎn)生密匙簿
for
(
$i
= 0;
$i
<= 255;
$i
++) {
$rndkey
[
$i
] = ord(
$cryptkey
[
$i
%
$key_length
]);
}
// 用固定的算法,打亂密匙簿,增加隨機(jī)性,好像很復(fù)雜,實(shí)際上對(duì)并不會(huì)增加密文的強(qiáng)度
for
(
$j
=
$i
= 0;
$i
< 256;
$i
++) {
$j
= (
$j
+
$box
[
$i
] +
$rndkey
[
$i
]) % 256;
$tmp
=
$box
[
$i
];
$box
[
$i
] =
$box
[
$j
];
$box
[
$j
] =
$tmp
;
}
// 核心加解密部分
for
(
$a
=
$j
=
$i
= 0;
$i
<
$string_length
;
$i
++) {
$a
= (
$a
+ 1) % 256;
$j
= (
$j
+
$box
[
$a
]) % 256;
$tmp
=
$box
[
$a
];
$box
[
$a
] =
$box
[
$j
];
$box
[
$j
] =
$tmp
;
// 從密匙簿得出密匙進(jìn)行異或,再轉(zhuǎn)成字符
$result
.=
chr
(ord(
$string
[
$i
]) ^ (
$box
[(
$box
[
$a
] +
$box
[
$j
]) % 256]));
}
if
(
$operation
==
'DECODE'
) {
// 驗(yàn)證數(shù)據(jù)有效性,請(qǐng)看未加密明文的格式
if
((
substr
(
$result
, 0, 10) == 0 ||
substr
(
$result
, 0, 10) - time() --> 0) &&
substr
(
$result
, 10, 16) ==
substr
(md5(
substr
(
$result
, 26).
$keyb
), 0, 16)) {
return
substr
(
$result
, 26);
}
else
{
return
''
;
}
}
else
{
// 把動(dòng)態(tài)密匙保存在密文里,這也是為什么同樣的明文,生產(chǎn)不同密文后能解密的原因
// 因?yàn)榧用芎蟮拿芪目赡苁且恍┨厥庾址?,?fù)制過程可能會(huì)丟失,所以用base64編碼
return
$keyc
.
str_replace
(
'='
,
''
,
base64_encode
(
$result
));
}
}
$str
=
'abcdef'
;
$key
=
'www.phpskill.com'
;
echo
$jm
= authcode(
$str
,
'ENCODE'
,
$key
,0);
//加密
echo
"
";
echo
authcode(
$jm
,
'DECODE'
,
$key
,0);
//解密
?>
這樣當(dāng)設(shè)置用戶信息的cookie時(shí),就無法對(duì)其進(jìn)行偽造:
<!--?php
$user
=
array
(
"uid"
=-->
$uid
,
"username"
=>
$username
);
$user
=
base64_encode
(serialize(
$user
));
$user
= authcode(
$user
,
'ENCODE'
,
'www.phpskill.com'
,0);
//加密
setcookie(
"user"
,
$user
,time()+3600*24);
?>
二、用加密令牌對(duì)cookie進(jìn)行保護(hù)
$hash
= md5(
$uid
.time());
//加密令牌值
$hash_expire
=time()+3600*24;
//加密令牌值為一天有效期
$user
=
array
(
"uid"
=>
$uid
,
"username"
=>
$username
,
"hash"
=>
$hash
);
$user
=
base64_encode
(serialize(
$user
));
setcookie(
"user"
,
$user
,
$hash_expr
);
然后把
$hash
和
$hash_expire
存入member表中hash和hash_expire對(duì)應(yīng)字段中,也可以存入nosql,session
用戶偽造cookie時(shí),hash無法偽造,偽造的hash和數(shù)據(jù)庫中的不一致
推薦文章
2025-01-18
2024-11-28
2024-11-09
2024-10-25
2024-06-25
2024-01-04
2023-11-06
2023-10-30
2023-10-13
2023-10-10
穩(wěn)定
產(chǎn)品高可用性高并發(fā)貼心
項(xiàng)目群及時(shí)溝通專業(yè)
產(chǎn)品經(jīng)理1v1支持快速
MVP模式小步快跑承諾
我們選擇聲譽(yù)堅(jiān)持
10年專注高端品質(zhì)開發(fā)聯(lián)系我們
友情鏈接: