89 lines
3.3 KiB
JavaScript
89 lines
3.3 KiB
JavaScript
const { sm4 } = require('sm-crypto');
|
||
|
||
const appId = process.env.CONFIG_ZYB_YB_APPID;
|
||
const appSecret = process.env.CONFIG_ZYB_YB_SECRET;
|
||
|
||
// 检查环境变量是否配置
|
||
function checkEnvConfig() {
|
||
if (!appId || !appSecret) {
|
||
const error = new Error(
|
||
'加密配置未设置:缺少环境变量 CONFIG_ZYB_YB_APPID 或 CONFIG_ZYB_YB_SECRET。\n' +
|
||
'请确保在环境配置文件中设置了这些变量。'
|
||
);
|
||
error.code = 'ENV_CONFIG_MISSING';
|
||
throw error;
|
||
}
|
||
if (appId.length < 16) {
|
||
const error = new Error('CONFIG_ZYB_YB_APPID 长度必须至少16个字符');
|
||
error.code = 'ENV_CONFIG_INVALID';
|
||
throw error;
|
||
}
|
||
}
|
||
|
||
class Sm4Util {
|
||
static encryptDataForSm3(plainStr) {
|
||
checkEnvConfig();
|
||
return this.encryptData(plainStr, appId, appSecret);
|
||
}
|
||
|
||
static encryptData(plainStr, appId, appSecret) {
|
||
// 取appId的前16个字符作为第一个密钥(对应Java逻辑)
|
||
const firstKey = appId.substring(0, 16);
|
||
|
||
// 将字符串转换为32位十六进制密钥(SM4要求)
|
||
const firstKeyHex = Buffer.from(firstKey, 'utf8').toString('hex').padEnd(32, '0').substring(0, 32);
|
||
|
||
// 使用第一个密钥加密appSecret,得到十六进制字符串(对应Java的encryptHex)
|
||
const encKeyHex = sm4.encrypt(appSecret, firstKeyHex,);
|
||
|
||
// 取加密结果的前16个字符作为新密钥(对应Java逻辑:newKey = encKey.substring(0, 16))
|
||
const newKey = encKeyHex.substring(0, 16);
|
||
|
||
// 将新密钥转换为32位十六进制密钥(SM4要求)
|
||
const newKeyHex = Buffer.from(newKey, 'utf8').toString('hex').padEnd(32, '0').substring(0, 32);
|
||
|
||
// 使用新密钥加密明文
|
||
const encrypted = sm4.encrypt(plainStr, newKeyHex);
|
||
|
||
// 转换为URL安全的base64
|
||
const buffer = Buffer.from(encrypted, 'hex');
|
||
const base64 = buffer.toString('base64');
|
||
return base64.replace(/\+/g, '-').replace(/\//g, '_');
|
||
}
|
||
|
||
|
||
static decryptDataForSm3(encryptStr) {
|
||
checkEnvConfig();
|
||
return this.decryptData(encryptStr, appId, appSecret);
|
||
}
|
||
|
||
static decryptData(encryptStr, appId, appSecret) {
|
||
// 相同的密钥生成逻辑
|
||
const firstKey = appId.substring(0, 16);
|
||
|
||
// 将字符串转换为32位十六进制密钥(SM4要求)
|
||
const firstKeyHex = Buffer.from(firstKey, 'utf8').toString('hex').padEnd(32, '0').substring(0, 32);
|
||
|
||
const encKeyHex = sm4.encrypt(appSecret, firstKeyHex);
|
||
|
||
// 取加密结果的前16个字符作为新密钥(对应Java逻辑:newKey = encKey.substring(0, 16))
|
||
const newKey = encKeyHex.substring(0, 16);
|
||
|
||
// 将新密钥转换为32位十六进制密钥(SM4要求)
|
||
const newKeyHex = Buffer.from(newKey, 'utf8').toString('hex').padEnd(32, '0').substring(0, 32);
|
||
|
||
// 处理URL安全的base64
|
||
let base64Str = encryptStr.replace(/-/g, '+').replace(/_/g, '/');
|
||
const padding = 4 - (base64Str.length % 4);
|
||
if (padding !== 4) {
|
||
base64Str += '='.repeat(padding);
|
||
}
|
||
|
||
const buffer = Buffer.from(base64Str, 'base64');
|
||
const hexStr = buffer.toString('hex');
|
||
|
||
return sm4.decrypt(hexStr, newKeyHex);
|
||
}
|
||
}
|
||
|
||
module.exports = Sm4Util; |