PHP实现RSA签名和验签
密钥生成
Mac和Linux 用户
安装openssl
后逐条输入如下指令:
$ openssl #进入 OpenSSL 程序
OpenSSL> genrsa -out rsa_private_key.pem 1024 #生成私钥
OpenSSL> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out rsa_private_key_pkcs8.pem #Java开发者需要将私钥转换成PKCS8格式
OpenSSL> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem #生成公钥
OpenSSL> exit #退出 OpenSSL 程序
疑问:使用base64_encode编码之后出现的+和/在http的get传输过程中会出现+变成空格的请。
可以使用下面两个方法解决:
function _base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
function _base64url_decode($data) {
$str = str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT);
return base64_decode($str);
}
PHP实现RSA用私钥签名
$privatekey = openssl_get_privatekey( file_get_contents($private_key_file_path) );
$signedStr = '';
openssl_sign($signStr, $signedStr, $privatekey, OPENSSL_ALGO_SHA256);
openssl_free_key($privatekey);
$sign = $this->_base64url_encode($signedStr);
PHP实现RSA用公钥验签
$public_key = openssl_get_publickey( file_get_contents($pub_key_file_path) );
if(empty($public_key)){
return false;
}
$sign = base64_decode($sign);
$ok = openssl_verify( $sign_str, $sign, $public_key, OPENSSL_ALGO_SHA256 ); //SHA256
openssl_free_key( $public_key );
if ($ok == 1) {
$result = true;
} elseif ($ok == 0) {
$result = false;
} else {
MLog::write('DEBUG', __CLASS__.' ' . __FUNCTION__ . ' 0 openssl_error_str '.json_encode(openssl_error_string));
}