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
};