PHP实现RSA签名和验签

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));
}
原文地址:https://www.cnblogs.com/aworkstory/p/13426865.html