feat: 数据安全-加密解密与掩码
parent
cbe629746e
commit
3a961fdf39
@ -0,0 +1,135 @@
|
||||
<template>
|
||||
<div class="p-5 space-y-5 !bg-gray-100">
|
||||
<el-card header="测试加解密掩码场景">
|
||||
<el-form
|
||||
ref="formRef"
|
||||
:model="formData"
|
||||
label-width="140px"
|
||||
>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<editMaskVal
|
||||
label="姓名"
|
||||
:formData="formData"
|
||||
:propName="'name'"
|
||||
:typeName="'nameMask'"
|
||||
/>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item
|
||||
label="年龄"
|
||||
prop="age"
|
||||
>
|
||||
<el-input v-model="formData.age" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item
|
||||
label="性别"
|
||||
prop="sex"
|
||||
>
|
||||
<el-input v-model="formData.sex" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<editMaskVal
|
||||
label="手机号"
|
||||
:formData="formData"
|
||||
:propName="'tel'"
|
||||
:typeName="'phoneFilter'"
|
||||
/>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<editMaskVal
|
||||
label="银行卡号"
|
||||
:formData="formData"
|
||||
:propName="'cardNo'"
|
||||
:typeName="'cardNoFilter'"
|
||||
/>
|
||||
</el-col>
|
||||
<!--车牌号改变的时候清空车架号-->
|
||||
<el-col :span="12">
|
||||
<editMaskVal
|
||||
label="车牌号"
|
||||
:formData="formData"
|
||||
:propName="'carNo'"
|
||||
:typeName="'carBoardNumFilter'"
|
||||
@currentBlur="changeCarNo"
|
||||
/>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<editMaskVal
|
||||
label="车架号"
|
||||
:formData="formData"
|
||||
:propName="'carVin'"
|
||||
:typeName="'carVinFilter'"
|
||||
/>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<editMaskVal
|
||||
label="身份证号"
|
||||
:formData="formData"
|
||||
:propName="'idNo'"
|
||||
:typeName="'IdNumberFilter'"
|
||||
/>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<div class="flex justify-center">
|
||||
<el-button
|
||||
type="primary"
|
||||
class="w-40"
|
||||
:loading="loading"
|
||||
@click="doSubmit"
|
||||
>提交</el-button
|
||||
>
|
||||
</div>
|
||||
</el-form>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import { ref, onMounted } from 'vue';
|
||||
import mockData from './utils/mockData';
|
||||
import editMaskVal from './components/editMaskVal.vue';
|
||||
import { decrypt, encrypt } from './utils/paEncrypt';
|
||||
import { ElMessageBox } from 'element-plus';
|
||||
|
||||
const formData = ref({});
|
||||
const loading = ref(false);
|
||||
const formRef = ref();
|
||||
|
||||
onMounted(() => {
|
||||
initData();
|
||||
});
|
||||
|
||||
const initData = () => {
|
||||
setTimeout(() => {
|
||||
decrypt(mockData, ['name', 'tel', 'cardNo', 'carNo', 'carVin', 'idNo']);
|
||||
formData.value = mockData;
|
||||
console.log('获取接口后解密的数据', formData.value);
|
||||
}, 200);
|
||||
};
|
||||
|
||||
const doSubmit = () => {
|
||||
loading.value = true;
|
||||
setTimeout(() => {
|
||||
const { ...submitInfo } = formData.value;
|
||||
encrypt(submitInfo, ['name', 'tel', 'cardNo', 'carNo', 'carVin', 'idNo']);
|
||||
ElMessageBox({
|
||||
title: '提交成功',
|
||||
message: <p>请打开控制台查看结果</p>,
|
||||
});
|
||||
console.log('提交给接口加密的数据', submitInfo);
|
||||
console.log('本地表单数据', formData.value);
|
||||
loading.value = false;
|
||||
}, 1000);
|
||||
};
|
||||
|
||||
const changeCarNo = () => {
|
||||
formData.value.carVin = '';
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped></style>
|
||||
@ -0,0 +1,19 @@
|
||||
/**
|
||||
* 这里模拟后端返回的数据
|
||||
* 需要加密返回
|
||||
*/
|
||||
import { str2binb } from './paEncrypt';
|
||||
|
||||
const result = {
|
||||
name: str2binb('洛子息'),
|
||||
tel: str2binb('18888888888'),
|
||||
cardNo: str2binb('6228480000000000000'),
|
||||
carNo: str2binb('浙A88888'),
|
||||
carVin: str2binb('5YJSA19A7DF109075'),
|
||||
idNo: str2binb('110101199901011234'),
|
||||
// 普通数据
|
||||
age: 18,
|
||||
sex: '男',
|
||||
};
|
||||
|
||||
export default result;
|
||||
@ -0,0 +1,101 @@
|
||||
/**
|
||||
* 手机号脱敏
|
||||
* @name phoneFilter
|
||||
* @param {*} phone
|
||||
*/
|
||||
|
||||
export const phoneFilter = (phone) => {
|
||||
if (phone != null) {
|
||||
return phone.replace(/^(.{3}).+(.{4})$/, '$1****$2');
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 身份证号脱敏
|
||||
* @name IdNumberFilter
|
||||
* @param {*} IdNum
|
||||
*/
|
||||
|
||||
export const IdNumberFilter = (IdNum, sensitiveSwitch = 'OFF') => {
|
||||
if (IdNum != null) {
|
||||
if (IdNum.length <= 8) {
|
||||
return IdNum.replace(/^(.{2}).+(.{2})$/, '$1****$2');
|
||||
} else {
|
||||
if (sensitiveSwitch === 'ON') {
|
||||
return IdNum.replace(/^(.{2}).+(.{2})$/, '$1****$2');
|
||||
} else {
|
||||
return IdNum.replace(/^(.{4}).+(.{4})$/, '$1****$2');
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
/**
|
||||
* 车架号脱敏
|
||||
* @name carVinFilter
|
||||
* @param {*} carVin
|
||||
*/
|
||||
|
||||
export const carVinFilter = (carVin) => {
|
||||
if (carVin != null) {
|
||||
return carVin.replace(/^(.{4}).+(.{4})$/, '$1****$2');
|
||||
}
|
||||
};
|
||||
/**
|
||||
* 车牌号脱敏
|
||||
* @name carBoardNumFilter
|
||||
* @param {*} carBoardNum
|
||||
*/
|
||||
|
||||
export const carBoardNumFilter = (carBoardNum, sensitiveSwitch = 'OFF') => {
|
||||
if (carBoardNum != null) {
|
||||
if (sensitiveSwitch === 'ON') {
|
||||
return carBoardNum.replace(/^(.{3}).+(.{1})$/, '$1****$2');
|
||||
} else {
|
||||
return carBoardNum.replace(/^(.{2}).+(.{2})$/, '$1****$2');
|
||||
}
|
||||
}
|
||||
};
|
||||
/**
|
||||
* 邮箱脱敏
|
||||
* @name emailFilter
|
||||
* @param {*} email
|
||||
*/
|
||||
|
||||
export const emailFilter = (email) => {
|
||||
if (email != null) {
|
||||
return email.replace(/^(.{3}).+(.{4})$/, '$1****@$2');
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 姓名脱敏
|
||||
* @name nameMask
|
||||
* @param {*} email
|
||||
*/
|
||||
export const nameMask = (name) => {
|
||||
if (name) {
|
||||
return name.slice(0, 1) + '*'.repeat(name.length - 1);
|
||||
}
|
||||
};
|
||||
|
||||
export const cardNoMask = (no) => {
|
||||
if (!no) {
|
||||
return '';
|
||||
}
|
||||
if (no.length > 7) {
|
||||
return no.slice(0, 3) + '*'.repeat(no.length - 7) + no.slice(-4);
|
||||
}
|
||||
return '*******';
|
||||
};
|
||||
|
||||
/**
|
||||
* 银行卡号脱敏
|
||||
* @name cardNoFilter
|
||||
* @param {*} cardNo
|
||||
*/
|
||||
|
||||
export const cardNoFilter = (cardNo) => {
|
||||
if (cardNo != null) {
|
||||
return cardNo.replace(/^(.{4}).+(.{4})$/, '$1****$2');
|
||||
}
|
||||
};
|
||||
Loading…
Reference in New Issue