在项目中遇到需要加密URL中一个参数,碰过过一些问题。
在网上看到两个函数。
//加密。$key为自己任意设定的一个字符(数字,字母),$plain_text为需要加密的字符串。
function encrypt($key, $plain_text) {
$plain_text = trim($plain_text);
$iv = substr(md5($key), 0,mcrypt_get_iv_size(MCRYPT_CAST_256,MCRYPT_MODE_CFB));
$c_t = mcrypt_cfb (MCRYPT_CAST_256, $key, $plain_text, MCRYPT_ENCRYPT, $iv);
return trim(chop(base64_encode($c_t)));
}
//解密。$key同上,自己设定加密的key,$c_t 为经过encrypt加密过的字符串,返回的为加密前的字符串。
function decrypt($key, $c_t) {
$c_t = trim(chop(base64_decode($c_t)));
$iv = substr(md5($key), 0,mcrypt_get_iv_size (MCRYPT_CAST_256,MCRYPT_MODE_CFB));
$p_t = mcrypt_cfb (MCRYPT_CAST_256, $key, $c_t, MCRYPT_DECRYPT, $iv);
return trim(chop($p_t));
}
可以用上面两个函数能够较安全的加密和解密。
注意一:如果,也像我一样,加密的字符串需要经过URL经过GET的方式传到php页面。需要把加密后的字符串使用urlencode转码一下:
callback.php?uid='.urlencode(encrypt("timerchina",$_PG['uid'])).'&loginname='.urlencode(encrypt("timerchina",$_PG['loginname']))
但是在callback.php不需要使用 urldecode解编码,因为浏览器已经自动的解码了,不然会出问题的。
像下面这样,就可以了。
$uid = decrypt('timerchina',$_PG["uid"]);
$_SESSION['loginName'] = decrypt('timerchina',$_PG["loginname"]);
注意二:$key的值的设定和需要加密的字符串,,有时候容易出现加密后无法解密的问题。
比如$key为 "timer",$plain_text为z开头的字符串。比如:zero123、会出现加密后无法解密的问题,具体原因不清楚。