PHP實現RSA簽名和驗簽
密鑰生成
Mac和Linux 用戶
安裝openssl
生成1024位的私鑰,不指定的話默認2048位
后逐條輸入如下指令:
$ 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 程序
拓展:RSA加密算法, PKCS#1 和PKCS#8區別是什么?
疑問:使用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));
}