PHP-RSA2签名

xiaoxiao2021-02-28  71

什么是RSA2:RSA2就是在原来SHA1WithRSA签名算法的基础上,新增了支持SHA256WithRSA的签名算法。该算法在摘要算法上比SHA1WithRSA有更强的安全能力。SHA1WithRSA的签名算法会继续提供支持,但为了您的应用安全,强烈建议使用SHA256WithRSA的签名算法

开发平台算法名称标准签名算法名称备注RSA2SHA256WithRSA强制要求RSA密钥的长度至少为2048RSASHA1WithRSA对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; }
转载请注明原文地址: https://www.6miu.com/read-63698.html

最新回复(0)