评论

小程序内支持crypto.createHmac、Buffer.from加密的替代方案

Node.js 内置的 crypto 模块,不适用于浏览器或微信小程序。微信小程序环境不支持 Node.js 的 `Buffer` 对象,可以使用Uint8Array替代。

需求

把以下加密函数在微信小程序内实现

const crypto = require('crypto')

// 生成加密验签参数
function encryptSign (str) {
  // Buffer类型密钥
  const key = Buffer.from([ ......])
  return crypto.createHmac('sha1', key).update(str).digest('hex')
}

环境支持问题:

  1. Node.js 内置的 crypto 模块。这个模块主要在服务器端使用。只能在 Node.js 环境中使用,不适用于浏览器或微信小程序。可以引入第三方库使其具有类似 Node.js 的功能,crypto-js 可以用来进行加密操作。
  2. 微信小程序环境不支持 Node.js 的 Buffer 对象,但你可以使用其他方法来处理二进制数据,例如 Uint8ArrayArrayBuffer
  3. CryptoJS.HmacSHA1 默认情况下不支持直接接受 Buffer 作为密钥,但你可以将 Buffer 转换为 WordArray,这是 CryptoJS 处理数据的内部格式。你可以使用 CryptoJS.lib.WordArraycreate 方法来实现这一点。

解决方案:

  1. 安装并引入 crypto-jshttps://cryptojs.gitbook.io/docs#hmac
  2. Buffer 转换为 CryptoJSWordArray: 使用 CryptoJS.lib.WordArray.create 方法将 Buffer 转换为 WordArray
  3. 使用 CryptoJS.HmacSHA1 生成 HMAC

替代写法代码:

// 引入 CryptoJS 库
const CryptoJS = require('crypto-js')

// 模拟 Node.js 的 Buffer 对象
function bufferToWordArray (buffer) {
  const wordArray = []
  for (let i = 0; i < buffer.length; i += 4) {
    wordArray.push(
      ((buffer[i] << 24) |
        (buffer[i + 1] << 16) |
        (buffer[i + 2] << 8) |
        buffer[i + 3]) >>> 0
    )
  }
  return CryptoJS.lib.WordArray.create(wordArray, buffer.length)
}

function encryptSign (str) {
  // 示例密钥:Buffer 类型
  const keyBuffer = new Uint8Array([......])

  // 将 Buffer 转换为 WordArray
  const keyWordArray = bufferToWordArray(keyBuffer)

  // 生成 HMAC-SHA1 哈希值
  const hash = CryptoJS.HmacSHA1(str, keyWordArray).toString(CryptoJS.enc.Hex)

  console.log(hash)

  return hash
}
点赞 0
收藏
评论
登录 后发表内容