老成昆 發表於 2026-1-9 08:45:26

使用SpringBoot+MyBatis实现数据库字段级加密

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>为什么需要字段级加密?</li><li>技术选型:为什么选择Spring Boot + MyBatis?</li><ul class="second_class_ul"><li>Spring Boot的优势</li><li>MyBatis的优势</li></ul><li>核心实现思路</li><ul class="second_class_ul"><li>1. 加密注解设计</li><li>2. 实体类标记</li><li>3. 加密工具类</li><li>4. MyBatis拦截器实现</li></ul><li>实际应用场景</li><ul class="second_class_ul"><li>1. 用户信息保护</li><li>2. 金融数据安全</li><li>3. 医疗数据保护</li><li>4. 企业数据安全</li></ul><li>安全性考虑</li><ul class="second_class_ul"></ul><li>总结</li><ul class="second_class_ul"></ul></ul></div><p class="maodian"></p><h2>为什么需要字段级加密?</h2>
<p>在当今数据驱动的时代,个人信息保护法、网络安全法等相关法规相继出台,对用户数据安全提出了更高要求。特别是金融、医疗、教育等行业,用户的身份信息、联系方式、财务数据等一旦泄露,后果不堪设想。</p>
<p>传统做法是直接将数据明文存储在数据库中,这种方式存在巨大安全隐患:</p>
<ol><li><strong>数据库泄露风险</strong>:一旦数据库被黑客攻破,所有数据一览无余</li><li><strong>内部人员风险</strong>:内部员工可以直接查看敏感数据</li><li><strong>备份泄露风险</strong>:数据库备份文件丢失也会导致数据泄露</li><li><strong>合规风险</strong>:不符合GDPR、个人信息保护法等法规要求</li></ol>
<p>字段级加密正是解决这些问题的有效手段。</p>
<p class="maodian"></p><h2>技术选型:为什么选择Spring Boot + MyBatis?</h2>
<p class="maodian"></p><h3>Spring Boot的优势</h3>
<ul><li><strong>快速开发</strong>:约定优于配置,极大提升开发效率</li><li><strong>生态完善</strong>:丰富的starter组件,开箱即用</li><li><strong>易于集成</strong>:与各类中间件无缝集成</li></ul>
<p class="maodian"></p><h3>MyBatis的优势</h3>
<ul><li><strong>SQL可控</strong>:可以精确控制每一条SQL语句</li><li><strong>灵活性强</strong>:支持复杂查询和动态SQL</li><li><strong>拦截机制</strong>:提供了强大的插件机制,便于扩展</li></ul>
<p class="maodian"></p><h2>核心实现思路</h2>
<p>我们的目标是实现一个透明的字段级加密系统,整体架构如下:</p>
<div class="jb51code"><pre class="brush:java;">业务层 -&gt; MyBatis拦截器 -&gt; 数据库
   &lt;- MyBatis拦截器 &lt;-
</pre></div>
<p class="maodian"></p><h3>1. 加密注解设计</h3>
<p>首先,我们需要定义一个注解来标记哪些字段需要加密:</p>
<div class="jb51code"><pre class="brush:java;">@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Encrypt {
}
</pre></div>
<p class="maodian"></p><h3>2. 实体类标记</h3>
<p>在实体类中使用注解标记需要加密的字段:</p>
<div class="jb51code"><pre class="brush:java;">@Data
public class User {
    private Long id;
    private String username;
   
    @Encrypt
    private String password;
   
    @Encrypt
    private String email;
   
    @Encrypt
    private String phone;
}
</pre></div>
<p class="maodian"></p><h3>3. 加密工具类</h3>
<p>实现AES加密算法的工具类:</p>
<div class="jb51code"><pre class="brush:java;">public class EncryptionUtil {
    private static final String ALGORITHM = "AES";
    private static final 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) {
            throw new 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));
            return new String(decryptedBytes, StandardCharsets.UTF_8);
      } catch (Exception e) {
            throw new RuntimeException("解密失败", e);
      }
    }
}
</pre></div>
<p class="maodian"></p><h3>4. MyBatis拦截器实现</h3>
<p>这是整个系统的核心部分,通过MyBatis拦截器实现自动加解密:</p>
<div class="jb51code"><pre class="brush:java;">// 加密拦截器
@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;
      Object parameter = args;
      
      // 获取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 {
            // 执行原始方法
            Object result = invocation.proceed();
            
            // 对查询结果进行解密处理
            if (result instanceof List) {
                List&lt;?&gt; list = (List&lt;?&gt;) result;
                for (Object item : list) {
                  decryptFields(item);
                }
            } else {
                decryptFields(result);
            }
            
            return result;
      }
    }
}
</pre></div>
<p class="maodian"></p><h2>实际应用场景</h2>
<p>这套字段级加密系统可以在多个场景中发挥作用:</p>
<p class="maodian"></p><h3>1. 用户信息保护</h3>
<p>在用户注册时,自动加密用户的密码、邮箱、手机号等敏感信息,即使数据库泄露也不会造成用户隐私泄露。</p>
<p class="maodian"></p><h3>2. 金融数据安全</h3>
<p>对用户的银行卡号、交易记录等金融数据进行加密存储,满足金融行业的合规要求。</p>
<p class="maodian"></p><h3>3. 医疗数据保护</h3>
<p>对患者的病历、诊断结果等医疗隐私数据进行加密,保护患者隐私。</p>
<p class="maodian"></p><h3>4. 企业数据安全</h3>
<p>对企业内部的商业机密、客户资料等重要数据进行加密保护。</p>
<p class="maodian"></p><h2>安全性考虑</h2>
<p>虽然字段级加密功能强大,但在生产环境中使用时必须注意安全性:</p>
<ol><li><strong>密钥管理</strong>:不要在代码中硬编码密钥,应使用专业的密钥管理系统</li><li><strong>算法选择</strong>:使用经过验证的加密算法,如AES-256</li><li><strong>性能优化</strong>:合理选择需要加密的字段,避免对所有字段都进行加密</li><li><strong>审计日志</strong>:记录所有加密解密操作,便于安全审计</li><li><strong>定期轮换</strong>:定期更换加密密钥,降低密钥泄露风险</li></ol>
<p class="maodian"></p><h2>总结</h2>
<p>通过Spring Boot + MyBatis实现数据库字段级加密,我们可以构建一个既安全又透明的数据保护系统。这套方案已经在众多企业级应用中得到验证,能够有效保护用户敏感数据安全,满足合规要求。</p>
<p>当然,任何技术都不是银弹,在享受便利的同时也要注意潜在的风险。希望今天的分享能给大家带来一些启发,让我们一起探索更多有趣的技术方案!</p>
<p>以上就是使用SpringBoot+MyBatis实现数据库字段级加密的详细内容,更多关于SpringBoot MyBatis数据库字段级加密的资料请关注琼殿技术社区其它相关文章!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>SpringBoot+MyBatis实现数据库字段级加密</li><li>SpringBoot结合MyBatis实现数据库字段加密</li><li>SpringBoot+MyBatis实现MD5加密数据库用户密码的方法</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: 使用SpringBoot+MyBatis实现数据库字段级加密