php RSA 加密解密详解
2022-05-31PHP
当php服务端与客户端交互、提供开放api、api接口对接时,通常需要对敏感的部分api数据传输进行数据加密,这样做的好处是可以增加安全性,其中RSA非对称加密就能派上用处了,
如企鹅微信公众号的企业付款到银行卡API中就有用到该技术
今天被企鹅的企业付款到银行卡API中,银行卡号和用户名需要用到的RSA 加密坑到了,一顿被狂虐后,记下此文
Linux系统都自带RSA密钥生成工具openssl,下面命令操作是CentOS下执行
当php服务端与客户端交互、提供开放api、api接口对接时,通常需要对敏感的部分api数据传输进行数据加密,这样做的好处是可以增加安全性,其中RSA非对称加密就能派上用处了,
如企鹅微信公众号的企业付款到银行卡API中就有用到该技术,文档地址:
一、生成私钥
openssl genrsa -out rsa_private_key.pem 1024 # 第一条命令生成原始 RSA私钥文件 rsa_private_key.pem
二、生成公钥
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem # 第二条生成RSA公钥文件 rsa_public_key.pem
从上面看出通过私钥能生成对应的公钥,因此我们将私钥private_key.pem用在服务器端,公钥发放给android、ios等前端,或让其对接接口
运行以上两条命令后的效果图
三、php中用生成的公钥、私钥进行加密解密
私钥加密的内容能通过公钥解密(反过来亦可以)
<?php $private_file='./rsa_private_key.pem';//rsa_private_key.pem文件目录位置 $public_file ='./rsa_public_key.pem';//rsa_public_key.pem文件目录位置 //这个函数可用来判断私钥是否是可用的 $private_key = openssl_pkey_get_private(file_get_contents($private_file)); //这个函数可用来判断公钥是否是可用的 $public_key = openssl_pkey_get_public(file_get_contents($public_file)); if(!$private_key){ exit('私钥不可用!'); } if(!$public_key){ exit('公钥不可用!'); } $data = "我是原始数据"; //原始数据 $encrypted = ""; // 加密后的数据.用于网络中的传输.提前定义为空字符串 $decrypted = ""; // 解密后的数据,提前定义为空字符串 $is_success = openssl_private_encrypt($data,$encrypted,$private_key); //私钥加密 if($is_success){ //加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的,base64_encode后方便在网址中传输或者打印,否则打印为乱码 $encrypted = base64_encode($encrypted); echo '私钥加密的数据:'; var_dump($encrypted); }else{ exit('加密失败'); } openssl_public_decrypt(base64_decode($encrypted),$decrypted,$public_key);//私钥加密的内容通过公钥可用解密出来 echo '公钥解密的数据'; var_dump($decrypted); echo "<br/>---------------------------------------<br/>"; $is_success = openssl_public_encrypt($data,$encrypted,$public_key);//公钥加密 if($is_success){ $encrypted = base64_encode($encrypted); echo '公钥加密的数据'; var_dump($encrypted); }else{ exit('加密失败'); } openssl_private_decrypt(base64_decode($encrypted),$decrypted,$private_key);//私钥解密 echo '私钥解密的数据'; var_dump($decrypted);
运行后效果图如下:
很赞哦! ()