什么是RSA2:RSA2就是在原来SHA1WithRSA签名算法的基础上,新增了支持SHA256WithRSA的签名算法。该算法在摘要算法上比SHA1WithRSA有更强的安全能力。SHA1WithRSA的签名算法会继续提供支持,但为了您的应用安全,强烈建议使用SHA256WithRSA的签名算法
开发平台算法名称 | 标准签名算法名称 | 备注 |
---|---|---|
RSA2 | SHA256WithRSA | 强制要求RSA密钥的长度至少为2048 |
RSA | SHA1WithRSA | 对RSA密钥的长度不限制,推荐使用 |
1. 首先生成公钥、私钥
所谓公钥和私钥就是,用公钥加密,然后用私钥解密(按道理说是这样的,但是是实际情况是用私钥加密,然后用公钥进行解密,求解答)
公钥是公开的,可以给我任何人,然后对方如果想给我发送数据,就需要使用公钥进行加密信息。
私钥是保密的,只有我有,然后我接收到的信息只有我能进行解密,其他人因为没有我的私钥,所以是解开不了使用我的公钥加密的信息的。
通常Linux系统都自带RSA密钥生成工具openssl。
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用在服务器端
2. 使用私钥进行加密数据
首先定义好私钥变量,或者读取私钥文件
$rsaPrivateKeyFilePath = null;
$priKey = 'MIIEpAIBAAKCAQEApegr9IPrc/82E9eAUxdX1KVnqUemFF7azRPrD01Qz2v3haD+
8jgcQZ2m5MCAyqmCgK1CxViwnXQeapiMvSc8IAANAhBwqTGWYHin8ki+dj1ny68u
BUWafVQ1FZZM4pT6+CwcFbkpuF6AQb6ythifrPw+OzgeKn+5Mu1TY1ndqzJcU/ho
wwmtjmM5qsh6I/DSVQFplVoyeYpnl11sbyeuQLpZyDU2fjiYtTqJ7X+gXSSQnXLi
YwUgZlEa1YGZs9QaMoDZSEu+v8xVQNFqJ2LSpoDhoJsKu/tNmTqOQZgu7xbnfQ5F
Ypxs/FTTgH91Q8bWU5yZSM9wRxqeDCWx33ZeyQIDAQABAoIBAQCfB2G6zAkR83x+
oH9dJm8GYlZvKULFG/dXxNP4ov/nE3L8IErBG4/aRagIdY3+tWVmuq3aRR1mkDvn
qbqeRdGYSvQtGl0jkWi3qHA0Cg6ngEzSLWVLoGBp6iHIQ34HYw7+fCmfmRGorMz8
ODNN4WSNiGyOj0g7LJr1ehAIl8enpN8a8CXRJWAK7YiVxJhhxiC7pKRBWu+iMNqY
z6ITJVsCENgd3lfYKbvHMmhaO7SIPbfEFlKgp1wkiFEPB7/x+89UZVQd68P93ONa
d8ycuChgks5YBlq/9FfNkZjybN8eWvqurYIzTQ/P1bDpKLiECYv9W12FMlFnwQfS
2HN7oPZBAoGBANSTkGRvuomXDDV4EVYqq1rAN1peJbUqQICTlbdgcR/q+XcgvH0Z
1mEMZTvO3snJW2y6/DTFs9wjA+skJDGy26ikI4Uz8aH1gw2gVVqud7bpNtAY5Wtc
jIMzo5QwpWoa55Kne0MNYsQ68sOl0v821e/T68c+iXQSrmLMAXG09e5NAoGBAMfM
FJ7IuajhKizzyl3MYr+8imwrY/PgEW8iQMaiaiWGXL4EDHLygGwtEhNN/1Zj2lqA
GPznju2ol1jnPB/umcwa0tpufpXU1EDVCn+RrP+zEnzwa9nuZGh87Snw2FsOywep
J41n5HGO4Lr7YdjDd1CFoHFogelisKmv7foGQ4htAoGBAKGMRyZc1okrtkaIKbyv
DqwX+bj+ZW+pXX2ZKyVB8JaODumegkAcO5RjRCfQjfURxh36eCJuwMIiBh9TxwHR
6CbgHnJjSFWJ6/+WAme4wRfLYjGBShBuNAadXsoGsh7RtXz5NK5/ZLi2B7nxskjr
1me9SKiReQoyDD7exJYyLNfdAoGAHqUKtKAM+f4vPd3WuDRVIRuGD7lIB2viwKz8
Sns21LKbHvn3/tl7IRx4nUVlWJbQMvla28+YeJNXQ2eULUGnjUq/9IjmGY0fUSJc
Dd0GL+IDf+5QXIjYFb6zka9DQBQwx+gGDQZWX6SOi59rDphMgKk+RqbE5ksg1aYK
VkMHsLECgYB3rtrPRYCU3mINlr/VEPgUjuZgN7XH12y4xXc5n7+5yaTADJ5mliDl
rjX57O/5/reWDjmNxJV9pR/ceOXR+gDpyIpnf+5ZszBMaALfsWLzXhkSa9QJqsKo
RQ2XsesBSXsqpqoUK57cnOZHnBT/ECXd2cnSuyj0VhdOvnUUuqdfQA==';
//首先判断下私钥是否为文件,不为文件的话要加上私钥的头部和尾部
if (file_exists($rsaPrivateKeyFilePath)) {
//读取公钥文件
$priKey = file_get_contents($rsaPrivateKeyFilePath);
//转换为openssl格式密钥
$res = openssl_get_privatekey($priKey);
} else {
$priKey= $priKey;
$res = "-----BEGIN RSA PRIVATE KEY-----\n" .
wordwrap($priKey, 64, "\n", true) .
"\n-----END RSA PRIVATE KEY-----";
}
//判断私钥文件是否可用
$piKey = openssl_pkey_get_private($res);
使用私钥进行加密数据
加密使用SHA256进行加密数据
if ($piKey) {
$res = openssl_get_privatekey($res);
openssl_sign($data, $sign, $res, OPENSSL_ALGO_SHA256);
$sign = base64_encode($sign);
echo $sign;
}
3. 使用公钥进行验证数据
首先定义好公钥变量,或者读取公钥文件
$rsaPublicKeyFilePath = null;
$pubKey = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApegr9IPrc/82E9eAUxdX
1KVnqUemFF7azRPrD01Qz2v3haD+8jgcQZ2m5MCAyqmCgK1CxViwnXQeapiMvSc8
IAANAhBwqTGWYHin8ki+dj1ny68uBUWafVQ1FZZM4pT6+CwcFbkpuF6AQb6ythif
rPw+OzgeKn+5Mu1TY1ndqzJcU/howwmtjmM5qsh6I/DSVQFplVoyeYpnl11sbyeu
QLpZyDU2fjiYtTqJ7X+gXSSQnXLiYwUgZlEa1YGZs9QaMoDZSEu+v8xVQNFqJ2LS
poDhoJsKu/tNmTqOQZgu7xbnfQ5FYpxs/FTTgH91Q8bWU5yZSM9wRxqeDCWx33Ze
yQIDAQAB';
//首先判断下公钥是否为文件,不为文件的话要加上公钥的头部和尾部
if (file_exists($rsaPublicKeyFilePath)) {
//读取公钥文件
$res = file_get_contents($rsaPublicKeyFilePath);
//转换为openssl格式密钥
$res = openssl_get_publickey($res);
} else {
$pubKey= $pubKey;
$res = "-----BEGIN PUBLIC KEY-----\n" .
wordwrap($pubKey, 64, "\n", true) .
"\n-----END PUBLIC KEY-----";
}
//判断公钥文件是否可用
$piKey = openssl_pkey_get_public($res);
使用公钥进行数据验证
使用SHA256进行数据验证
if ($puKey) {
$result = (bool)openssl_verify($data, base64_decode($signKey), $res, OPENSSL_ALGO_SHA256);
var_dump($result);exit;
}