const CryptoJS = require('./crypto-js'); // 云函数入口文件 const cloud = require('wx-server-sdk') cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境 const db = cloud.database(); /** * 将字符串转化为数字(若字符串唯一,则结果也具有唯一性) * * @param {String} s 需要转换的字符串 * @param {Number} n 返回的结果的数字位数 */ async function convertToUniqueDigits(s, n) { // 使用哈希算法将字符串转换为数字 const m = sha256(s); // 将哈希值转换为数字,并将结果映射到指定的位数 let x = parseInt(m, 16) % (10n); // 如果结果中有重复的数字,增加一个偏移量 while (hasDuplicateDigits(x)) { x = (x + 1) % (10n); } //检查数据库是否存在这个id const hasUID = await checkHasUid(x); //存在这个id,则重新调用该函数并增加转化结果的位数 if(hasUID>0){ return convertToUniqueDigits(s,n+1); //发现不能使用++,会无限循环 } //不存在这个ID,直接返回结果 else{ return x; } } //检查是否存在相同的uid async function checkHasUid(uid){ const res = await db.collection('user_list').where({ uid: String(uid) }).count(); return res.total } function sha256(s) { // 使用 SHA-256 哈希算法将字符串转换为哈希值 const hash = CryptoJS.SHA256(s); return hash.toString(CryptoJS.enc.Hex); } function hasDuplicateDigits(x) { // 检查数字中是否有重复的数字 const digits = String(x).split(''); return digits.length !== new Set(digits).size; } module.exports = { convertToUniqueDigits: convertToUniqueDigits };
时间: 2023-06-12 07:07:55 浏览: 258
这是一个 Node.js 云函数,用于将字符串转换为唯一的数字。它使用了 CryptoJS 库来实现 SHA-256 哈希算法,将字符串转换为哈希值。然后将哈希值映射到指定的位数,如果结果中有重复的数字,则增加一个偏移量,直到得到一个唯一的数字。它还包含了一个函数来检查数据库中是否存在相同的唯一数字,如果存在则重新调用该函数并增加转化结果的位数。最后,它返回唯一数字。
相关问题
``` const CryptoJS = require('crypto-js'); ```
这行代码的作用是引入 Node.js 环境下的加密库 CryptoJS。CryptoJS 提供了多种加密算法,包括 AES、DES、Triple DES、Rabbit、RC4 等等。可以使用这些算法对数据进行加密和解密。使用 require() 函数将 CryptoJS 模块导入到当前文件中,然后通过 const 关键字创建一个常量 CryptoJS 来引用它。
// ---------- 1. 初始化 ---------- const crypto = require('crypto-js'); const appSecretKey = apt.variables.get("API_SECRET"); // 从环境变量获取密钥 // ---------- 2. 手动配置参数 ---------- // 2.1 手动输入Query参数(替代apt.getRequestUrl) const manualQueryParams = {}; // 默认无Query参数
### 如何使用 `Crypto-JS` 库结合环境变量 `API_SECRET` 进行加密或签名
#### 加密数据
以下是通过 `Crypto-JS` 结合环境变量 `API_SECRET` 对数据进行 AES 加密的实现方式:
```javascript
// 引入 CryptoJS 库
const CryptoJS = require('crypto-js');
// 获取环境变量中的 API_SECRET 作为密钥
const secretKey = process.env.API_SECRET || 'default-secret-key';
if (!secretKey) {
throw new Error('Environment variable API_SECRET is not set.');
}
// 随机生成初始化向量 (IV),长度为 16 字节
const iv = CryptoJS.lib.WordArray.random(16);
// 要加密的数据(例如游戏状态)
const dataToEncrypt = { score: 100, level: 5 };
const jsonString = JSON.stringify(dataToEncrypt);
// 执行 AES 加密
const encryptedData = CryptoJS.AES.encrypt(jsonString, secretKey, { iv: iv });
// 输出加密后的结果
console.log('Encrypted Data:', encryptedData.toString());
```
此代码片段展示了如何利用 `CryptoJS.AES.encrypt` 方法对数据进行加密[^1]。
---
#### 生成签名
如果需要基于 HMAC-SHA1 或其他哈希算法生成签名,可以按照以下方式进行:
```javascript
// 引入 CryptoJS 库
const CryptoJS = require('crypto-js');
// 获取环境变量中的 API_SECRET 作为密钥
const apiSecret = process.env.API_SECRET;
if (!apiSecret) {
throw new Error('Environment variable API_SECRET is not set.');
}
// 构造待签名的消息字符串
const message = 'example-app-id' + '$' + '/endpoint/path'.toLowerCase() + '$' + Date.now();
// 使用 HmacSHA1 算法生成签名
const signature = CryptoJS.HmacSHA1(message, apiSecret).toString(CryptoJS.enc.Base64);
// 输出生成的签名
console.log('Generated Signature:', signature);
```
在此示例中,消息字符串由应用 ID、URL 路径以及时间戳拼接而成,并通过 `HmacSHA1` 函数与 `API_SECRET` 密钥计算得出 Base64 编码形式的签名[^3]。
---
#### 注意事项
- **安全性**:确保 `API_SECRET` 不会被泄露到公共环境中。建议仅在受信任的服务端存储并访问该值。
- **依赖管理**:确认项目已安装 `crypto-js` 库。可以通过命令 `npm install crypto-js` 添加依赖项。
- **跨平台兼容性**:当涉及前后端交互时,需验证双方使用的加密/解密逻辑是否一致,尤其是关于 IV 的处理部分。
---
### 示例总结
以上两段代码分别演示了如何使用 `Crypto-JS` 实现数据加密和签名生成的功能。两者均依赖于环境变量 `API_SECRET` 提供的安全密钥来保障通信过程中的信息安全。
阅读全文
相关推荐

















