大家好,在日常开发中涉及到一些比较敏感的数据。比如身份证,手机号等这些数据我们不能直接保存到数据库中,而是需要通过数据加密的方式,采用AES,DES等加密方式,加密之后在保存到数据库中,而在查询时,再通过解密的方式将数据返回给前端。如果数据库敏感数据不加密,那么数据库万一被他人盗取后果不堪设想。
springBoot中如何给敏感数据脱敏
Springboot AOP对指定敏感字段数据加密存储的实现
要实现这一功能肯定时需要使用注解的方式拦截请求方法中的数据进行处理的
接口请求端分为两种请求方式去1. 请求查询用户数据,2. 请求保存用户数据
请求保存用户数据时,我们直接判断需要加密的字段,然后保存到数据库即可
请求查询用户数据时,我们把数据库的数据解密,然后判断前端是否需要脱敏处理,将数据返回给前端即可
@Target
({ElementType.METHOD})
@Retention
(RetentionPolicy.RUNTIME)
public
@interface
DataProcess {
* 处理数据方式 加密,解密,通过,默认
DataHandle
sign
()
default
DataHandle
.PASS_ADN_SENSITIVE
;
5. 声明实体类中数据加解密方式
* description: EncryptField2 <br>
* date: 2022/9/3 15:33 <br>
* author: 10412 <br>
* version: 1.0 <br>
* @author 10412
@Target
({ElementType
.FIELD
,ElementType
.PARAMETER
})
@Retention
(RetentionPolicy.RUNTIME)
public
@interface
FieldProcess {
* 加密方式 默认AES
EncryptWayEnum
enumType
() default EncryptWayEnum
.AES
;
* 加密秘钥默认 9B4E7C1045A02A2F 秘钥默认16个字符
String
key
() default "
9
B4E7C1045A02A2F";
* 是否需要脱敏处理
boolean
hasSensitive
() default false;
* 脱敏数据类型(默认自定义)
PrivacyTypeEnum
privacyEnum
() default PrivacyTypeEnum
.ID_CARD
;
* 前置不需要打码的长度
int
prefixNoMaskLen
() default
1
;
* 后置不需要打码的长度
int
suffixNoMaskLen
() default
1
;
* 用什么打码
String
symbol
() default "*";
6. 数据脱敏工具类
*
@description
:
*
@author
: xiaYZ
*
@createDate
: 2022/6/21
public
class
PrivacyUtil
{
* 隐藏邮箱
public
static
String
hideEmail
(
String
email
) {
return
email.
replaceAll
(
"(\w?)(\w+)(\w)(@\w+\.[a-z]+(\.[a-z]+)?)"
,
"$1****$3$4"
);
* 【中文姓名】只显示第一个汉字,其他隐藏为星号,比如:任**
public
static
String
hideChineseName
(
String
chineseName
) {
if
(chineseName ==
null
) {
return
null
;
return
desValue
(chineseName,
1
,
0
,
"*"
);
* 【身份证号】显示前4位, 后2位
public
static
String
hideIdCard
(
String
idCard
) {
return
desValue
(idCard,
4
,
2
,
"*"
);
* 【手机号码】前三位,后四位,其他隐藏。
public
static
String
hidePhone
(
String
phone
) {
return
desValue
(phone,
3
,
4
,
"*"
);
* 对字符串进行脱敏操作
*
@param
origin 原始字符串
*
@param
prefixNoMaskLen 左侧需要保留几位明文字段
*
@param
suffixNoMaskLen 右侧需要保留几位明文字段
*
@param
maskStr 用于遮罩的字符串, 如'*'
*
@return
脱敏后结果
public
static
String
desValue
(
String
origin, int prefixNoMaskLen, int suffixNoMaskLen,
String
maskStr
) {
if
(origin ==
null
) {
return
null
;
StringBuilder
sb =
new
StringBuilder
();
for
(int i =
0
, n = origin.
length
(); i < n; i++) {
if
(i < prefixNoMaskLen) {
sb.
append
(origin.
charAt
(i));
continue
;
if
(i > (n - suffixNoMaskLen -
1
)) {
sb.
append
(origin.
charAt
(i));
continue
;
sb.
append
(maskStr);
return
sb.
toString
();
7.处理注解的方法