需求
把以下加密函数在微信小程序内实现
const crypto = require('crypto')
// 生成加密验签参数
function encryptSign (str) {
// Buffer类型密钥
const key = Buffer.from([ ......])
return crypto.createHmac('sha1', key).update(str).digest('hex')
}
环境支持问题:
- Node.js 内置的
crypto
模块。这个模块主要在服务器端使用。只能在 Node.js 环境中使用,不适用于浏览器或微信小程序。可以引入第三方库使其具有类似 Node.js 的功能,crypto-js
可以用来进行加密操作。 - 微信小程序环境不支持 Node.js 的
Buffer
对象,但你可以使用其他方法来处理二进制数据,例如Uint8Array
和ArrayBuffer
。 CryptoJS.HmacSHA1
默认情况下不支持直接接受Buffer
作为密钥,但你可以将Buffer
转换为WordArray
,这是CryptoJS
处理数据的内部格式。你可以使用CryptoJS.lib.WordArray
的create
方法来实现这一点。
解决方案:
- 安装并引入
crypto-js
: https://cryptojs.gitbook.io/docs#hmac - 将
Buffer
转换为CryptoJS
的WordArray
: 使用CryptoJS.lib.WordArray.create
方法将Buffer
转换为WordArray
。 - 使用
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
}