Spring aop+反射實現(xiàn)電話號加密
加密算法
為什么需要加密呢?就好比戰(zhàn)爭時期特工在進行傳輸情報的時候,如果將情報明文直接通過某種媒介傳輸給同盟人員,那么一旦情報被地方截取,就會釀成大禍。如果將明文通過某種加密算法加密成雜亂無章的密文,即使被敵方截獲,沒有對應的解密算法,也很難識別出其中的明文。安全傳輸領域,加密算法是一種很常用的手段,它可以保證數(shù)據(jù)不被竊取和泄漏,還可以保證數(shù)據(jù)的完整性,不被篡改。
常見的加密算法有對稱加密,非對稱加密,單向加密(簽名)等分類。其中對稱加密算法,加密密鑰和解密密鑰是同一個,因此發(fā)送發(fā)和接收方都需要維護一個相同的密鑰,如果密鑰要修改,雙方都需要同時修改。非對稱加密算法中,發(fā)送發(fā)用公鑰進行加密,接收方用私鑰進行解密。單向加密算法是對傳輸?shù)臄?shù)據(jù)生成一個簽名,通過這個簽名來驗證數(shù)據(jù)在傳輸過程中是否被篡改過,一般是不可逆的。
AES
- AES 加密算法是一種對稱加密算,加密密鑰和解密密鑰是同一個。它采用對稱分組密碼體制,最少支持長度為128位的加密。涉及到分組加密,padding填充,初始向量IV,密鑰,四種加密模式。
- 分組加密就是將原文分割成一段段的分別進行加密,每段分組長度為128位16個字節(jié),如果最后一組長度不足128位,則采用padding填充模式將其補齊到128位。然后對每組進行加密,最后組成最終密文。
- padding填充是為了解決分組后的長度不足128位的場景。填充模式也有多種不同模式,比如PKCS5, PKCS7和NOPADDING。其中PKSC5是指分組后缺少幾個字節(jié),就在后面填充幾個字節(jié)的幾,比如缺少2個字節(jié),就在后面填充2個字節(jié)的2。PKCS7是指缺少幾個字節(jié),就在后面填充幾個字節(jié)的0,比如缺少5個字節(jié),就填充5個字節(jié)的0。NOPADDING模式就是不需要填充。如果最后面剛好是16個字節(jié)的16,那么解密方不知道是填充數(shù)據(jù)還是真實數(shù)據(jù),因此會在后面再補16個字節(jié)的16來區(qū)分。
- 初始向量IV是為了保證數(shù)據(jù)的安全性,如果我們對同一段內容進行加密后,所生成的密文應該是相同的,那么這樣就很容易通過密文分析出哪些段是相同的。比如原文分組后成為ABCADE,加密后的密文是GHIGJK,那么很容易看出那兩段內容是相同的。第一個分組在初始加密向量的基礎上進行加密,以后的每一個分組都在前一個分組加密的結果為基礎進行加密,從而保證了即使相同的原文段,也不會生成相同的密文段。
- 密鑰是加密和解密公用的一個,它一般是128位16個字節(jié)長度的隨機字符串,分組后的原文都用同一個密鑰進行加密。
- 加密模式包含ECB,CBC, CFB, OFB等四種模式。ECB分別對每個分組進行加密,相同的明文會被加密成相同的密文。CBC模式會使用上一段的加密結果作為加密向量,相同的原文不會被加密成相同的密文。
MD5
MD5算法是一種不可逆的簽名算法,對相同的輸入通過MD5散列函數(shù)處理后,會輸出相同的信息。因此MD5可以驗證傳輸?shù)臄?shù)據(jù)是否有被篡改,但是如果竊密者對明文進行了修改后,再使用MD5算法進行散列,接收方將無法判斷明文已經(jīng)被修改了。一般數(shù)據(jù)庫存儲用戶密碼會將密碼使用MD5進行處理。
HMAC-MD5
HMAC-MD5由一個H函數(shù)和一個密鑰組成,一般我們采用的散列函數(shù)為Md5或者SHA-1。HMAC-MD5算法就是采用密鑰加密+Md5信息摘要的方式形成新的密文。
AOP
眾所周知,AOP(面向切面編程)是Spring一個重要特性,它將核心關注點和業(yè)務邏輯進行解耦,將業(yè)務無關的邏輯提取出來作為公共模塊進行處理。它有切點,切面,連接點,通知的概念。切點就是我們可以織入切面的點,切面就是我們要織入的橫切邏輯,通知包含前置通知,后置通知,返回通知,異常通知,環(huán)繞通知等。
1. 引入依賴
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.5</version> </dependency>
2. 業(yè)主信息類、業(yè)主信息服務類
@Data @AllArgsConstructor public class CustomerInfo { private String name; private String phoneNum; } @Service public class CustomerInfoService { @PhoneEncryptionForList(fields = "phoneNum", clazz = CustomerInfo.class) public List<CustomerInfo> listCustomerInfo() { return Arrays.asList( new CustomerInfo("小王", "15112368569"), new CustomerInfo("小李", "13652298565"), new CustomerInfo("小武", "18965653698"), new CustomerInfo("小天", "13192558569") ); } }
3. 電話號加密注解,電話號加密切面類
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface PhoneEncryptionForList { /** * 加密字段 * * @return */ String[] fields(); /** * 加密對象類型 * * @return */ Class<?> clazz(); } @Aspect @Component public class PhoneEncryptionForListAspect { private static final int PHONE_SIZE = 11; @AfterReturning(value = "@annotation(com.zzq.spring.phone.encryption.PhoneEncryptionForList)", returning = "result") public void doEncrypt(JoinPoint joinPoint, Object result) { if (result == null || !(result instanceof List)) { System.out.println("result class type is not list, annotation is invalid"); return; } List list = (List) result; if (CollectionUtils.isEmpty(list)) { return; } // 獲取注解的屬性值 Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); PhoneEncryptionForList annotation = method.getAnnotation(PhoneEncryptionForList.class); String[] fields = annotation.fields(); Class<?> clazz = annotation.clazz(); for (String field : fields) { try { // 反射獲取實體類加密字段相應的 set 和 get 方法 char[] chars = field.toCharArray(); chars[0] = (char) (chars[0] - 32); String setMethodName = "set" + new String(chars); String getMethodName = "get" + new String(chars); Method getMethod = clazz.getDeclaredMethod(getMethodName); Method setMethod = clazz.getDeclaredMethod(setMethodName, String.class); for (Object obj : list) { doEncryptPhone(getMethod, setMethod, obj); } } catch (Exception e) { System.out.println(field + " encrypt exception, " + e.getMessage()); continue; } } } private static void doEncryptPhone(Method getMethod, Method setMethod, Object obj) throws Exception { // 反射調用 get 方法 String originalPhone = (String)getMethod.invoke(obj); if (!StringUtils.hasText(originalPhone) || originalPhone.length() != PHONE_SIZE) { System.out.println("phone field value is blank or formal error"); return; } String encryptedPhone = originalPhone.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2"); // 反射調用 set 方法 setMethod.invoke(obj, encryptedPhone); } }
4. 測試類
@Configuration @EnableAspectJAutoProxy @ComponentScan("com.zzq.spring.phone.encryption") public class TestApplication { public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(TestApplication.class); CustomerInfoService customerInfoService = ctx.getBean(CustomerInfoService.class); List<CustomerInfo> afterPhoneEncryptCustomerInfos = customerInfoService.listCustomerInfo(); afterPhoneEncryptCustomerInfos.forEach(customerInfos -> { System.out.println(customerInfos); }); } }
5. 結果和總結
該加密注解只簡單實現(xiàn)了電話號加密,注解中還可以新增一些屬性擴展注解功能,比如增加加密字段格式加密規(guī)則的正則表達式的屬性值,這樣加密的字段類型(手機號、身份證等)和方式(中間多少位加密、首位加密)就可以根據(jù)具體需求處理。
以上就是Spring aop+反射實現(xiàn)電話號加密的詳細內容,更多關于Spring aop電話號加密的資料請關注腳本之家其它相關文章!
相關文章
SpringBoot對數(shù)據(jù)訪問層進行單元測試的方法詳解
我們公司作為一個面向銀行、金融機構的TO B類企業(yè),頻繁遇到各個甲方爸爸提出的國產(chǎn)化數(shù)據(jù)庫的改造需求,包括OceanBase, TiDB,geldenDB等等,本文就介紹一種快高效、可復用的解決方案——對數(shù)據(jù)訪問層做單元測試,需要的朋友可以參考下2023-08-08java實現(xiàn)頁面多查詢條件必選的統(tǒng)一處理思路
這篇文章主要為大家介紹了java實現(xiàn)頁面多查詢條件必選的統(tǒng)一處理思路詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06Java實現(xiàn)將png格式圖片轉換成jpg格式圖片的方法【測試可用】
這篇文章主要介紹了Java實現(xiàn)將png格式圖片轉換成jpg格式圖片的方法,涉及java文件讀寫及圖形創(chuàng)建等相關操作技巧,需要的朋友可以參考下2018-03-03Spring MVC數(shù)據(jù)綁定概述及原理詳解
這篇文章主要介紹了Spring MVC數(shù)據(jù)綁定概述及原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-06-06Java數(shù)據(jù)結構之AC自動機算法的實現(xiàn)
AC自動機算法常被認為是Trie樹+KMP算法的結合體,它是一個多模式匹配算法,在模式匹配領域被廣泛應用。本文將詳細為大家介紹AC自動機的原理與實現(xiàn)方法,感興趣的可以了解一下2022-12-12