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

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

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

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

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

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

加密注解設(shè)計(jì)

把需要加密的字段通過我們自定義的加密注解進(jìn)行標(biāo)識(shí),所以我們需要先自定義一段加密注解的代碼

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

實(shí)體類

在實(shí)體類上使用注解標(biāo)記需要加密字段

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

加密工具類

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

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è)計(jì)

通過攔截實(shí)現(xiàn)自動(dòng)加密和自動(dòng)解密

// 加密攔截器
@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();
        
        // 對(duì)INSERT和UPDATE操作進(jìn)行加密處理
        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();
            
            // 對(duì)查詢結(jié)果進(jìn)行解密處理
            if (result instanceof List) {
                List<?> list = (List<?>) result;
                for (Object item : list) {
                    decryptFields(item);
                }
            } else {
                decryptFields(result);
            }
            
            return result;
        }
    }
}

測(cè)試場(chǎng)景

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

注意事項(xiàng)

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

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

總結(jié)

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

相關(guān)文章

最新評(píng)論

乐安县| 长岛县| 阜阳市| 和硕县| 库车县| 休宁县| 阳泉市| 武宣县| 上高县| 二连浩特市| 汽车| 行唐县| 思茅市| 根河市| 龙胜| 扬中市| 桂阳县| 璧山县| 高尔夫| 台东县| 宁波市| 黄骅市| 唐海县| 广西| 永修县| 济源市| 浦北县| 莲花县| 东明县| 焦作市| 莱州市| 前郭尔| 凤山市| 富顺县| 怀仁县| 小金县| 文水县| 临朐县| 且末县| 翼城县| 衡阳市|