方案参考:
https://www.cnblogs.com/superstudy/p/15398866.html
aes算法:https://www.cnblogs.com/memphis-f/p/10109027.html
会话密钥交换
参考HTTPS握手过程,计划采取同样方式完成敏感信息会话密钥交换
- 基础
- 小程序内置RSA公钥,服务端留存RSA私钥
- 小程序内置RSA加密算法、AES加解密算法、AES随机密钥生成算法、BASE64算法、SHA256算法
- 会话密钥交换
- AES随机密钥生成算法生成会话密钥,小程序保管会话密钥
- RSA算法通过内置RSA公钥加密会话密钥,用于会话密钥明文传输
- wx.login获取loginCode作为密钥交换时的签名验证信息部分原文
- 对 loginCode+会话密钥 SHA256 HASH算法计算会话密钥交换握手摘要信息,用于后台验证密钥传输是否安全
- 拼接会话密钥交换握手信息,格式为
- loginCode|sha256(loginCode+会话密钥)
- 采用会话密钥加密握手信息,格式为
- aes(握手信息)
- 组装会话密钥交换报文,与后台通讯交互进行密钥交换,格式为:
- {"client_hello":"握手信息", "secret":"rsa加密完的会话密钥"}
- 后台接受报文,解析报文,并验证会话密钥交换是否有效,验证方式如下:
a. 后台应用内置RSA私钥解密获取会话密钥明文
b. 通过会话密钥解密握手信息获取握手明文
c. 对解密完成的明文进行校验签名信息是否正确,获取明文窜loginCode及会话密钥通过sha256计算签名信息,判断是否与客户端上送一致
d. 一致情况下对loginCode与微信服务端进行转换,调用服务端API auth.code2Session 接口校验loginCode是否有效
e. 会话密钥校验成功,后台生成会话标识,用于后续敏感信息传输时标识会话信息
会话密钥交换方案实现:
- 小程序端报文模拟构造:
日志打印如下:
模拟小程序请求报文:
loginCode:021SSf000FCFOM1cm7300M8fr81SSf0w
会话密钥明文:1A15CB888E9F69D4B44F5871DCEFD83F
c30b457e25a599893ed73028b978cbf0300b7fdc23865da18ed0d01d74cc4ed7
握手信息明文:021SSf000FCFOM1cm7300M8fr81SSf0w|c30b457e25a599893ed73028b978cbf0300b7fdc23865da18ed0d01d74cc4ed7
aes加密(握手信息):31c42e872d7e8c1131188ae2619a3cee047aa7b8dd10da8936d994496a8e7e9702626c06c6fa24a891b847ba5870a0979dda0e1a4ad22ad627b4416f8b83dae18e9c7225dfea32fb67d147f2fb9edf681c94526c9bb2e0221019041a1aa754dde17b27e9bbfb5b8045e426cb0ed04510
rsa公钥加密(会话密钥):Gl+4vqpw6ptUM326IMIhdiTUWP/ghHq1QOJPGpXJWTZhI+NlrudabzdlG6I+oDWl3FGI1D/gY0zOv/uPhcN/7YBPIkf0M96gwF2h3qgsHQ8J4Q5n0qOHdw2iGtcaSy6E8DdejzqpC1E2/G0K0B7qO2laFrMxygun5Jf5nmOhAA0=
模拟构造的小程序请求报文:
{
"client_hello": "31c42e872d7e8c1131188ae2619a3cee047aa7b8dd10da8936d994496a8e7e9702626c06c6fa24a891b847ba5870a0979dda0e1a4ad22ad627b4416f8b83dae18e9c7225dfea32fb67d147f2fb9edf681c94526c9bb2e0221019041a1aa754dde17b27e9bbfb5b8045e426cb0ed04510",
"secret": "Gl+4vqpw6ptUM326IMIhdiTUWP/ghHq1QOJPGpXJWTZhI+NlrudabzdlG6I+oDWl3FGI1D/gY0zOv/uPhcN/7YBPIkf0M96gwF2h3qgsHQ8J4Q5n0qOHdw2iGtcaSy6E8DdejzqpC1E2/G0K0B7qO2laFrMxygun5Jf5nmOhAA0="
}
- 服务端代码:
- 测试结果:
使用模拟构造的小程序请求报文请求服务端接口,成功返回会话标识sessionid(会话标识即当前用户身份信息)
安全接口设计
通过上述会话密钥交换机制,完成了安全接口的基础保障
在具备会话密钥后,设计安全接口交互保障敏感信息,设计流程如下:
a. 前端生成交易明文 json_data
b. 组织安全接口报文,包含要素:
- 会话标识 s_session_key 来源为密钥交换成功后服务端响应给客户端的会话标识
- 交易时间戳 s_time_stamp
- 交易数据密文 s_data 来源为 aes(json_data) aes加密密钥为会话密钥
- 交易报文摘要 s_mac 来源为 sha256(会话密钥+json_data+s_time_stamp)
c. 后台报文解密及验证,验证流程如下:
根据s_session_key获取会话密钥 --> 解密s_data获取交易明文 --> 服务端计算 s_mac_server (获取服务段留存会话密钥及报文时间戳,按照前端算法及明文拼接方式一致计算) --> 比对计算结果
- 设计分析
通过敏感信息会话密钥机制,可以保护交易敏感数据不被泄露,分析如下:
- 内置RSA公钥,客户端仅包含RSA公钥,在会话密钥交换过程成只有服务端留存有RSA私钥,故即使抓包,会话密钥也无法被截取
- 采用微信loginCode作为会话密钥交换时的验证因子,这样后台会话密钥交换成功时通过loginCode与微信后台进行接口交互,
- 确保会话交互时是通过小程序官方生成的会话,通过微信接口获取到OpenId留存会话,用于后续会话权限控制使用
- s_session_key会话标识后台未采用随机算法生成,通过 sha256(UUID+会话密钥) 保证不可预知
安全接口设计方案实现:文章来源:https://www.toymoban.com/news/detail-773919.html
- 小程序端报文模拟构造:
现在通过某个接口实现加密传输。aes加密接口报文,会话标识作为aes加密的密钥。文章来源地址https://www.toymoban.com/news/detail-773919.html
/**
* post 请求
*
* header传参:
* s_time_stamp 请求时间戳
* sessionid 会话标识 用户唯一标识
* s_mac 签名 服务端用于验签
*
*body体传参 json格式
*
* { "s_data": "Gl+4vqpw6ptUM326IMIhdiTHdw2iGtcaSn5Jf5nmOhAA0=" }
*
*/
到了这里,关于小程序与服务端接口安全性设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!