最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot+MyBatis實現(xiàn)數(shù)據(jù)庫字段加密全過程

 更新時間:2026年03月02日 09:33:42   作者:CircleMouse  
該文章介紹了如何使用SpringBoot和MyBatis實現(xiàn)數(shù)據(jù)庫字段加密,通過自定義加密注解、加密工具類和系統(tǒng)攔截器,可以在業(yè)務(wù)層對需要加密的字段進行自動加密和解密,文章還提供了各個行業(yè)對敏感數(shù)據(jù)進行加密保護的示例,以及需要注意的事項

分享一篇基于SpringBoot+MyBatis來實現(xiàn)數(shù)據(jù)庫字段加密的操作,喜歡的朋友可以借鑒

大致的實現(xiàn)流程

業(yè)務(wù)層-->系統(tǒng)攔截器-->數(shù)據(jù)庫-->系統(tǒng)攔截器-->返回結(jié)果

加密注解設(shè)計

把需要加密的字段通過我們自定義的加密注解進行標識,所以我們需要先自定義一段加密注解的代碼

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Encrypt {
}

實體類

在實體類上使用注解標記需要加密字段

@Data
public class User {
    private Long id;
    private String username;
    
    @Encrypt
    private String password;
    
    @Encrypt
    private String email;
    
    @Encrypt
    private String phone;
}

加密工具類

基于AES加密算法實現(xiàn)對字段名的加密,大家可以選擇其他的加密算法

public class EncryptionUtil {
    privatestaticfinal String ALGORITHM = "AES";
    privatestaticfinal String TRANSFORMATION = "AES/ECB/PKCS5Padding";
    
    // AES加密
    public static String encrypt(String plainText, String key) {
        try {
            SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), ALGORITHM);
            Cipher cipher = Cipher.getInstance(TRANSFORMATION);
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
            return Base64.getEncoder().encodeToString(encryptedBytes);
        } catch (Exception e) {
            thrownew RuntimeException("加密失敗", e);
        }
    }
    
    // AES解密
    public static String decrypt(String cipherText, String key) {
        try {
            SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), ALGORITHM);
            Cipher cipher = Cipher.getInstance(TRANSFORMATION);
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(cipherText));
            returnnew String(decryptedBytes, StandardCharsets.UTF_8);
        } catch (Exception e) {
            thrownew RuntimeException("解密失敗", e);
        }
    }
}

系統(tǒng)攔截器設(shè)計

通過攔截實現(xiàn)自動加密和自動解密

// 加密攔截器
@Intercepts({
    @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
})
@Component
public class FieldEncryptionInterceptor implements Interceptor {
    
    @Value("${encryption.key:mySecretKey12345}")
    private String encryptionKey;
    
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Object[] args = invocation.getArgs();
        MappedStatement mappedStatement = (MappedStatement) args[0];
        Object parameter = args[1];
        
        // 獲取SQL命令類型
        String sqlCommandType = mappedStatement.getSqlCommandType().toString();
        
        // 對INSERT和UPDATE操作進行加密處理
        if ("INSERT".equals(sqlCommandType) || "UPDATE".equals(sqlCommandType)) {
            encryptFields(parameter);
        }
        
        return invocation.proceed();
    }
    
    // 解密攔截器
    @Intercepts({
        @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})
    })
    @Component
    public class FieldDecryptionInterceptor implements Interceptor {
        
        @Value("${encryption.key:mySecretKey12345}")
        private String encryptionKey;
        
        @Override
        public Object intercept(Invocation invocation) throws Throwable {
            // 執(zhí)行原始方法
            Object result = invocation.proceed();
            
            // 對查詢結(jié)果進行解密處理
            if (result instanceof List) {
                List<?> list = (List<?>) result;
                for (Object item : list) {
                    decryptFields(item);
                }
            } else {
                decryptFields(result);
            }
            
            return result;
        }
    }
}

測試場景

  • 用戶信息保護:在用戶注冊時,自動加密用戶的密碼、郵箱、手機號等敏感信息,即使數(shù)據(jù)庫泄露也不會造成用戶隱私泄露
  • 金融數(shù)據(jù)保護:對用戶的銀行卡號、交易記錄等金融數(shù)據(jù)進行加密存儲,滿足金融行業(yè)的合規(guī)要求
  • 醫(yī)療醫(yī)保數(shù)據(jù)保護:對患者的病歷、診斷結(jié)果等醫(yī)療隱私數(shù)據(jù)進行加密,保護患者隱私
  • 企業(yè)數(shù)據(jù)保護:對企業(yè)內(nèi)部的商業(yè)機密、客戶資料等重要數(shù)據(jù)進行加密保護

注意事項

雖然字段級加密功能強大,但在生產(chǎn)環(huán)境中使用時必須注意安全性:

  • 密鑰管理:不要在代碼中硬編碼密鑰,應(yīng)使用專業(yè)的密鑰管理系統(tǒng)
  • 算法選擇:使用經(jīng)過驗證的加密算法,如AES-256
  • 性能優(yōu)化:合理選擇需要加密的字段,避免對所有字段都進行加密
  • 審計日志:記錄所有加密解密操作,便于安全審計
  • 定期輪換:定期更換加密密鑰,降低密鑰泄露風(fēng)險

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中類與對象的相關(guān)知識點總結(jié)

    Java中類與對象的相關(guān)知識點總結(jié)

    對象是類實例化出來的,對象中含有類的屬性,類是對象的抽象,下面這篇文章主要給大家介紹了關(guān)于Java中類與對象的一些相關(guān)知識點,需要的朋友可以參考下
    2021-11-11
  • SpringMVC實現(xiàn)返回響應(yīng)的項目實踐

    SpringMVC實現(xiàn)返回響應(yīng)的項目實踐

    本文主要介紹了SpringMVC實現(xiàn)返回響應(yīng)的項目實踐,包含返回靜態(tài)頁面,返回數(shù)據(jù),返回html片段等實例,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • Java發(fā)送帶html標簽內(nèi)容的郵件實例代碼

    Java發(fā)送帶html標簽內(nèi)容的郵件實例代碼

    下面小編就為大家?guī)硪黄狫ava發(fā)送帶html標簽內(nèi)容的郵件實例代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • Mybatis動態(tài)SQL標簽的使用

    Mybatis動態(tài)SQL標簽的使用

    本文主要介紹了Mybatis動態(tài)SQL標簽的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Java關(guān)鍵字之this用法詳解

    Java關(guān)鍵字之this用法詳解

    這篇文章將為大家詳細介紹一下Java關(guān)鍵字this的用法,文中有相關(guān)的代碼示例,希望對大家的學(xué)習(xí)或工作有一定的幫助,感興趣的同學(xué)可以參考下
    2023-05-05
  • 解決java -jar XXX.jar沒有主清單屬性以及找不到或無法加載主類的問題

    解決java -jar XXX.jar沒有主清單屬性以及找不到或無法加載主類的問題

    在使用Idea打包SpringBoot項目時,可能會遇到“沒有主清單屬性”的錯誤,問題原因是pom文件中缺少配置,未能正確打包成可執(zhí)行的jar,解決方法包括:1. 修改項目結(jié)構(gòu)并重新生成jar;2. 使用Maven插件在pom文件中添加spring-boot-maven-plugin配置
    2024-09-09
  • Java對象轉(zhuǎn)換的實現(xiàn)方式匯總

    Java對象轉(zhuǎn)換的實現(xiàn)方式匯總

    這篇文章主要介紹了Java對象轉(zhuǎn)換的多種實現(xiàn)方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-04-04
  • Java mail 發(fā)送郵件的具體實例

    Java mail 發(fā)送郵件的具體實例

    這篇文章主要介紹了Java mail 發(fā)送郵件的具體實例,需要的朋友可以參考下
    2014-02-02
  • Java卡片布局管理器解釋及實例

    Java卡片布局管理器解釋及實例

    這篇文章主要介紹了Java卡片布局管理器解釋及實例,需要的朋友可以參考下。
    2017-09-09
  • Spring Boot兩種配置文件properties和yml區(qū)別

    Spring Boot兩種配置文件properties和yml區(qū)別

    這篇文章主要為大家介紹了java面試中常見問到的Spring Boot兩種配置文件properties和yml區(qū)別解答,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07

最新評論

清丰县| 建瓯市| 达拉特旗| 阳江市| 彭山县| 永福县| 图们市| 万源市| 山丹县| 盐城市| 九龙坡区| 克山县| 延川县| 临颍县| 上饶市| 东宁县| 竹溪县| 剑阁县| 花莲市| 五河县| 信宜市| 昌都县| 内丘县| 土默特左旗| 石狮市| 平舆县| 海口市| 宁乡县| 东兰县| 大足县| 呼伦贝尔市| 城步| 永和县| 宝坻区| 柳河县| 天津市| 永昌县| 万宁市| 积石山| 察哈| 溆浦县|