1. Java

表单关键信息的非对称加密传输

1、背景环境

这是一个普通的用户登录表单(这里使用的是HTTP协议,当然如果使用HTTPS的话就不需要这样的操作了),我们假设用户的计算机是安全的,那么如何保证用户的表单数据在用户计算机和服务器之间传输过程中的安全呢?

传统的对称加密由于加密解密为同一密钥,所以一旦该密钥泄露,攻击者就可以拿着此密钥解密用户和服务器之间的数据。同时,对称加密的密钥如何安全到传输到通信双方也是一个令人头疼的问题, 针对这个问题,目前常见的解决方法是使用数字签名来解决。

由此,便产生了新的加密方式,即非对称加密方式。在非对称加密中密钥由两部分组成:公钥和私钥,公钥是专门用来加密信息的,私钥是专门用来解密信息的。这里我们假设一个应用场景:用户A希望和用户B进行加密通信,用户A,B各自生成一对密钥即A.pubKey, A.privateKey, B.pubKey, B.privateKey.然后A,B分别将自己的公钥发送给对方(这里如果有中间人攻击的话会出现问题),此后如果A希望和B通信就是用B给A的公钥对信息进行加密然后传输给B,B拿到密文后使用B自己的私钥对密文进行解密;同样B希望和A亦是如此。

这里我首先编写了一个不进行任何加密的例子,模拟用户登录场景用用户名:bh6aol@gmail.com 和密码:123456的虚拟帐号登录,然后对此数据进行抓包分析得到如下图:

如图所示,可以很清楚看出表单里面的密码字段的数据。

接下来,我使用RSA算法对上述过程进行加密处理

浏览器端使用的是 : jsencrypt RSA实现

服务端使用的是:Java官方的RSA实现

进行加密处理后,再次抓包,结果如图所示:

可以看出此时密码字段已经被加密了,即使能够抓包,也不能获取到明文。


在编写代码的过程中遇到一个问题:由于rsa加密后的密文采用base64编码,可能会有+号在密文中,而+号在post过程中会被转义为空格,会造成后端rsa解密方法异常,需要注意!