spring mvc rest 接口選擇性加密解密
- 1.需求
- 2.分析
- 3.實作
- 3.1注解方式
- 3.1.1定義注解
- 3.1.2定義注解Aspect切面
- 3.1.3使用
- 3.2攔截器
- 3.2.1定義攔截器
- 3.2.2配置攔截器
- 3.2.3使用
- 4.加密
- 4.1對稱加密
- 4.2非對稱加密
- 5.加密算法
- 5.1MD5算法
- 5.2SHA1算法
- 5.3HMAC算法
- 5.4AES/DES/3DES算法
- 5.5DES算法
- 5.63DES算法
- 5.7AES算法
- 5.8RSA算法
- 5.9ECC算法
- 6.加密算法比較
- 6.1雜湊演算法
- 6.2對稱加密算法
- 6.3非對稱加密算法比較
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
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yM4kzNxImN4gTNmFDOmhDZyYzXzIDN1QTMxIzLcdDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
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 | 高 | 高 |