加密解密:
对称加密:加密和解密相同秘钥。常见算法:AES, XTEA, 3DES。
非对称加密: 公钥加密 私钥加密。 加密和解密秘钥不同。常见算法:RSA
OpenSSL> genrsa -out app_private_key.pem 1024 #生成私钥 OpenSSL> pkcs8 -topk8 -inform PEM -in app_private_key.pem -outform PEM -nocrypt -out app_private_key_pkcs8.pem #Java开发者需要将私钥转换成PKCS8格式
OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem #生成公钥
OpenSSL> exit #退出OpenSSL程序
签名:对字符串求散列值,不可逆。常见算法: MD5(128),SHA1(160), SHA-224、SHA-256、SHA-384,和SHA-512并称为SHA-2。
常用于防止篡改。
SHA2withRsa:
理解:客户端在数据传输的时候用SHA2对字符签名,然后用公钥对签名值加密。
服务端接收数据的后,用私钥对加密的签名加密,然后再用和自己签名的字符比对,验证。
如此做的缘故在于,签名防止篡改,只对签名值加密在于降低RSA的耗时。
下面是PHP代码示例:
注意 sign 端用私钥, verify端用公钥。
如:支付宝对接时,你请求用自己私钥签名,支付宝用你提供的公钥验签
支付宝回调,你用支付宝公钥验签。
protected function sign($data, $signType = "RSA") {
if($this->checkEmpty($this->rsaPrivateKeyFilePath)){
$priKey=$this->rsaPrivateKey;
$res = "-----BEGIN RSA PRIVATE KEY-----\n" .
wordwrap($priKey, 64, "\n", true) .
"\n-----END RSA PRIVATE KEY-----";
}else {
$priKey = file_get_contents($this->rsaPrivateKeyFilePath);
$res = openssl_get_privatekey($priKey);
}
($res) or die('您使用的私钥格式错误,请检查RSA私钥配置');
if ("RSA2" == $signType) {
openssl_sign($data, $sign, $res, OPENSSL_ALGO_SHA256);
} else {
openssl_sign($data, $sign, $res);
}
if(!$this->checkEmpty($this->rsaPrivateKeyFilePath)){
openssl_free_key($res);
}
$sign = base64_encode($sign);
return $sign;
}
function verify($data, $sign, $rsaPublicKeyFilePath, $signType = 'RSA') {
if($this->checkEmpty($this->alipayPublicKey)){
$pubKey= $this->alipayrsaPublicKey;
$res = "-----BEGIN PUBLIC KEY-----\n" .
wordwrap($pubKey, 64, "\n", true) .
"\n-----END PUBLIC KEY-----";
}else {
//读取公钥文件
$pubKey = file_get_contents($rsaPublicKeyFilePath);
//转换为openssl格式密钥
$res = openssl_get_publickey($pubKey);
}
($res) or die('支付宝RSA公钥错误。请检查公钥文件格式是否正确');
//调用openssl内置方法验签,返回bool值
if ("RSA2" == $signType) {
$result = (bool)openssl_verify($data, base64_decode($sign), $res, OPENSSL_ALGO_SHA256);
} else {
$result = (bool)openssl_verify($data, base64_decode($sign), $res);
}
if(!$this->checkEmpty($this->alipayPublicKey)) {
//释放资源
openssl_free_key($res);
}
return $result;
}
openssl 命令行生成RSA秘钥对
https://docs.open.alipay.com/291/106130
openssl加密:
https://yq.aliyun.com/ziliao/125560
加解密工具网站:
http://tool.chacuo.net/cryptrsapubkey