使用crypto-js解密微信小程序用户信息加密数据

微信小程序会对用户信息等敏感数据进行加密。

官网上是这么说明的:

加密数据解密算法

接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和 unionId),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据(encryptedData) 进行对称解密。 解密算法如下:

  1. 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
  2. 对称解密的目标密文为 Base64_Decode(encryptedData)。
  3. 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
  4. 对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。

微信官方提供了多种编程语言的示例代码(点击下载)。每种语言类型的接口名字均一致。调用方式可以参照示例。

另外,为了应用能校验数据的有效性,会在敏感数据加上数据水印( watermark )

官网上提供了nodejs版本的解密算法。

我在网上查了下,非nodejs版的解密方法,蔡-Rd利用crypojs实现的:使用CryptoJS解决微信小程序用户信息解密。这个解决方法,在我使用Typescript时,无法成功导入。在参考了 使用CryptoJS解决微信小程序用户信息解密 和 理解AES加密解密的使用方法 两篇文章,又折腾了两三天,最后用crypto-js库成功实现了解密。

安装crypto-js:

npm install crypto-js --save

详细代码如下:

// 引入crypto-js
import CryptoJS from 'crypto-js'
import {Base64} from 'js-base64'


class Decode {
  appId: string
  sessionKey: string

  constructor(appId: string, sessionKey: string) {
    this.appId = appId
    this.sessionKey = sessionKey
  }

  decryptData(data: string, ivv: string):any {
    let key = CryptoJS.enc.Base64.parse(this.sessionKey)
    let iv = CryptoJS.enc.Base64.parse(ivv)
    let decrypt = CryptoJS.AES.decrypt(data, key, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7
    })
    return JSON.parse(Base64.decode(CryptoJS.enc.Base64.stringify(decrypt)))
  }
}


export default Decode

这是Typescript代码,再改成es的代码也很简单。

你可能感兴趣的:(FE)