小程序用户信息、手机号授权偶现解密失败问题

小程序用户信息、手机号授权偶现解密失败问题

·  阅读 20
开发者后台校验与解密开放数据

当前端获得了信息、手机号授权的iv、encryptedData传参给后端解密的过程中,出现解密失败(后端的报错信息可能为Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $)之类,而且不是必现的话 有很大的可能性是因为调用 “wx.login => wx.getUserInfo => wx.login” 导致的,在小程序的官方文档的 开放数据校验与解密 一文中有段关于session_key有效性的描写 5d4d6021e9e649a297a83dcc5559bfaatplv-k3u1fbpfcp-zoom-in-crop-mark4536000.image_ 从这段描述中可以看出wx.login的调用时,session_key是可能被更新的,此时使用旧的session_key来解密开放数据的话,将会解密失败

session_key的作用

在 开放数据校验与解密 一文的开头有张流程图可以看出session_key是解密数据的会话密钥 – “钥匙” fc20128a45ed48909f29894dbb04efcetplv-k3u1fbpfcp-zoom-in-crop-mark4536000.image_ 而从wx.login的描述中可以看出session_key是后端通过wx.login返回的code来换取的 4765b40c9d34491eb830f5205c09d6f4tplv-k3u1fbpfcp-zoom-in-crop-mark4536000.image_ 337db609f6304f948fb4c006eca74f91tplv-k3u1fbpfcp-zoom-in-crop-mark4536000.image_ 从功能描述的最后一句“用户数据的加解密通讯需要依赖会话密钥完成“可以看出 对于手机号、用户信息等开放数据的解密是需要依赖session_key来完成的

汇总

现在让我们把所有得到的信息结合起来看:
wx.login => code => 后台获得session_key => wx.getUserInfo => 获得iv、encryptedData等加密数据 => 再一次调用wx.login => code => 可能会更新session_key => ??? 这个时候有两种可能性

  1. 未更新session_key => 后台以session_key解密 => 安全的开放数据
  2. 更新session_key => 后台以新的session_key解密 => 旧的加密开放数据 => 解密失败(以新的钥匙 开旧的锁 钥匙和锁都不匹配 当然打不开)

由于session_key并不是每次都会刷新 所以解密失败就是变成了偶现 参考 github.com/Wechat-Grou…

回头翻了一下小程序开发手册,发现开发过程中忽略了下面这段注意事项。
39290510-652140ee-4962-11e8-8ef8-a222a7686471