看到大神的一篇博文 “前后端分离架构中的接口安全(上篇)” ,对其动态密钥的获取的描述存在一些迷惑,理解总结后,记录下这篇博文。
为什么要加密?
想象下: 如果你的用户登录信息被抓包抓到的话,上面大摆着
{
"username" : "root",
"password" : "123456"
}
那岂不是很尴尬。 分分钟把你的个人信息给盗了。
什么是非对称加密?
对称加密算法在加密和解密时使用的是同一个秘钥;而非对称加密算法需要两个密钥来进行加密和解密,这两个密钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。 用某用户公钥加密后的密文,只能使用该用户的私钥才能解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另外一个密钥的性质。
PHP怎么进行非对称加密?
这里推荐一篇博文,你可以不用满世界找度娘谷哥啦。“PHP rsa密钥生成 加密解密”
非对称加密怎么传输数据?
- 客户端生成公私钥对(
clientPublicKey
和clientPrivateKey
) (一直使用这一套公私钥对,要藏好哦) - 调用请求服务端公钥接口,获取服务端返回的
serverPublicKey
- 服务端也是生成了自己的秘钥对(
serverPublicKey
和serverPrivateKey
)(可以不断动态变换自己的秘钥对) - 服务端将密钥
serverPrivateKey
存储起来,客户端不可见 - 服务端仅返回公钥
serverPublicKey
给客户端
- 服务端也是生成了自己的秘钥对(
- 客户端获取到
serverPublicKey
,将它作为公钥,而将clientPublicKey
作为明文进行RSA加密(这个做法是,让服务端能够通过使用serverPrivateKey
进行解密,让服务端获取到clientPublicKey
) - 服务端使用客户端的公钥
clientPublicKey
作为RSA公钥,对客户端所请求的数据结果进行RSA加密,将加密后的数据传送给客户端 - 客户端使用
clientPrivateKey
进行数据解密,得到自己想要的数据
上述步骤中,但凡有一步加密出错获取不到正确的结果,则代表异常访问,不再需要继续执行
黑客劫持数据怎么办?
- 黑客在上面第二步中,是可以获取到服务端的公钥
serverPublicKey
的 - 客户端的公钥传输,是通过服务端的公钥
serverPublicKey
进行加密传输,那么黑客没有服务端的私钥serverPrivateKey
,无法解密,所以获取不到客户端的公钥clientPublicKey
- 黑客可以获取到"服务端使用客户端公钥加密后的数据",但是因为没有客户端公钥,进而无法解密获取数据
黑客能否自己生成秘钥对,从而访问服务端?
首先记住一点:服务端能够获取到的就只有客户端的clientPublicKey
。如果服务端没有对进行任何过滤验证的话,那么无疑,黑客是可以访问服务端的!这无疑与我们的需求相违背的。上面的前提条件是服务端没有对进行任何过滤验证。也就是说,服务端一开始对客户端的clientPublicKey
存在验证的话,那么便能完美解决这一个问题。
- 服务端保存客户端"可以用来获取数据的客户端公钥
clientPublicKey
",如果判断clientPublicKey
是已经记录在案的了,那么它便有获取数据的权限。 - 服务端怎么样去保存
clientPublicKey
?- 线下交付无疑是最安全的方法了:拿个U盘拷贝 或者 看别人屏幕手打(真打?在下佩服),网上的黑客怎么获取?当然记住,U盘有病毒的话可怨不得人了。
- 超安全线上环境:哥们,做过支付宝支付功能吗?在一开始的申请和配置中,最重要的一步就是在官网上填写你的
应用id
和clientPublicKey
等配置数据了,配置无误后,你才能按照它的文档去一步步实现业务支付。它采用的就是线上环境交付clientPublicKey
。如果你能自信交付clientPublicKey
的环境不会让黑客盗取你的数据的话,当然可以采用这一种方式。 - 不安全的线上交付:黑客真的那么多吗?你不怕的话,丢进一个文件,微信/钉钉一发,碰碰运气,祈祷黑客不会在意你,那么你就成功交付了。
黑客从客户端/服务端中盗取秘钥对怎么办?
关于这一点本人是没有什么好的看法的,APP可以被反编译,服务器也并非没有漏洞。就像怎么藏私房钱一样,仁者见仁智者见智。是你有什么好方法的话,也很希望你能在下方讨论分享下,让我这个小渣渣也看看眼界吧,膜拜大佬!