注:加密的内容长度是有限制的,具体可参考
密钥生成
A为客户端 B为服务端
A手里有一套密钥(私钥A/公钥A)
B手里有一套密钥(私钥B/公钥B)
A将公钥A发给B
B将公钥B发给A
注:两套公钥目的是为了保证确实是AB双方在通信,双方的私钥加签是为了标明自己的身份,如果只是对数据进行保护,防止被窃取,服务器只颁发一套密钥也可以
A向B发送请求流程:
2. A用 私钥A + msg获取签名SignA
3. A用 公钥B 将SignA + msg 加密 得到 要发送的密文 secret
4. B 收到 A 发送过来的密文 secret 使用 私钥B 进行解密 得到 SignA + msg (第一次解密)
5. B 使用 公钥B + msg +signA进行验签操作(第二次验签)
image
/**
* Created by PhpStorm.
* User: 80752
* Date: 2018/9/12
* Time: 21:30
*/
if (! function_exists('url_safe_base64_encode')) {
function url_safe_base64_encode ($data) {
return str_replace(array('+','/', '='),array('-','_', ''), base64_encode($data));
}
}
if (! function_exists('url_safe_base64_decode')) {
function url_safe_base64_decode ($data) {
$base_64 = str_replace(array('-','_'),array('+','/'), $data);
return base64_decode($base_64);
}
}
class RSA
{
/**
* 选择在创建CSR时应该使用哪些扩展。可选值有 OPENSSL_KEYTYPE_DSA, OPENSSL_KEYTYPE_DH, OPENSSL_KEYTYPE_RSA 或 OPENSSL_KEYTYPE_EC. 默认值是 OPENSSL_KEYTYPE_RSA.
*/
const RSA_ALGORITHM_KEY_TYPE = OPENSSL_KEYTYPE_RSA;
/**
* 签名算法, 默认为 OPENSSL_ALGO_SHA1
*/
const RSA_ALG