js RSA加密与后端PHP交互

09月21日2017 工作杂谈 php , js , rsa 看评论

由于一个项目要用到前端JS通过RSA加密数据,后面对加密的数据进行解析。RSA具体的原理就不展开,只记录具体的实现过程。

主要步骤是:

  1. 1、配置RSA私钥与公钥;
  2. 2、前端JS根据公钥进行数据加密;
  3. 3、后台根据前端加密过来的数据进行解密。

一、配置RSA密钥

密钥长度是1024的。可直接在Linux服务端用openssl命令生成,也可以用别人的工具进行生成。具体的可以参考:https://doc.open.alipay.com/doc2/detail?treeId=58&articleId=103242&docType=1


二、前端JSRSA加密

这里用的JS库函数地址是https://github.com/travist/jsencrypt

关键代码是(一定要注意公钥变量有定义换行符):

var rsaInst = new RSA.JSEncrypt({default_key_size: 1024});
var pubkey = '-----BEGIN PUBLIC KEY-----\
MIGfMA0GCSqGSI.......rxg26Mn8wbHnX/LuTZOds\
ZlR28VLgis6JOu.......e4REk4nM9jljNSQ7rJ\
JZUuDnVEd9+Se........PROOH0wGu1vux2hqta8ZbkEFoPK8PU68H\
M+gkPGTolnNM+j2sVwIDAQAB\
-----END PUBLIC KEY-----'
;
rsaInst.setPublicKey(pubkey);
var enCryptID = rsaInst.encrypt( data );

三、PHP解析加密数据

关键代码(注意私钥的定义):

$config_private_key = <<<EOF
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDgXOPrxg26Mn8wbHnX/LuTZOdsZlR28VLgis6JOw1yJFMRkuyk
.............KEY DATA......
WMFaQiKib5RPYV35JFIu6EX3oFD7xl8SB7iXJ/Hqz/gh
-----END RSA PRIVATE KEY-----
EOF;

$rsa_ssh_key = openssl_get_privatekey( $config_private_key );
$rs = openssl_private_decrypt( base64_decode($data), $decrypted, $rsa_ssh_key);

参考文档:

1、http://www.piaoyi.org/php/JS-RSA-PHP-encrypt.html

2、https://juejin.im/entry/56f1f37e731956005d494952