PHP给字符串创建RSA签名, 以及校验签名是否正确

最初发表于: 2020-01-09 09:15:36

代码如下

<?php
// 在此定义常量
//RSA 公钥
define('RSA_PUBLIC', '-----BEGIN PUBLIC KEY-----
你的RSA公钥
-----END PUBLIC KEY-----');

//RSA 私钥
define('RSA_PRIVATE', '-----BEGIN PRIVATE KEY-----
你的RSA私钥
-----END PRIVATE KEY-----');


/**
 * 通过私钥给字符串生成签名
 * @param    string     $string 待签名字符串
 * @param    [type]     $priKey     私钥
 * @return   string     base64结果值
 */
function getSign($string,$priKey = RSA_PRIVATE){
    $privKeyId = openssl_pkey_get_private($priKey);
    $signature = '';
    openssl_sign($string, $signature, $privKeyId);
    openssl_free_key($privKeyId);
    return base64_encode($signature);
}

 
/**
 * 通过公钥检测签名是否正确
 * @param    string     $pubKey 公钥
 * @param    string     $sign   签名
 * @param    string     $string 这个签名对应的字符串
 * @return   bool
 */
function checkSign($sign,$string,$pubKey = RSA_PUBLIC){
    $publicKeyId = openssl_pkey_get_public($pubKey);
    $result = openssl_verify($string, base64_decode($sign), $publicKeyId);
    openssl_free_key($publicKeyId);
    return $result === 1 ? true : false;
}

$a = 'hello';
$sign = getSign($a);
$check = checkSign($sign,$a) ? '正确' : '错误';
echo "{$a}的签名是{$sign}<br>";
echo "{$sign}这个签名对{$a}的校验结果是: {$check}";