〇、
- 本文结合了登录RSA验证,token验证,报文的加密传输(AES保证效率、RSA保证安全),防篡改以及其他的相关验证/限制(防重复提交、ip/token频次限制后期都可以融合进来)等一些列的技术点,可供参考;
- tips: 报文RSA私钥与AES密钥明文 都有2种作用:RSA私钥,还是TOKEN算法密钥;AES密钥明文 还是防篡改的KEY;这样充分利用了其安全的性质进行重复利用,可以节省部分开销,否则还需要额外进行维护
一、登录
- 客户端填写账密信息发起请求,后台生成RSA密钥,redis保存私钥(k-v:公钥-私钥),返回公钥
- 客户端对账密使用RSA公钥进行加密,再携带公钥传输到后台(防止传输过程中账密被解密获取)
- 后台根据携带的公钥找到私钥然后解密,进行验证账密,成功后继续进行
- 然后使用JWT技术生成token,token的算法可以使用RSA私钥作为token算法的密码,最终生成token(真token),然后拼接RSA公钥生成最终的
伪token
(真token###RSA公钥) - 然后将生成的
伪token
(token+RSA公钥),传给客户端用于令牌验证以及报文的加密,json格式({"token":"真正token###rsa公钥"}
)
二、 前端发送请求
- 客户端填写请求参数,然后使用AES以及随机生成的
AES密钥明文
对称加密将报文进行加密,生成AES加密的报文
(对称加密效率高) - 然后解析token,获取rsa公钥,使用RSA公钥对
AES密钥明文
进行加密,生成RSA加密的AES密钥
(非对称加密更安全) - 再使用
AES密钥明文
作为防篡改key
对上述AES加密的报文
使用(256+MD5)进行计算,生成字符串作为签名256MD5签名
,进行防篡改操作 - 最后发送带后台:报文json格式(
{"secretInfo":"AES加密的报文","aesKey":"RSA加密的AES密钥","checkStr":"256MD5签名","token":"真token###报文公钥"}
)。
三、 下面后台处理(验证部分使用aop切面编程+注解)
- 后台收到上述报文后,先解析
伪token
(真token###报文公钥),从redis获取对应的rsa私钥/token算法的key
,使用rsa私钥/token算法的key
计算验证token是否通过; - 然后使用
rsa私钥
对RSA加密的AES密钥
进行解密,获取AES密钥明文/防篡改key
; - 然后进行防篡改验证:使用256MD5和
防篡改key
生成签名与传进来的checkStr
进行对比,如果一致则未被篡改 - 进行重复提交检测(以内容重复提交为例–即内容不得相同,修改过可再次提交),使用加密的报文内容作为key存储到redis并设置实现;ip/token访问频次限制等;
- 然后解密报文,并进行参数检测,json可以定义反射方法对参数进行验证;
- 最后进行业务处理,并返回处理结果。