前置环境准备
本方案可直接整合到现有Java栈开发的综合档案管理系统中,十分钟即可落地,需要提前安装以下环境,所有地址可直接下载:
- JDK 1.8及以上版本,Windows64位下载地址:
https://download.oracle.com/java/17/jdk-17_windows-x64_bin.exe
- Maven 3.6及以上版本,下载地址:
https://dlcdn.apache.org/maven/maven-3/3.9.4/binaries/apache-maven-3.9.4-bin.zip
- MySQL 5.7及以上版本,Windows64位下载地址:
https://cdn.mysql.com/Downloads/MySQL-8.0/mysql-8.0.34-winx64.zip
核心加密配置实现
1. 引入完整依赖
将以下依赖复制到项目的pom.xml文件中,无需修改版本可直接使用:
```
org.springframework.boot
spring-boot-starter-web
2.7.12
cn.hutool
hutool-crypto
5.8.22
mysql
mysql-connector-java
8.0.30
com.baomidou
mybatis-plus-boot-starter
3.5.3.1
org.projectlombok
lombok
1.18.30
```
2. 配置加密密钥与数据库
在项目的application.yml配置文件中,复制以下完整配置,修改数据库连接信息即可:
```
spring:
datasource:
url: jdbc:mysql://localhost:3306/archive_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
username: root
password: 你的数据库密码
archive:
crypto:
AES-256密钥必须为32位字符串,上线前必须修改
secret-key: "archive_custom_secret_key_32bitXXXX"
```
注意:密钥必须为32位字符串,生产环境不可使用默认值,密钥不能提交到代码仓库
3. 编写可复用加密工具类
新建com.archive.utils.ArchiveCryptoUtil类,复制以下完整代码:
```
package com.archive.utils;
import cn.hutool.crypto.symmetric.AES;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class ArchiveCryptoUtil {
private AES aes;
@Value("${archive.crypto.secret-key}")
public void initAes(String secretKey) {
this.aes = new AES(secretKey.getBytes());
}
public String encrypt(String plainText) {
if(plainText == null || plainText.isEmpty()) return plainText;
return aes.encryptBase64(plainText);
}
public String decrypt(String cipherText) {
if(cipherText == null || cipherText.isEmpty()) return cipherText;
return aes.decryptStr(cipherText);
}
}
```
业务层加密解密落地
1. 创建核心档案表
在你的档案数据库中执行以下建表SQL:
```
CREATE TABLE `core_archive` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '档案ID',
`archive_name` varchar(200) NOT NULL COMMENT '档案名称',
`archive_content` mediumtext NOT NULL COMMENT '加密档案内容',
`archive_no` varchar(50) NOT NULL COMMENT '档案编号',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='核心加密档案表';
```
2. 实体类与Mapper代码

新建实体类CoreArchive:
```
package com.archive.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
@Data
@TableName("core_archive")
public class CoreArchive {
@TableId(type = IdType.AUTO)
private Long id;
private String archiveName;
private String archiveContent;
private String archiveNo;
private Date createTime;
}
```
新建Mapper接口:
```
package com.archive.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.archive.entity.CoreArchive;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface CoreArchiveMapper extends BaseMapper
{
}
```
3. 新增自动加密、查询自动解密
新建业务类ArchiveService,复制以下代码:
```
package com.archive.service;
import com.archive.entity.CoreArchive;
import com.archive.mapper.CoreArchiveMapper;
import com.archive.utils.ArchiveCryptoUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class ArchiveService {
@Resource
private CoreArchiveMapper coreArchiveMapper;
@Resource
private ArchiveCryptoUtil archiveCryptoUtil;
public int addArchive(CoreArchive archive) {
// 核心内容自动加密入库
String plainContent = archive.getArchiveContent();
archive.setArchiveContent(archiveCryptoUtil.encrypt(plainContent));
return coreArchiveMapper.insert(archive);
}
public CoreArchive getArchiveById(Long id) {
CoreArchive archive = coreArchiveMapper.selectById(id);
if(archive == null) return null;
// 取出自动解密
String cipherContent = archive.getArchiveContent();
archive.setArchiveContent(archiveCryptoUtil.decrypt(cipherContent));
return archive;
}
}
```
效果验证与安全加固
1. 效果验证步骤
1. 启动项目,调用新增档案接口,传入明文档案内容
2. 直接登录数据库查看core_archive表,archive_content字段为乱码密文,说明加密生效
3. 调用查询接口,返回正确的明文内容,说明解密生效
2. 生产环境安全要点
- 密钥管理:生产环境通过环境变量注入密钥,不要写在配置文件中,Docker部署可通过
-e参数传入
- 大档案处理:单份档案超过10MB时,将文件存储到对象存储,仅加密文件元数据和访问密钥,避免数据库性能下降
- 权限控制:解密接口必须添加身份验证,仅允许拥有对应权限的用户查看明文档案
- 国密替换:如果需要合规要求的国密算法,仅需将工具类的AES替换为hutool的SM4实现即可,业务代码无需改动