Spring aop+反射实现电话号加密

网友投稿 835 2023-01-13

Spring aop+反射实现电话号加密

Spring aop+反射实现电话号加密

加密算法

为什么需要加密呢?就好比战争时期特工在进行传输情报的时候,如果将情报明文直接通过某种媒介传输给同盟人员,那么一旦情报被地方截取,就会酿成大祸。如果将明文通过某种加密算法加密成杂乱无章的密文,即使被敌方截获,没有对应的解密算法,也很难识别出其中的明文。安全传输领域,加密算法是一种很常用的手段,它可以保证数据不被窃取和泄漏,还可以保证数据的完整性,不被篡改。

常见的加密算法有对称加密,非对称加密,单向加密(签名)等分类。其中对称加密算法,加密密钥和解密密钥是同一个,因此发送发和接收方都需要维护一个相同的密钥,如果密钥要修改,双方都需要同时修改。非对称加密算法中,发送发用公钥进行加密,接收方用私钥进行解密。单向加密算法是对传输的数据生成一个签名,通过这个签名来验证数据在传输过程中是否被篡改过,一般是不可逆的。

AES

MD5

MD5算法是一种不可逆的签名算法,对相同的输入通过MD5散列函数处理后,会输出相同的信息。因此MD5可以验证传输的数据是否有被篡改,但是如果窃密者对明文进行了修改后,再使用MD5算法进行散列,接收方将无法判断明文已经被修改了。一般数据库存储用户密码会将密码使用MD5进行处理。

HMAC-MD5

HMAC-MD5由一个H函数和一个密钥组成,一般我们采用的散列函数为Md5或者SHA-1。HMAC-MD5算法就是采用密钥加密+Md5信息摘要的方式形成新的密文。

AOP

众所周知,AOP(面向切面编程)是Spring一个重要特性,它将核心关注点和业务逻辑进行解耦,将业务无关的逻辑提取出来作为公共模块进行处理。它有切点,切面,连接点,通知的概念。切点就是我们可以织入切面的点,切面就是我们要织入的横切逻辑,通知包含前置通知,后置通知,返回通知,异常通知,环绕通知等。

1. 引入依赖

org.projectlombok

lombok

1.16.18

org.springframework

spring-context

5.2.8.RELEASE

org.springframework

spring-aop

5.2.8.RELEASE

org.aspectj

aspectjweaver

1.9.5

2. 业主信息类、业主信息服务类

@Data

@AllArgsConstructor

public class CustomerInfo {

private String name;

private String phoneNum;

}

@Service

public class CustomerInfoService {

@PhoneEncryptionForList(fields = "phoneNum", clazz = CustomerInfo.class)

public List listCustomerInfo() {

return Arrays.asList(

new CustomerInfo("小王", "15112368569"),

new CustomerInfo("小李", "13652298565"),

new CustomerInfo("小武", "18965653698"),

new CustomerInfo("小天", "13192558569")

);

}

}

3. 电话号加密注解,电话号加密切面类

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface PhoneEncryptionForList {

/**

* 加密字段

*

* @return

*/

String[] fields();

/**

* 加密对象类型

*

* @return

*/

Class> clazz();

}

@Aspect

@Component

public class PhoneEncryptionForListAspect {

private static final int PHONE_SIZE = 11;

@AfterReturning(value = "@annotation(com.zzq.spring.phone.encryption.PhoneEncryptionForList)", returning = "result")

public void doEncrypt(JoinPoint joinPoint, Object result) {

if (result == null || !(result instanceof List)) {

System.out.println("result class type is not list, annotation is invalid");

return;

}

List list = (List) result;

if (CollectionUtils.isEmpty(list)) {

return;

}

// 获取注解的属性值

Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();

PhoneEncryptionForList annotation = method.getAnnotation(PhoneEncryptionForList.class);

String[] fields = annotation.fields();

Class> clazz = annotation.clazz();

for (String field : fields) {

try {

// 反射获取实体类加密字段相应的 set 和 get 方法

char[] chars = field.toCharArray();

chars[0] = (char) (chars[0] - 32);

String setMethodName = "set" + new String(chars);

String getMethodName = "get" + new String(chars);

Method getMethod = clazz.getDeclaredMethod(getMethodName);

Method setMethod = clazz.getDeclaredMethod(setMethodName, String.class);

for (Object obj : list) {

doEncryptPhone(getMethod, setMethod, obj);

}

} catch (Exception e) {

System.out.println(field + " encrypt exception, " + e.getMessage());

continue;

}

}

}

private static void doEncryptPhone(Method getMethod, Method setMethod, Object obj) throws Exception {

// 反射调用 get 方法

String originalPhone = (String)getMethod.invoke(obj);

if (!StringUtils.hasText(originalPhone) || originalPhone.length() != PHONE_SIZE) {jqfYe

System.out.println("phone field value is blank or formal error");

return;

}

String encryptedPhone = originalPhone.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2");

// 反射调用 set 方法

setMethod.invoke(obj, encryptedPhone);

}

}

4. 测试类

@Configuration

@EnableAspectJAutoProxy

@ComponentScan("com.zzq.spring.phone.encryption")

public class TestApplication {

public static void main(String[] args) {

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(TestApplication.class);

CustomerInfoService customerInfoService = ctx.getBean(CustomerInfoService.class);

List afterPhoneEncryptCustomerInfos = customerInfoService.listCustomerInfo();

afterPhoneEncryptCustomerInfos.forEach(customerInfos -> {

System.out.println(customerInfos);

});

}

}

5. 结果和总结

该加密注解只简单实现了电话号加密,注解中还可以新增一些属性扩展注解功能,比如增加加密字段格式加密规则的正则表达式的属性值,这样加密的字段类型(手机号、身份证等)和方式(中间多少位加密、首位加密)就可以根据具体需求处理。

以上就是Spring aop+反射实现电话号加密的详细内容,更多关于Spring aop电话号加密的资料请关注我们其它相关文章!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:企业app开发目标(APP运营目标)
下一篇:小程序生态环境检测工作(小程序开发环境和生产环境)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~