(本文阅读预计10分钟)
前言:
最近公司在对接第四方采宝服务商,用于聚合门店支付。之前对接微信支付宝都有sdk下载,直接调用服务即可,很多加密中间知识有盲区。
确实,任何时候都得注重基础。
想起了Swoole作者韩天峰曾提及:
“不重视基础。就好比练武功,只求速成,不修炼内功和心法,只练各种招式,这样能高到哪里去?”
(https://blog.csdn.net/ty_hf/article/details/74942935)
这回就把知识的不扎实,翻出来再晒晒理理吧,是学习,也是潜下心来,故有此文。
目录
一.RSA与RSA2有什么区别
二. 加密类型与用途
三. 本次碰到的问题
四. 注意事项
一.RSA与RSA2有什么区别
1.说这个之前,需要再了解下密码学基本知识,
知其所以然,很好的一篇图文文章,传送门:数字签名是什么?
2.为啥叫RSA
让人瞌睡的什么原理算法这里就不提了
百度百科粘贴的一段话:
RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。
当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
3.再说说RSA2
来源:蚂蚁金服在原来RSA的SHA1WithRSA签名算法的基础上,新增了支持SHA256WithRSA的签名算法。便产生的RSA2
优点:该算法在摘要算法上比SHA1WithRSA有更强的安全能力。
换句话说,RSA2这个名词来自于蚂蚁金服,并没有出现新的技术,它只是RSA的升级版,更安全。
(忽然想起以前有种md6加密算法,本质是md5了两次)
开放平台签名算法名称 |
标准签名算法名称 |
备注 |
RSA2 |
SHA256WithRSA |
强制要求RSA密钥的长度至少为2048 |
RSA |
SHA1WithRSA |
对RSA密钥的长度不限制,推荐使用2048位以上 |
4.php如何使用RSA
在php官方扩展代码openssl.php中,截取片段如下:
我们在使用rsa加密时,通过openssl_sign实现
不难看出,RSA与RSA2的切换时通过第4个参数实现
二 加密类型与用途
加密类型有三种:对称加密,非对称加密和其他
1.对称加密
a.定义:加密密钥和解密密钥是相同的
b.问题:泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信的安全性至关重要。
c.举例:DES,AES等
2.非对称加密
a.定义:有两种密钥,一种是公共密钥(正如其名,这是一个可以公开的密钥值),一种是私人密钥(对外保密只有自己知道)
(两种密钥可以互相加解密,公钥加密的信息,只有我们的唯一的私钥可以解密,反之亦如此)
b.场景:
1).公钥加密信息,私钥解开;//常规数据加密,比如微信支付宝传输过程中
2).私钥加密信息,公钥解开;//常用于数据验签,
3).双方公钥加密,在特定排序下的数据加密后做结果对比;//同样用于验签作用,【这也是我们方案中采用的方法】
c.举例:RSA、DSA等
3.其他
有些同学可能会问,常用的md5、hash算法(sha1、sha256、sha512、sha1024等)怎么没被提及,
其实准确的说,md5和hash算法不能算是加密算法,它们都属于信息摘要算法,可以为不同的信息生成独一无二的信息摘要,而它们都属于不可逆算法,
三. 本次碰到的问题
1.php报错,公钥不可用
key parameter is not a valid public key error in openssl_public_encrypt()
原因是因为证书格式不正确,RSA单独签名方法未做字符串处理
需要把密钥由一串变成每行64位,
解决:
2. 获取加密值时,openssl_pkey_get_public返回false
解决:在rsa加密时,被加密的明文长度最大为公钥长度-11,比如数据长度300,那么公钥长度必须大于311,否则失败返回false
3.rsa2的使用函数
四. 注意事项
1.密码加密最好md5加盐salt,
2.尽量减少md5等摘要唯一不可逆加密算法,容易被攻破,愿不愿意的问题
五.参考文章
支付宝:https://docs.open.alipay.com/291/105974
现代 PHP 中的密码安全性:https://www.ibm.com/developerworks/cn/web/wa-php-renewed_2/
author: hann