PHP-RSA2签名

2017/05/04

什么是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;
    }
    

Post Directory