支付接口中常用的加密解密以及验签rsa,md5,sha

时间:2024-04-16 11:35:51

 

一、常用加密类型分类

1、对称加密:采用单钥对信息进行加密和解密,即同一个秘钥既可以对信息进行加密,也可以进行解密。此类型称之为对称加密。特点速度快,常用于对大量数据信息或文件加密时使用。常用例子:DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES。

 

2、非对称加密:采用公钥和私钥双钥形式对信息进行加密和解密,其中公钥和私钥是成对存在的,即使用公钥对信息加密后的密文只用使用其相应的私钥才可以进行解密,反之也毅然。相对对称加密而言叫做非对称加密。安全性非常好,但加密和解密耗时较长,比较适用于小数据量加密解密。常用例子:数字签名、RSA。

 

加密介质 公钥私钥对或者证书

公钥加密  私钥解密

私钥签名  公钥验签

 

公钥私钥

一般格式是.pem的

公钥内容(注意格式不能变)
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCmA6wtOBV6O+zwfteu9fKrF1iA
H1q28yMiWDsb2iScRG3JZJWsDz+hVP9Qp7w3Bzqkt0PaC+XNCFVGksqEXZ0lQGgQ
vz4626ibXRt2eLOAgKIrUUbVTccQJhGhAOqFlPSgxdWx/B1cSRp73Lt89WfNISh/
/A81649guFe3PII2wwIDAQAB
-----END PUBLIC KEY-----
私钥内容
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCmA6wtOBV6O+zwfteu9fKrF1iAH1q28yMiWDsb2iScRG3JZJWs
Dz+hVP9Qp7w3Bzqkt0PaC+XNCFVGksqEXZ0lQGgQvz4626ibXRt2eLOAgKIrUUbV
TccQJhGhAOqFlPSgxdWx/B1cSRp73Lt89WfNISh//A81649guFe3PII2wwIDAQAB
AoGAOggcnq31LAZYm/Tq9jj5O/9sK1VKg5tYU8Ad4W2O0KVG71hezYeDCaVJnmsT
6vR29m8to8H28YYRMRtM+ZozvOp1Tk6t+Ng+fcFt8I/bzb+ncq/gznm01gOZ0ihp
zljIhsmH4v7Cnp5/WNkdbrwR0XAXqgIGcMQhENCvQy5WeTECQQDa0XCgC0iTeL5V
MhR4SuZRxHACs7iDuoppDWsu0VgPS+mVrO8Fb2574aR/8y8q5NwJ5XZpG3p+Iie7
CNipZtnZAkEAwjlGbFLEFWT5/DzQFdZlx7A8YbM8UYEnxA7t7nt730UcDML3QPNO
3QMe8Srdrm9B7eRl75t0atjhOgIF26U3+wJBAIVX9hsBZUPA47PFJeY8NmiDnYJ4
BKv5hBkKfVN1bQU9TGXSkYGtaxWA5p62EftApbo+I89fWGD+7VkzxdxNedkCQATh
iZqJTfI3smybXqNd2vr0u9+8sGRf+Y7czS/0HH3U78qGT85rDu1Q+cMXz7BljWOc
HM+zuW5B+w8JI/qMIWcCQDEB/MsM4THgEQIuHStNJw2knA2ah3kQi6jESMQbGflK
YKJlRNwrz+FfwIWQAo1XVf9IdmNjVsDXXosQKInIPZo=
-----END RSA PRIVATE KEY-----

 

证书规范

证书也是用加密解密算法,只不过多了一些认证参数,比如国家地区等

x509,公钥证书,只有公钥。
p7,签名或加密。可以往里面塞x509,同时没有签名或加密内容。
p12,含有私钥,同时可以有公钥,有口令保护。
p7的作用就是电子信封。
X509是基本规范
P7和P12是两个实现规范,P7是数字信封,P12是带有私钥的证书规范。
x509是数字证书的规范,P7和P12是两种封装形式。比如说同样的电影,有的是avi格式,有的是mpg,大概就这个意思。

P7一般是把证书分成两个文件,一个公钥一个私钥,有PEM和DER两种编码方式。PEM比较多见,就是纯文本的,P7一般是分发公钥用,看到的就是一串可见字符串,扩展名经常是.crt,.cer,.key等。DER是二进制编码。
P12是把证书压成一个文件,.pfx。主要是考虑分发证书,私钥是要绝对保密的,不能随便以文本方式散播。所以P7格式不适合分发。.pfx中可以加密码保护,所以相对安全些。
在实践中要中,用户证书都是放在USBKey中分发,服务器证书经常还是以文件方式分发。服务器证书和用户证书,都是X509证书,就是里面的属性有区别。

X509 是证书规范
PKCS#7 是消息语法 (常用于数字签名与加密)
PKCS#12 个人消息交换与打包语法 (如.PFX .P12)打包成带公钥与私钥

看着有点费劲。。只需要记住x509就是个公钥,pkcs12就是私钥,和私钥不同的是这个私钥是加密的,需要密码才能获取到私钥内容

总结以上证书和密钥都可以对数据进行加密解密以及验签,只是使用的方式不同而已。。。

 

公私钥的生成

(也可以在linux用openssl命令生成)

//生成密钥
 
$config = array(
    "digest_alg" => "sha512",
    "private_key_bits" =>2048,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
);
 
 
//创建密钥对
$res = openssl_pkey_new($config);
//生成私钥
openssl_pkey_export($res,$priKey);
//生成公钥
$pubKey = openssl_pkey_get_details($res)[\'key\'];
 
file_put_contents(\'private.key\',$priKey);
file_put_contents(\'public.key\',$pubKey);

 

证书的生成

$dn = array(
    "countryName" => "GB",
    "stateOrProvinceName" => "Somerset",
    "localityName" => "Glastonbury",
    "organizationName" => "The Brain Room Limited",
    "organizationalUnitName" => "PHP Documentation Team",
    "commonName" => "Wez Furlong",
    "emailAddress" => "wez@example.com"
);
 
$config = array( 
    "digest_alg" => "sha512",
    "private_key_bits" =>2048,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
);
 
//创建密钥对
$res = openssl_pkey_new($config);
 
//证书
$csr = openssl_csr_new($dn,$res);
 
//证书签名
$usercert = openssl_csr_sign($csr, null, $res, 365);
 
//导出证书公钥
openssl_x509_export_to_file($usercert,\'csr.public.cert\');
//导出证书私钥
openssl_pkcs12_export_to_file($usercert,\'csr.private.pfx\',$res,\'123\');

rsa的公私钥加密解密

//公钥加密
 
//$pubKey = file_get_contents(\'public.key\');
 
//返回资源型的
$pubKey = openssl_pkey_get_public(file_get_contents(\'public.key\'));
openssl_public_encrypt(\'123456\',$crypted,$pubKey,OPENSSL_PKCS1_PADDING);
 
base64_encode($crypted);
 
//私钥解密
 
//$priKey = file_get_contents(\'private.key\');
 
//返回资源型的
$priKey = openssl_pkey_get_private(file_get_contents(\'private.key\'));
 
$crypted = base64_decode($crypted);
 
openssl_private_decrypt($crypted,$decrypted,$priKey,OPENSSL_PKCS1_PADDING);
//参数的意义: 密文数据, 加密解密后的数据,密钥,加密解密的填充

证书的加密解密

//加密
$pubKey = file_get_contents(\'csr.public.cert\');
 
$pubKey = openssl_x509_read($pubKey);
 
openssl_public_encrypt(\'1234\',$crypted,$pubKey,OPENSSL_PKCS1_PADDING);
//参数的意义: 密文数据, 加密解密后的数据,密钥,加密解密的填充
$data =  base64_encode($crypted);
 
//解密
$data =  base64_decode($data);
 
openssl_pkcs12_read(file_get_contents(\'csr.private.pfx\'),$priKey,\'123\');
 
openssl_private_decrypt($data,$decrypt,$priKey[\'pkey\'],OPENSSL_PKCS1_PADDING);
//参数的意义: 密文数据, 加密解密后的数据,密钥,加密解密的填充

签名以及验签(证书以及密钥一样的)

//签名
openssl_sign($crypted, $sign, $priKey, OPENSSL_ALGO_SHA1);
 
//验签
$res = openssl_verify($crypted, $sign, $pubKey,OPENSSL_ALGO_SHA1);

 

 

另一种验签MD5或者sha1

//对请求的字符串进行加密 当做签名 发送过去
$username = \'liudehua\';
$age = 23;
$stamp = time();
 
$str = [\'username\'=>$username,\'age\'=>$age,\'stamp\'=>$stamp];
 
//字典排序
ksort($str);
 
$str = http_build_query($str);
 
$sign = md5($str);
 
$str .=\'&sign=\'.$sign;
 
echo $str;
 
//接受到数据后开始进行验签
 
$age = $_GET[\'age\'];
 
$stamp = $_GET[\'stamp\'];
 
$username = $_GET[\'username\'];
 
$sign = $_GET[\'sign\'];
 
 
$str = [\'age\'=>$age,\'stamp\'=>$stamp,\'username\'=>$username];
 
ksort($str);
 
$str = http_build_query($str);
 
$check_sign = md5($str);
 
echo $sign;
echo \'<br>\';
 
echo $check_sign;

 

 

 

 

 

转: http://lampol-blog.com/detail/aid/NzQ5NjhEVEJpcU9CV3hoRXRGZ1RxdmxmUFQ1bWNhcURrWFlGZHp6cQ%3D%3D

相关 : https://www.cnblogs.com/fps2tao/p/8685294.html