Java 用AOP切面实现对实体么个属性加密解密

本文介绍了如何使用Java的AOP切面对实体属性进行加密和解密。首先,准备了SM2加密工具,并验证了其正确性。接着,创建了属性和方法的加密解密注解,并编写了相应的切面。切面处理了加密解密策略及数据签名的验证。最后,通过接口测试确保了功能的正常工作,并提供了项目源码地址。
摘要由CSDN通过智能技术生成

一、准备加密工具

我这里准备的是SM2加密方式,这里加密工具,根据自己的需要准备相应的加密工具即可,我的代码会在上传到git,可自行下载。

1.获取公钥私钥

在SM2Utils类里面有随机获取的方式

 /**
     * @method generateKeyPair
     * @desc 生成随机秘钥对
     * @version V1.0.0
     * @Param:
     * @author xukang
     * @date 2022/1/25 15:26
     * @return void
     */
    public static void generateKeyPair() {
        SM2 sm2 = SM2.Instance();
        AsymmetricCipherKeyPair key = sm2.ecc_key_pair_generator.generateKeyPair();
        ECPrivateKeyParameters ecpriv = (ECPrivateKeyParameters) key.getPrivate();
        ECPublicKeyParameters ecpub = (ECPublicKeyParameters) key.getPublic();
        BigInteger privateKey = ecpriv.getD();
        ECPoint publicKey = ecpub.getQ();

        System.out.println("公钥: " + Util.byteToHex(publicKey.getEncoded()));
        System.out.println("私钥: " + Util.byteToHex(privateKey.toByteArray()));
    }

main方法运行可获得

    public static void main(String[] args) throws Exception {
        //生成密钥对  
        generateKeyPair();
        
    }

 2.验证加密工具是否正确

在SM2Utils工具类里面分别有加密方式和解密方式,拿到刚刚生成的公钥和私钥,编写测试main方法,验证加密解密是否正确。

 public static void main(String[] args) throws Exception {
        //生成密钥对  
        generateKeyPair();

        String plainText = "abcA沙发上的范德萨的发生富商大贾的三的撒范德萨发送到是打发富士达爱是飞洒发送到大丰收大丰收的abc";
        byte[] sourceData = plainText.getBytes();

        //下面的秘钥可以使用generateKeyPair()生成的秘钥内容
        // 国密规范正式私钥
        String prik = "1565711FE3C1F48046B5B01060D12493F3F7631ABAF5CC3F09BB2890DF5317E7";
        // 国密规范正式公钥
        String pubk = "048BB63E6FD9622759AD7173F9EB670200500D02B1F11026FB27CF6F3007D60DE84060AF22C23DF8C9C8ED0C5EE76FBEFE4631C8A0C66ED0C3368867B1745339D6";

        System.out.println("加密: ");
        String cipherText = SM2Utils.encrypt(Util.hexToByte(pubk), sourceData);
        System.out.println(cipherText);
        System.out.println("解密: ");
        plainText = new String(SM2Utils.decrypt(Util.hexToByte(prik), Util.hexToByte(cipherText)));
        System.out.println(plainText);

    }

得到的结果如下:

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,针对您的问题,我可以给您一些简单的解释。 SpringBoot中的AOP(面向切面编程)可以帮助我们对方法进行拦截和增强,这样我们就可以在方法执行前后进行一些自己想要的操作,比如接口的请求数据解密和返回数据加密。 具体来说,我们可以通过定义一个切面类,在其中定义一个前置通知和一个后置通知。前置通知可以在方法执行前进行解密操作,后置通知可以在方法执行后进行加密操作。 下面是一个简单的示例代码: ```java @Aspect @Component public class EncryptAspect { @Autowired private EncryptService encryptService; @Pointcut("execution(public * com.example.controller.*.*(..))") public void encrypt() {} @Before("encrypt()") public void doEncrypt(JoinPoint joinPoint) { Object[] args = joinPoint.getArgs(); for (Object arg : args) { if (arg instanceof String) { String decrypted = encryptService.decrypt((String) arg); // 将解密后的数据重新设置到参数中 // ... } } } @AfterReturning(value = "encrypt()", returning = "result") public void doDecrypt(JoinPoint joinPoint, Object result) { if (result instanceof String) { String encrypted = encryptService.encrypt((String) result); // 将加密后的数据返回 // ... } } } ``` 在上面的示例代码中,我们定义了一个切面类`EncryptAspect`,其中通过`@Pointcut`注解定义了需要拦截的方法,即`com.example.controller`包下的所有方法。在`doEncrypt`方法中,我们可以获取到方法的参数,并进行解密操作;在`doDecrypt`方法中,我们可以获取到方法的返回值,并进行加密操作。 需要注意的是,上面的示例代码中的`EncryptService`是一个加解密服务的接口,具体的加解密实现可以根据自己的需求进行编写。 希望以上解释可以帮助到您。如果还有其他问题,欢迎随时提出。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老徐··

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值