这篇文章主要介绍了spring mvc rest接口选择性加密解密实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇spring mvc rest接口选择性加密解密实例分析文章都会有所收获,下面我们一起来看看吧。
spring mvc rest接口以前是采用https加密的,但是现在需要更加安全的加密。
而且不是对所有的接口进行加密,是对部分接口进行加密,接口返回值进行解密。
实现方式有两种:
1.Aspect + Annotation
2.interceptor + requestParameter
第一种方式是最灵活的:自定义注解,然后在Aspect中对注解的方法进行处理。
第二种方法也能实现:自定义拦截器加请求参数与返回参数,即参数中有一个参数控制是否加密解密。
第二种方式很明显参数冗余,管理不变,使用麻烦。
第一种参数就很好了,扩展容易,使用容易,提倡使用。
package com.annotation; import java.lang.annotation.*; @Target(ElementType.METHOD) //使用在方法级别上 @Retention(RetentionPolicy.RUNTIME) //运行时有效 @Documented //生成文档 public @interface Encryption { }
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"); } }
在方法前面加入注解:
@Encryption
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"); } }
不使用参数,如果使用参数就在拦截器里判断参数,然后进行相应的处理。
对于无需加密的接口采用数字签名加密,即https
对于需要加密的接口采用将MD5(session)作为密钥的对称加密
缺点:需要服务器与客户端有相同的session
对于无需加密的接口采用非对称加密,即https+双向认证+自定义证书
对于需要加密的接口采用非对称加密。
MD5 用的是 哈希函数,它的典型应用是对一段信息产生 信息摘要,以 防止被篡改。严格来说,MD5 不是一种 加密算法 而是 摘要算法。无论是多长的输入,MD5 都会输出长度为 128bits 的一个串 (通常用 16 进制 表示为 32 个字符)。
SHA1 是和 MD5 一样流行的 消息摘要算法,然而 SHA1 比 MD5 的 安全性更强。对于长度小于 2 ^ 64 位的消息,SHA1 会产生一个 160 位的 消息摘要。基于 MD5、SHA1 的信息摘要特性以及 不可逆 (一般而言),可以被应用在检查 文件完整性 以及 数字签名 等场景。
HMAC 是密钥相关的 哈希运算消息认证码(Hash-based Message Authentication Code),HMAC 运算利用 哈希算法 (MD5、SHA1 等),以 一个密钥 和 一个消息 为输入,生成一个 消息摘要 作为 输出。
HMAC 发送方 和 接收方 都有的 key 进行计算,而没有这把 key 的第三方,则是 无法计算 出正确的 散列值的,这样就可以 防止数据被篡改。
AES、DES、3DES 都是 对称 的 块加密算法,加解密 的过程是 可逆的。常用的有 AES128、AES192、AES256 (默认安装的 JDK 尚不支持 AES256,需要安装对应的 jce 补丁进行升级 jce1.7,jce1.8)。
DES 加密算法是一种 分组密码,以 64 位为 分组对数据 加密,它的 密钥长度 是 56 位,加密解密 用 同一算法。
DES 加密算法是对 密钥 进行保密,而 公开算法,包括加密和解密算法。这样,只有掌握了和发送方 相同密钥 的人才能解读由 DES加密算法加密的密文数据。因此,破译 DES 加密算法实际上就是 搜索密钥的编码。对于 56 位长度的 密钥 来说,如果用 穷举法 来进行搜索的话,其运算次数为 2 ^ 56 次。
是基于 DES 的 对称算法,对 一块数据 用 三个不同的密钥 进行 三次加密,强度更高。
AES 加密算法是密码学中的 高级加密标准,该加密算法采用 对称分组密码体制,密钥长度的最少支持为 128 位、 192 位、256 位,分组长度 128 位,算法应易于各种硬件和软件实现。这种加密算法是美国联邦政府采用的 区块加密标准。
AES 本身就是为了取代 DES 的,AES 具有更好的 安全性、效率 和 灵活性。
RSA 加密算法是目前最有影响力的 公钥加密算法,并且被普遍认为是目前 最优秀的公钥方案 之一。RSA 是第一个能同时用于 加密 和 数字签名 的算法,它能够 抵抗 到目前为止已知的 所有密码攻击,已被 ISO 推荐为公钥数据加密标准。
RSA 加密算法 基于一个十分简单的数论事实:将两个大 素数 相乘十分容易,但想要对其乘积进行 因式分解 却极其困难,因此可以将 乘积 公开作为 加密密钥。
ECC 也是一种 非对称加密算法,主要优势是在某些情况下,它比其他的方法使用 更小的密钥,比如 RSA 加密算法,提供 相当的或更高等级 的安全级别。不过一个缺点是 加密和解密操作 的实现比其他机制 时间长 (相比 RSA 算法,该算法对 CPU 消耗严重)。
名称 | 安全性 | 速度 |
SHA-1 | 高 | 慢 |
MD5 | 中 | 快 |
名称 | 密钥长度 | 运行速度 | 安全性 | 资源消耗 |
DES | 56 | 较快 | 低 | 中 |
3DES | 112、168 | 慢 | 中 | 高 |
AES | 128、192、256 | 快 | 高 | 低 |
名称 | 成熟度 | 安全性 | 运算速度 | 资源消耗 |
RSA | 高 | 高 | 中 | 中 |
ECC | 高 | 高 | 慢 | 高 |
关于“spring mvc rest接口选择性加密解密实例分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“spring mvc rest接口选择性加密解密实例分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。