2026-07-27 11:28:33 +08:00

122 lines
3.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const Sm4Util = require('../../utils/sm4-util');
/**
* 需要加密的字段列表
*/
const ENCRYPTED_FIELDS = ['name', 'mobile', 'idCard'];
/**
* 判断数据是否已加密
* @param {string} value - 待判断的值
* @param {string} field - 字段名称
* @returns {boolean} true表示已加密,false表示未加密
*/
function isEncrypted(value, field) {
if (!value || typeof value !== 'string') {
return false;
}
// 手机号:如果是11位纯数字,则未加密
if (field === 'mobile') {
return !/^1\d{10}$/.test(value);
}
// 身份证:如果是15或18位数字(最后一位可能是X),则未加密
if (field === 'idCard') {
return !/^(\d{15}|\d{17}[\dXx])$/.test(value);
}
// 姓名:如果是常见的中文/英文姓名格式(2-20个字符),则未加密
if (field === 'name') {
// 纯中文姓名(2-10个字符)或纯英文字母姓名(含空格,2-50个字符)
if (/^[\u4e00-\u9fa5]{2,10}$/.test(value) || /^[a-zA-Z\s]{2,50}$/.test(value)) {
return false;
}
}
// 其他情况:如果符合base64格式且长度较长,则认为已加密
// URL-safe base64 格式:包含字母、数字、-、_
if (/^[A-Za-z0-9_-]+={0,2}$/.test(value) && value.length >= 20) {
return true;
}
// 默认认为未加密
return false;
}
/**
* 加密订单敏感字段
* @param {Object} data - 订单数据
* @returns {Object} 加密后的数据
*/
function encryptOrderFields(data) {
if (!data || typeof data !== 'object') {
return data;
}
const encryptedData = { ...data };
ENCRYPTED_FIELDS.forEach(field => {
if (encryptedData[field] && typeof encryptedData[field] === 'string' && encryptedData[field].trim() !== '') {
try {
encryptedData[field] = Sm4Util.encryptDataForSm3(encryptedData[field]);
} catch (error) {
console.error(`加密字段 ${field} 失败:`, error.message);
}
}
});
return encryptedData;
}
/**
* 解密订单敏感字段
* @param {Object} data - 订单数据
* @returns {Object} 解密后的数据
*/
function decryptOrderFields(data) {
if (!data || typeof data !== 'object') {
return data;
}
const decryptedData = { ...data };
ENCRYPTED_FIELDS.forEach(field => {
if (decryptedData[field] && typeof decryptedData[field] === 'string' && decryptedData[field].trim() !== '') {
// 先判断是否已加密,如果未加密则跳过解密
if (!isEncrypted(decryptedData[field], field)) {
return; // 跳过此字段
}
try {
decryptedData[field] = Sm4Util.decryptDataForSm3(decryptedData[field]);
} catch (error) {
console.error(`解密字段 ${field} 失败:`, error.message);
// 解密失败时保留原值
}
}
});
return decryptedData;
}
/**
* 批量解密订单列表的敏感字段
* @param {Array} list - 订单列表
* @returns {Array} 解密后的订单列表
*/
function decryptOrderList(list) {
if (!Array.isArray(list)) {
return list;
}
return list.map(item => decryptOrderFields(item));
}
module.exports = {
encryptOrderFields,
decryptOrderFields,
decryptOrderList,
isEncrypted,
ENCRYPTED_FIELDS
};