spring mvc rest 接口选择性加密解密详情

 更新时间:2022年07月26日 14:48:15   作者:qq5963a5404b339​​​​​​​  
这篇文章主要介绍了spring mvc rest 接口选择性加密解密详情,spring mvc rest接口以前是采用https加密的,但是现在需要更加安全的加密。而且不是对所有的接口进行加密,是对部分接口进行加密,接口返回值进行解密

1.需求

spring mvc rest接口以前是采用https加密的,但是现在需要更加安全的加密。
而且不是对所有的接口进行加密,是对部分接口进行加密,接口返回值进行解密。

2.分析

实现方式有两种:

  • 1.Aspect + Annotation
  • 2.interceptor + requestParameter

第一种方式是最灵活的:自定义注解,然后在Aspect中对注解的方法进行处理。

第二种方法也能实现:自定义拦截器加请求参数与返回参数,即参数中有一个参数控制是否加密解密。

第二种方式很明显参数冗余,管理不变,使用麻烦。
第一种参数就很好了,扩展容易,使用容易,提倡使用。

3.实现

3.1注解方式

3.1.1定义注解

package com.annotation;

import java.lang.annotation.*;

@Target(ElementType.METHOD)
//使用在方法级别上
@Retention(RetentionPolicy.RUNTIME)
//运行时有效
@Documented
//生成文档
public @interface Encryption {
}

3.1.2定义注解Aspect切面

package com.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
//Aspect注解
@Component
//spring bean的自动注解
//aop切面
public class EncryptionAspect {
/**
* 加密切点
*/
@Pointcut("@annotation(com.startimes.selfserviceApp.annotation.Encryption)")
public void encryptionPointcut(){
}

/**
* 前置通知--解密
* @param joinPoint
*/
@Before("encryptionPointcut()")
public void doBefore(JoinPoint joinPoint){
System.out.println("encryptionPointcut");
}

/**
* 后置通知--加密
* @param joinPoint
*/
@After("encryptionPointcut()")
public void doAfter(JoinPoint joinPoint){
System.out.println("encryptionPointcutAfter");
}
}

3.1.3使用

在方法前面加入注解:
@Encryption

3.2拦截器

3.2.1定义拦截器

package com.interceptor;

import org.springframework.ui.ModelMap;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.context.request.WebRequestInterceptor;
public class EncryptionInterceptor implements WebRequestInterceptor {
@Override
public void preHandle(WebRequest request) throws Exception {
//TODO:自定义代码
System.out.println("preHandle");
}
@Override
public void postHandle(WebRequest request, ModelMap model) throws Exception {
//TODO:自定义代码
System.out.println("postHandle");
}
@Override
public void afterCompletion(WebRequest request, Exception ex) throws Exception {
//TODO:自定义代码
System.out.println("afterCompletion");
}
}

3.2.2配置拦截器

3.2.3使用

不使用参数,如果使用参数就在拦截器里判断参数,然后进行相应的处理。

4.加密

4.1对称加密

对于无需加密的接口采用数字签名加密,即https
对于需要加密的接口采用将MD5(session)作为密钥的对称加密
缺点:需要服务器与客户端有相同的session

4.2非对称加密

对于无需加密的接口采用非对称加密,即https+双向认证+自定义证书
对于需要加密的接口采用非对称加密。

5.加密算法

5.1MD5算法

MD5 用的是 哈希函数,它的典型应用是对一段信息产生 信息摘要,以 防止被篡改。严格来说,MD5 不是一种 加密算法 而是 摘要算法。无论是多长的输入,MD5 都会输出长度为 128bits 的一个串 (通常用 16 进制 表示为 32 个字符)。

5.2SHA1算法

SHA1 是和 MD5 一样流行的 消息摘要算法,然而 SHA1 比 MD5 的 安全性更强。对于长度小于 2 ^ 64 位的消息,SHA1 会产生一个 160 位的 消息摘要。基于 MD5、SHA1 的信息摘要特性以及 不可逆 (一般而言),可以被应用在检查 文件完整性 以及 数字签名 等场景。

5.3HMAC算法

HMAC 是密钥相关的 哈希运算消息认证码(Hash-based Message Authentication Code),HMAC 运算利用 哈希算法 (MD5、SHA1 等),以 一个密钥 和 一个消息 为输入,生成一个 消息摘要 作为 输出。
HMAC 发送方 和 接收方 都有的 key 进行计算,而没有这把 key 的第三方,则是 无法计算 出正确的 散列值的,这样就可以 防止数据被篡改。

5.4AES/DES/3DES算法

AES、DES、3DES 都是 对称 的 块加密算法,加解密 的过程是 可逆的。常用的有 AES128、AES192、AES256 (默认安装的 JDK 尚不支持 AES256,需要安装对应的 jce 补丁进行升级 jce1.7,jce1.8)。

5.5DES算法

DES 加密算法是一种 分组密码,以 64 位为 分组对数据 加密,它的 密钥长度 是 56 位,加密解密 用 同一算法。
DES 加密算法是对 密钥 进行保密,而 公开算法,包括加密和解密算法。这样,只有掌握了和发送方 相同密钥 的人才能解读由 DES加密算法加密的密文数据。因此,破译 DES 加密算法实际上就是 搜索密钥的编码。对于 56 位长度的 密钥 来说,如果用 穷举法 来进行搜索的话,其运算次数为 2 ^ 56 次。

5.63DES算法

是基于 DES 的 对称算法,对 一块数据 用 三个不同的密钥 进行 三次加密,强度更高。

5.7AES算法

AES 加密算法是密码学中的 高级加密标准,该加密算法采用 对称分组密码体制,密钥长度的最少支持为 128 位、 192 位、256 位,分组长度 128 位,算法应易于各种硬件和软件实现。这种加密算法是美国联邦政府采用的 区块加密标准。
AES 本身就是为了取代 DES 的,AES 具有更好的 安全性、效率 和 灵活性。

5.8RSA算法

RSA 加密算法是目前最有影响力的 公钥加密算法,并且被普遍认为是目前 最优秀的公钥方案 之一。RSA 是第一个能同时用于 加密 和 数字签名 的算法,它能够 抵抗 到目前为止已知的 所有密码攻击,已被 ISO 推荐为公钥数据加密标准。
RSA 加密算法 基于一个十分简单的数论事实:将两个大 素数 相乘十分容易,但想要对其乘积进行 因式分解 却极其困难,因此可以将 乘积 公开作为 加密密钥。

5.9ECC算法

ECC 也是一种 非对称加密算法,主要优势是在某些情况下,它比其他的方法使用 更小的密钥,比如 RSA 加密算法,提供 相当的或更高等级 的安全级别。不过一个缺点是 加密和解密操作 的实现比其他机制 时间长 (相比 RSA 算法,该算法对 CPU 消耗严重)。

6.加密算法比较

6.1散列算法

名称

安全性

速度

SHA-1

MD5

6.2对称加密算法

名称

密钥长度

运行速度

安全性

资源消耗

DES

56

较快

3DES

112、168

AES

128、192、256

6.3非对称加密算法比较

名称

成熟度

安全性

运算速度

资源消耗

RSA

ECC

到此这篇关于spring mvc rest 接口选择性加密解密详情的文章就介绍到这了,更多相关spring mvc rest 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot使用knife4j进行在线接口调试

    SpringBoot使用knife4j进行在线接口调试

    这篇文章主要介绍了SpringBoot使用knife4j进行在线接口调试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • java:程序包javax.servlet.http不存在问题解决

    java:程序包javax.servlet.http不存在问题解决

    这篇文章主要给大家介绍了关于java:程序包javax.servlet.http不存在问题解决的相关资料,如果引用的包依赖的库文件缺失或版本不匹配,就会导致"Java 程序包不存在"的错误,需要的朋友可以参考下
    2023-10-10
  • Spring依赖注入和控制反转详情

    Spring依赖注入和控制反转详情

    这篇文章主要介绍了Spring依赖注入和控制反转详情,控制反转是面向对象编程中使用的术语,通过该术语,对象或对象集的控制权被赋予框架或由框架提供的容器。下文更多相关内容需要的小伙伴可以参考一下
    2022-05-05
  • Spring Boot启动流程断点过程解析

    Spring Boot启动流程断点过程解析

    这篇文章主要介绍了Spring Boot启动流程断点过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java排序算法之选择排序

    Java排序算法之选择排序

    这篇文章主要介绍了Java排序算法之选择排序,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-05-05
  • java实现系统托盘示例

    java实现系统托盘示例

    桌面的系统托盘即当程序最小化或者关闭按钮程序并没有退出,而是最小化在任务状态区域,下面是使用java实现系统托盘示例
    2014-03-03
  • springboot添加多数据源的方法实例教程

    springboot添加多数据源的方法实例教程

    这篇文章主要给大家介绍了关于springboot添加多数据源方法的相关资料,在实际开发中经常可能遇到在一个应用中可能要访问多个数据库多的情况,需要的朋友可以参考下
    2023-09-09
  • Java导出Excel通用工具类实例代码

    Java导出Excel通用工具类实例代码

    这篇文章主要给大家介绍了关于Java导出Excel通用工具类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • java在运行时能修改工作目录吗

    java在运行时能修改工作目录吗

    这篇文章主要给大家介绍了关于java在运行时能修改工作目录的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • Mac安装多个JDK并实现动态切换

    Mac安装多个JDK并实现动态切换

    有时候我们有多个项目需要使用多个版本JDK,本文主要介绍了Mac安装多个JDK并实现动态切换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07

最新评论