php服务端与客户端交互、提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密
1、加密解密的第一步是生成公钥、私钥对,私钥加密的内容能通过公钥解密(反过来亦可以)
下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令:
openssl genrsa -out rsa_private_key.pem 1024
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
第一条命令生成原始 RSA私钥文件 rsa_private_key.pem,第二条命令将原始 RSA私钥转换为 pkcs8格式,第三条生成RSA公钥 rsa_public_key.pem
从上面看出通过私钥能生成对应的公钥,因此我们将私钥private_key.pem用在服务器端,公钥发放给android跟ios等前端
2、php中用生成的公钥、私钥进行加密解密,直接上代码
点击(此处)折叠或打开
- $private_key = file_get_contents("private_key.pem");
- $public_key = file_get_contents("public_key.pem");
- $pi_key = openssl_pkey_get_private($private_key);
- $pu_key = openssl_pkey_get_public($public_key);
- $data = 'aassssasssd3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333dd';//原始数据
- $encrypted = "";
- $decrypted = "";
- openssl_private_encrypt($data,$encrypted,$pi_key); //私钥加密
- $encrypted = base64_encode($encrypted);
- echo "加密后内容{$encrypted}";
- openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);
- echo "解密后的内容".$decrypted
sha256withrsa签名
点击(此处)折叠或打开
- //create signature
- $src = "asdfsadfdd3333";
- openssl_sign($src, $signature, $private_key, OPENSSL_ALGO_SHA256);
- echo "原始数据{$src}";
- echo $signature;
- $r = openssl_verify($src, $signature, $public_key, "sha256WithRSAEncryption");
- var_dump($r)