前两天写了一下RSA加密在php中的用法,今天又无意间在网上看到了PHP写的一个RSA2签名与验签的使用类,感觉不错记录下来,以后留着使用。

PHP RSA2签名与验签的使用类

PHP RSA2签名与验签类代码:

class Rsa2
{
    private static $PRIVATE_KEY = 'RSA2私钥,也可以PEM文件,要加载进来';
    private static $PUBLIC_KEY  = 'RSA2公钥,也可以PEM文件,要加载进来';
    /**
     * 获取私钥
     * @return bool|resource
     */
    private static function getPrivateKey()
    {
        $privKey = self::$PRIVATE_KEY;
        return openssl_pkey_get_private($privKey);
    }
    /**
     * 获取公钥
     * @return bool|resource
     */
    private static function getPublicKey()
    {
        $publicKey = self::$PUBLIC_KEY;
        return openssl_pkey_get_public($publicKey);
    }
    /**
     * 创建签名
     * @param string $data 数据
     * @return null|string
     */
    public function createSign($data = '')
    {
        if (!is_string($data)) {
            return null;
        }
        return openssl_sign($data,$sign, self::getPrivateKey(),OPENSSL_ALGO_SHA256) ? base64_encode($sign) : null;
    }
    /**
     * 验证签名
     * @param string $data 数据
     * @param string $sign 签名
     * @return bool
     */
    public function verifySign($data = '', $sign = '')
    {
        if (!is_string($sign) || !is_string($sign)) {
            return false;
        }
        return (bool)openssl_verify($data,base64_decode($sign), self::getPublicKey(),OPENSSL_ALGO_SHA256);
    }
}

类的调用:

1、php RSA2签名

$rsa2 = new Rsa2();
//数据
$data = json_encode(array(
    'uid'  => 111,
    'name' => 'mochu',
    'host' => 'http://feiniaomy.com'
)); 
//生成签名
$strSign = $rsa2->createSign($data);  
//输出签名
echo $strSign;

输出结果:

D+jES7067gDUcC8a/PdZvzlPaZ41sTKTZ6Y8KQZZCs+1SQ5ro6euSImNFX5iKdY3TBJLthlThRLqfwxX2NED3ZSO53OJCXffzl88c2SZDxf+rMSzxHPDyvS7dmbizldDbRGmVoS7dd5EJfLAITPhsjpsAaTQ0jaQT3yPBH4gQ6+qZW9cu2BJZqWbQCUijHdAZlJ3/nQTICrliyE3aF0UfkxMxdJhN/gEIwBqC9tQKyEkeZ+eeesdVWbF4/NSMQIorBA7h18Icyu6sORIsMm1Q6mIc1ybjTNtzDODoboSe/R+dDxapcPBOhRMva9nHop77CG963D7Fli2YoohU7H1nA==

2、php RSA2验签

$rsa2 = new Rsa2();
//数据
$data = json_encode(array(
    'uid'  => 111,
    'name' => 'mochu',
    'host' => 'http://feiniaomy.com'
)); 
//生成的签名
$sign = 'D+jES7067gDUcC8a/PdZvzlPaZ41sTKTZ6Y8KQZZCs+1SQ5ro6euSImNFX5iKdY3TBJLthlThRLqfwxX2NED3ZSO53OJCXffzl88c2SZDxf+rMSzxHPDyvS7dmbizldDbRGmVoS7dd5EJfLAITPhsjpsAaTQ0jaQT3yPBH4gQ6+qZW9cu2BJZqWbQCUijHdAZlJ3/nQTICrliyE3aF0UfkxMxdJhN/gEIwBqC9tQKyEkeZ+eeesdVWbF4/NSMQIorBA7h18Icyu6sORIsMm1Q6mIc1ybjTNtzDODoboSe/R+dDxapcPBOhRMva9nHop77CG963D7Fli2YoohU7H1nA==';
//验证签名
$is = $rsa2->verifySign($data, $sign); 
var_dump($is);

输出结果:

true