AUTH:PHILO EMAIL:lijianying12 at gmail.com
基于POST GET 的http通讯虽然非常成熟,但是很容易被人监听。 并且如果使用跨域jsonp的通讯很容易在历史记录中发现通讯网址以及参数。为了克服这些问题, 并且降低服务器成本,我们没有使用SSL而使用 RSA加密。文章中的php加密解密 JS的加密解密 互相加密解密 都能验证通过。
其中PHP依赖常见的OPENSSL LIB 。 JS依赖 jsencrypt。
我们使用jsonp get RSA加密通讯好处如下:
- 前后分离适合cdn加速。
- 安全跨域更适合松散结构的网站。
- 不用去买ssl证书了。
首先要生成密匙对
openssl genrsa 1024 > private.key
openssl rsa -in private.key -pubout > public.key
JS的RSA加密流程
–BEGIN PUBLIC KEY–END PUBLIC KEY–BEGIN RSA PRIVATE KEY–END RSA PRIVATE KEY
php加密解密类
首先要检查phpinfo里面有没有openssl支持
class mycrypt {
public $pubkey;
public $privkey;
function __construct() {
$this->pubkey = file_get_contents('./public.key');
$this->privkey = file_get_contents('./private.key');
}
public function encrypt($data) {
if (openssl_public_encrypt($data, $encrypted, $this->pubkey))
$data = base64_encode($encrypted);
else
throw new Exception('Unable to encrypt data. Perhaps it is bigger than the key size?');
return $data;
}
public function decrypt($data) {
if (openssl_private_decrypt(base64_decode($data), $decrypted, $this->privkey))
$data = $decrypted;
else
$data = '';
return $data;
}
}
密匙文件位置问题,是放到访问接口的附近就可以了如果是CI的话就放到index.php旁边就行了。 但是要注意一点,一定要做访问设置,不然key会暴出来的,那时候信息一旦截获就惨了。
类的使用
$rsa = new mycrypt();
echo $rsa -> encrypt('abc');
echo $rsa -> decrypt('W+ducpssNJlyp2XYE08wwokHfT0bm87yBz9vviZbfjAGsy/U9Ns9FIed684lWjYyyofi/1YWrU0Mp8vLOYi8l6CfklBY=');
长数据加密解密
function encrypt_data($publickey,$data)
{
$rsa = new mycrypt();
if($publickey != ""){
$rsa -> pubkey = $publickey;
}
$crypt_res = "";
for($i=0;$i<((strlen($data) - strlen($data)%117)/117+1); $i++)
{
$crypt_res = $crypt_res.($rsa -> encrypt(mb_strcut($data, $i*117, 117, 'utf-8')));
}
return $crypt_res;
}
function decrypt_data($privatekey,$data)
{
$rsa = new mycrypt();
if($privatekey != ""){ // if null use default
$rsa ->privkey = $privatekey;
}
$decrypt_res = "";
$datas = explode('=',$data);
foreach ($datas as $value)
{
$decrypt_res = $decrypt_res.$rsa -> decrypt($value);
}
return $decrypt_res;
}
JSONP 跨域通讯
-BEGIN PUBLIC KEY–END PUBLIC KEY
php js rsa get jsonp 跨域 安全
发表回复