spring mvc rest 接口選擇性加密解密詳情
1.需求
spring mvc rest接口以前是采用https加密的,但是現(xiàn)在需要更加安全的加密。
而且不是對(duì)所有的接口進(jìn)行加密,是對(duì)部分接口進(jìn)行加密,接口返回值進(jìn)行解密。
2.分析
實(shí)現(xiàn)方式有兩種:
- 1.Aspect + Annotation
- 2.interceptor + requestParameter
第一種方式是最靈活的:自定義注解,然后在Aspect中對(duì)注解的方法進(jìn)行處理。
第二種方法也能實(shí)現(xiàn):自定義攔截器加請(qǐng)求參數(shù)與返回參數(shù),即參數(shù)中有一個(gè)參數(shù)控制是否加密解密。
第二種方式很明顯參數(shù)冗余,管理不變,使用麻煩。
第一種參數(shù)就很好了,擴(kuò)展容易,使用容易,提倡使用。
3.實(shí)現(xiàn)
3.1注解方式
3.1.1定義注解
package com.annotation;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
//使用在方法級(jí)別上
@Retention(RetentionPolicy.RUNTIME)
//運(yùn)行時(shí)有效
@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的自動(dòng)注解
//aop切面
public class EncryptionAspect {
/**
* 加密切點(diǎn)
*/
@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使用

不使用參數(shù),如果使用參數(shù)就在攔截器里判斷參數(shù),然后進(jìn)行相應(yīng)的處理。
4.加密
4.1對(duì)稱加密
對(duì)于無(wú)需加密的接口采用數(shù)字簽名加密,即https
對(duì)于需要加密的接口采用將MD5(session)作為密鑰的對(duì)稱加密
缺點(diǎn):需要服務(wù)器與客戶端有相同的session
4.2非對(duì)稱加密
對(duì)于無(wú)需加密的接口采用非對(duì)稱加密,即https+雙向認(rèn)證+自定義證書(shū)
對(duì)于需要加密的接口采用非對(duì)稱加密。
5.加密算法
5.1MD5算法
MD5 用的是 哈希函數(shù),它的典型應(yīng)用是對(duì)一段信息產(chǎn)生 信息摘要,以 防止被篡改。嚴(yán)格來(lái)說(shuō),MD5 不是一種 加密算法 而是 摘要算法。無(wú)論是多長(zhǎng)的輸入,MD5 都會(huì)輸出長(zhǎng)度為 128bits 的一個(gè)串 (通常用 16 進(jìn)制 表示為 32 個(gè)字符)。
5.2SHA1算法
SHA1 是和 MD5 一樣流行的 消息摘要算法,然而 SHA1 比 MD5 的 安全性更強(qiáng)。對(duì)于長(zhǎng)度小于 2 ^ 64 位的消息,SHA1 會(huì)產(chǎn)生一個(gè) 160 位的 消息摘要?;?MD5、SHA1 的信息摘要特性以及 不可逆 (一般而言),可以被應(yīng)用在檢查 文件完整性 以及 數(shù)字簽名 等場(chǎng)景。
5.3HMAC算法
HMAC 是密鑰相關(guān)的 哈希運(yùn)算消息認(rèn)證碼(Hash-based Message Authentication Code),HMAC 運(yùn)算利用 哈希算法 (MD5、SHA1 等),以 一個(gè)密鑰 和 一個(gè)消息 為輸入,生成一個(gè) 消息摘要 作為 輸出。
HMAC 發(fā)送方 和 接收方 都有的 key 進(jìn)行計(jì)算,而沒(méi)有這把 key 的第三方,則是 無(wú)法計(jì)算 出正確的 散列值的,這樣就可以 防止數(shù)據(jù)被篡改。
5.4AES/DES/3DES算法
AES、DES、3DES 都是 對(duì)稱 的 塊加密算法,加解密 的過(guò)程是 可逆的。常用的有 AES128、AES192、AES256 (默認(rèn)安裝的 JDK 尚不支持 AES256,需要安裝對(duì)應(yīng)的 jce 補(bǔ)丁進(jìn)行升級(jí) jce1.7,jce1.8)。
5.5DES算法
DES 加密算法是一種 分組密碼,以 64 位為 分組對(duì)數(shù)據(jù) 加密,它的 密鑰長(zhǎng)度 是 56 位,加密解密 用 同一算法。
DES 加密算法是對(duì) 密鑰 進(jìn)行保密,而 公開(kāi)算法,包括加密和解密算法。這樣,只有掌握了和發(fā)送方 相同密鑰 的人才能解讀由 DES加密算法加密的密文數(shù)據(jù)。因此,破譯 DES 加密算法實(shí)際上就是 搜索密鑰的編碼。對(duì)于 56 位長(zhǎng)度的 密鑰 來(lái)說(shuō),如果用 窮舉法 來(lái)進(jìn)行搜索的話,其運(yùn)算次數(shù)為 2 ^ 56 次。
5.63DES算法
是基于 DES 的 對(duì)稱算法,對(duì) 一塊數(shù)據(jù) 用 三個(gè)不同的密鑰 進(jìn)行 三次加密,強(qiáng)度更高。
5.7AES算法
AES 加密算法是密碼學(xué)中的 高級(jí)加密標(biāo)準(zhǔn),該加密算法采用 對(duì)稱分組密碼體制,密鑰長(zhǎng)度的最少支持為 128 位、 192 位、256 位,分組長(zhǎng)度 128 位,算法應(yīng)易于各種硬件和軟件實(shí)現(xiàn)。這種加密算法是美國(guó)聯(lián)邦政府采用的 區(qū)塊加密標(biāo)準(zhǔn)。
AES 本身就是為了取代 DES 的,AES 具有更好的 安全性、效率 和 靈活性。
5.8RSA算法
RSA 加密算法是目前最有影響力的 公鑰加密算法,并且被普遍認(rèn)為是目前 最優(yōu)秀的公鑰方案 之一。RSA 是第一個(gè)能同時(shí)用于 加密 和 數(shù)字簽名 的算法,它能夠 抵抗 到目前為止已知的 所有密碼攻擊,已被 ISO 推薦為公鑰數(shù)據(jù)加密標(biāo)準(zhǔn)。
RSA 加密算法 基于一個(gè)十分簡(jiǎn)單的數(shù)論事實(shí):將兩個(gè)大 素?cái)?shù) 相乘十分容易,但想要對(duì)其乘積進(jìn)行 因式分解 卻極其困難,因此可以將 乘積 公開(kāi)作為 加密密鑰。
5.9ECC算法
ECC 也是一種 非對(duì)稱加密算法,主要優(yōu)勢(shì)是在某些情況下,它比其他的方法使用 更小的密鑰,比如 RSA 加密算法,提供 相當(dāng)?shù)幕蚋叩燃?jí) 的安全級(jí)別。不過(guò)一個(gè)缺點(diǎn)是 加密和解密操作 的實(shí)現(xiàn)比其他機(jī)制 時(shí)間長(zhǎng) (相比 RSA 算法,該算法對(duì) CPU 消耗嚴(yán)重)。
6.加密算法比較
6.1散列算法
名稱 | 安全性 | 速度 |
SHA-1 | 高 | 慢 |
MD5 | 中 | 快 |
6.2對(duì)稱加密算法
名稱 | 密鑰長(zhǎng)度 | 運(yùn)行速度 | 安全性 | 資源消耗 |
DES | 56 | 較快 | 低 | 中 |
3DES | 112、168 | 慢 | 中 | 高 |
AES | 128、192、256 | 快 | 高 | 低 |
6.3非對(duì)稱加密算法比較
名稱 | 成熟度 | 安全性 | 運(yùn)算速度 | 資源消耗 |
RSA | 高 | 高 | 中 | 中 |
ECC | 高 | 高 | 慢 | 高 |
到此這篇關(guān)于spring mvc rest 接口選擇性加密解密詳情的文章就介紹到這了,更多相關(guān)spring mvc rest 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot使用knife4j進(jìn)行在線接口調(diào)試
這篇文章主要介紹了SpringBoot使用knife4j進(jìn)行在線接口調(diào)試,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
java:程序包javax.servlet.http不存在問(wèn)題解決
這篇文章主要給大家介紹了關(guān)于java:程序包javax.servlet.http不存在問(wèn)題解決的相關(guān)資料,如果引用的包依賴的庫(kù)文件缺失或版本不匹配,就會(huì)導(dǎo)致"Java 程序包不存在"的錯(cuò)誤,需要的朋友可以參考下2023-10-10
Spring Boot啟動(dòng)流程斷點(diǎn)過(guò)程解析
這篇文章主要介紹了Spring Boot啟動(dòng)流程斷點(diǎn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
springboot添加多數(shù)據(jù)源的方法實(shí)例教程
這篇文章主要給大家介紹了關(guān)于springboot添加多數(shù)據(jù)源方法的相關(guān)資料,在實(shí)際開(kāi)發(fā)中經(jīng)常可能遇到在一個(gè)應(yīng)用中可能要訪問(wèn)多個(gè)數(shù)據(jù)庫(kù)多的情況,需要的朋友可以參考下2023-09-09
Java導(dǎo)出Excel通用工具類實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于Java導(dǎo)出Excel通用工具類的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
Mac安裝多個(gè)JDK并實(shí)現(xiàn)動(dòng)態(tài)切換
有時(shí)候我們有多個(gè)項(xiàng)目需要使用多個(gè)版本JDK,本文主要介紹了Mac安裝多個(gè)JDK并實(shí)現(xiàn)動(dòng)態(tài)切換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07

