加解密设计
1.1 设计背景
HTML5页面和java后端交互,为了信息安全和保密,需要做到前后端双向加解密。
1.2 专业术语
RSA:RSA加密算法是一种非对称加密算法。
AES:高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法。
SHA1withRSA:用SHA算法进行签名,用RSA算法进行加密,是一种签名算法。
公钥和私钥:公钥(Public Key)与私钥(Private Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),公钥是密钥对中公开的部分,私钥则是非公开的部分。
1.3 方案对比
加密方案 | 前后端都用RSA非对称加密 | 采用RSA和AES组合加密 |
---|---|---|
实现方式 | 前后端都保存自己的私钥和对方的公钥,公钥加密私钥解密 | 前端保存后端生成的RSA公钥,每次请求都用AES密钥加密,AES密钥用RSA公钥加密。后端用RSA私钥解密AES密钥,然后用AES密钥解密请求数据。响应数据用AES密钥加密,AES密钥用RSA做加签,前端验签,然后解密。 |
前端暴露 | 自己的私钥,后端的公钥 | 后端的公钥 |
安全性 | 因为前端暴露了自己的私钥,将使后端的加密不安全 | 只暴露了后端的RSA公钥,AES密钥是用RSA公钥加密的,而且AES密钥是一次一密,理论上是安全的。 |
1.4 方案流程
前端:事先保存后端生成的RSA公钥 —>发起请求---->用生成的AES秘钥加密请求数据,同时用RSA公钥加密AES秘钥
后端:接收前端请求数据,使用RSA私钥解密AES秘钥,再用AES秘钥解析请求数据,解密成功后,响应数据用AES密钥加密,AES秘钥用RSA私钥加签后返回;
前端:接收后验签,通过后AES秘钥解密响应数据,完成前后端的交互
2. 模块设计
2.1. 前端加密
保存好后端生成的RSA公钥,每次请求都生成一个AES密钥,做到一次一密,请求json格式{“key”:”XXX”,”data”:”XXX”},key是用RSA公钥加密之后的AES密钥,data是用AES密钥加密之后请求数据。
2.2. 后端解密
接收到前端请求数据之后,先用RSA私钥解密key,获取到AES密钥,再用AES密钥解密data获取到请求数据。
2.3. 后端加签加密
Key是用RSA私钥用SHA1withRSA签名算法把AES密钥加签,data是用AES密钥加密响应数据。
2.4. 前端验签解密
先用RSA公钥用SHA1withRSA签名算法验签key,验签通过再处理之后的流程,不通过停止执行后续流程。验签通过之后,再用AES密钥解密data。