当前位置: 首页 > news >正文

哈尔滨大型网站建设电话企业展厅建设的原则

哈尔滨大型网站建设电话,企业展厅建设的原则,公司注册资金认缴和实缴区别,长沙市网站制作哪家专业一、前言 在实际项目开发中#xff0c;可能会涉及到一些敏感信息#xff0c;那么我们就需要对这些敏感信息进行加密处理#xff0c; 也就是脱敏#xff0c;比如像手机号、身份证号等信息。如果我们只是在接口返回后再去做替换处理#xff0c;则代码会显得非常冗余#xf…一、前言 在实际项目开发中可能会涉及到一些敏感信息那么我们就需要对这些敏感信息进行加密处理 也就是脱敏比如像手机号、身份证号等信息。如果我们只是在接口返回后再去做替换处理则代码会显得非常冗余那么实际可以通过注解的方式实现数据脱敏。 二、具体实现 1.定义一个标记于方法上的注解。 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.METHOD) //METHOD 说明该注解只能用在方法上 Retention(RetentionPolicy.RUNTIME) //RUNTIME 说明该注解在运行时生效 public interface DataEncryption {} 2.定义一个数据解密的注解。 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.METHOD) //METHOD 说明该注解只能用在方法上 Retention(RetentionPolicy.RUNTIME) //RUNTIME 说明该注解在运行时生效 public interface DataDecryption {}3.定义一个在字段上且有值的注解。 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.FIELD) //FIELD 说明该注解只能用在字段上 Retention(RetentionPolicy.RUNTIME) //RUNTIME 说明该注解在运行时生效 public interface EncryptField {//脱敏枚举值DesensitizationEnum value(); } 4.定义一个在字段上且有值的注解。 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.FIELD) //FIELD 说明该注解只能用在字段上 Retention(RetentionPolicy.RUNTIME) //RUNTIME 说明该注解在运行时生效 public interface DecryptField {//脱敏枚举值DesensitizedUtil.DesensitizedType value(); }5.定义用户返回的实体类。 import com.test.annotation.DecryptField; import com.test.enums.DesensitizationEnum; import com.test.utils.AesUtil;import java.lang.reflect.Field; import lombok.Data; // 用户信息返回实体类 Data public class UserResVo {DecryptField(DesensitizedUtil.DesensitizedType.CHINESE_NAME)EncryptFieldprivate String name;EncryptFieldEncryptField(DesensitizedUtil.DesensitizedType.ID_CARD)private String idCard;EncryptFieldEncryptField(DesensitizedUtil.DesensitizedType.MOBILE_PHONE)private String phone;EncryptFieldEncryptField(DesensitizedUtil.DesensitizedType.EMAIL)private String email; } 6.定义AOP注解实现 import cn.hutool.crypto.digest.DigestUtil; import com.google.gson.Gson; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.lang.reflect.Field; import java.util.Objects;Aspect Component Slf4j public class SecretAopAspect {Pointcut(annotation(com.secret.annotation.DataEncryption))public void encryptAopCut() {}Pointcut(annotation(com.secret.annotation.DataDecryption))public void decryptAopCut() {}/*** method encryptMethodAop* desc 加密方法* Param: joinPoint*/Around(encryptAopCut())public Object encryptMethodAop(ProceedingJoinPoint joinPoint) {Object responseObj null;try {responseObj joinPoint.proceed();this.handleEncrypt(responseObj);//md5加密在相应里面设置签名值String md5Data DigestUtil.md5Hex(new Gson().toJson(responseObj));HttpServletResponse response ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();response.setHeader(md5,md5Data);} catch (Throwable throwable) {throwable.printStackTrace();this.log.error(encryptMethodAop处理出现异常{}, throwable);}return responseObj;}/*** method decryptMethodAop* desc 解密方法* Param: joinPoint*/Around(decryptAopCut())public Object decryptMethodAop(ProceedingJoinPoint joinPoint) {Object responseObj null;try {responseObj joinPoint.getArgs()[0];//throw new RuntimeException(md5校验失败);this.handleDecrypt(responseObj);//生成md5签名String md5 DigestUtil.md5Hex(new Gson().toJson(responseObj));System.out.println(md5);//从请求头获取前端传过来的签名String origianlMd5 ;HttpServletRequest request ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();origianlMd5 request.getHeader(md5);//比对签名if(md5.equals(origianlMd5)){//方便调试不比对前端签名responseObj joinPoint.proceed();}else{throw new Exception(参数的md5校验不同可能存在篡改行为请检查);}} catch (Throwable throwable) {throwable.printStackTrace();log.error(decryptMethodAop处理出现异常{}, throwable);}return responseObj;}/*** method handleEncrypt* desc 对实体么个属性进行加密* Param: requestObj* return void*/private void handleEncrypt(Object requestObj) throws Exception {if (!Objects.isNull(requestObj)) {Field[] fields requestObj.getClass().getDeclaredFields();Field[] fieldsCopy fields;int fieldLength fields.length;for(int i 0; i fieldLength; i) {Field field fieldsCopy[i];boolean hasSecureField field.isAnnotationPresent(EncryptField.class);if (hasSecureField) {field.setAccessible(true);String plaintextValue (String)field.get(requestObj);String cipherText AesUtil.encrypt(plaintextValue);field.set(requestObj, cipherText);}}}}/*** method handleDecrypt* desc 对实体么个属性进行解密* Param: responseObj* return*/private Object handleDecrypt(Object responseObj) throws Exception {if (Objects.isNull(responseObj)) {return null;} else {Field[] fields responseObj.getClass().getDeclaredFields();Field[] fieldsCopy fields;int fieldLength fields.length;for(int i 0; i fieldLength; i) {Field field fieldsCopy[i];boolean hasSecureField field.isAnnotationPresent(DecryptField.class);if (hasSecureField) {DecryptField decryptField field.getAnnotation(DecryptField.class);field.setAccessible(true);String encryptValue (String)field.get(responseObj);encryptValue AesUtil.decrypt(encryptValue,decryptField.getValue());field.set(responseObj, encryptValue);}}return responseObj;}}}7.加解密工具类 import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.DesensitizedUtil; import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.symmetric.AES;public class AesUtil {// 默认16位 或 128 256位public static String AES_KEY EN#qerdfdshbd110;public static AES aes SecureUtil.aes(AES_KEY.getBytes());public static String encrypt(Object obj) {return aes.encryptHex((String) obj);}public static String decrypt(Object obj, DesensitizedUtil.DesensitizedType desensitizedType) {// 解密String decrypt decrypt(obj);// 脱敏return DesensitizedUtil.desensitized(decrypt, desensitizedType);}public static String decrypt(Object obj) {return aes.decryptStr((String) obj, CharsetUtil.CHARSET_UTF_8);} }8.接着就可以测试了。
http://www.dnsts.com.cn/news/127719.html

相关文章:

  • 网站数据库安装教程wordpress网站克隆
  • 福田做网站的微信小程序开发文档
  • 东丽网站建设公司网站怎么做跟踪链接
  • 网站后台访问权限设置推销什么企业做网站和app
  • 葫芦岛市网站建设做网站后期维护
  • 苏州外贸网站设计长沙招聘网站
  • 惠安 网站建设公司wordpress手工升级
  • 网站建设资料清单wordpress 统计2次
  • 网架公司十大排名网站优化案例分析
  • 高等学校处网站建设总结网站自定义链接怎么做的
  • 广东建设工程造价管理协会网站传媒公司手机网站模板
  • 高端html5网站设计工作室织梦模板 dedecms5.7如何优化好一个网站
  • 复古风格网站北京网站建设公司电话
  • 毕设做网站需要准备外贸 网站 建设 制作 成都
  • 厦门建设局网站技227司学校班级优化大师免费下载电脑版
  • 临安营销型网站建设网站外链建设的15个小技巧
  • 厦门网站建设找维品个体工商户备案网站备案
  • 柳州网站建设公司哪家好工程公司简介模板
  • 电商网站建设策划书企业网站开发一薇
  • 网站建设的基本流程有哪些专门做自助游的网站
  • 企业门户网站建设流程竟标网站源码
  • 为什么建设的网站有时候访问慢摄影设计说明怎么写
  • 展示型网站建设方案中国新闻社官网
  • wordpress建站需要写代码吗简述电子商务网站的建站流程
  • 网站建设的常见问题装潢设计师要学多久
  • 网站维护一年一般多少钱?网站建设html代码
  • 安全质量报监建设局网站网站建设与维护案列
  • 购买服务器做网站国外网站服务器地址
  • 厦门网站营销企业建设网站 意义何在
  • 电子商务网站建设的流程图大连开发区着火