1. 信创背景与政策要求
1.1 信创战略意义
信息技术应用创新是国家战略,旨在构建自主可控的信息技术体系,保障国家网络安全和数据安全。2026年是"十五五"开局之年,也是国央企在 2027年完成信创全面替代(依据"79号文")的冲刺之年。
1.2 政策关键节点
- 2026年1月 :中国信息安全测评中心发布 《安全可靠测评结果公告(2026年第1号)》,明确信创产品准入目录,有效期三年。
- 目录落地 :信创从"替代备胎"转向 "自主引领、智能融合、全行业渗透" 的高质量发展阶段。
- 市场渗透:从党政、金融、电信("2+8")向能源、交通、教育等全行业扩展。
1.3 信创认证体系
| 认证类型 | 发证机构 | 核心作用 |
|---|---|---|
| 安全可靠测评 | 中国信息安全测评中心 | 产品进入党政、关基领域采购的 准入门槛,有效期三年 |
| 适配认证 | 省级信创适配中心、第三方机构 | 验证产品在信创环境下的兼容性与稳定性 |
| 评估认证 | 国家级/省级测评机构 | 验证产品的安全合规性、源代码自主性、供应链可控性 |
2026年新规 :认证体系从 "目录管理"转向"能力认证",动态评估:
- 生态兼容性(30%)
- 性能达标度(25%)
- 供应链安全(25%)
- 社区活跃度(20%)
2. 信创四个方面具体要求
2.1 基础硬件要求
| 类别 | 核心产品/厂商 | 关键要求 |
|---|---|---|
| CPU | 飞腾、龙芯、申威、鲲鹏、海光等 | 需通过安全可靠测评(Ⅰ级),覆盖通用计算、专用算力 |
| GPU | 华为、寒武纪、摩尔线程等 | 重点突破AI算力瓶颈,性能损耗控制在15-20%以内 |
| PC/整机 | 联想开天、华为擎云等 | 国产化率需达100% |
| 服务器/存储 | 浪潮、中兴、华为等 | 存储设备国产化率仍不足20%,需重点突破 |
采购提示 :政府采购对Ⅰ级产品给予 20%价格评审优惠,优先选用目录内产品。
2.2 基础软件要求
| 类别 | 核心产品/厂商 | 关键要求 |
|---|---|---|
| 操作系统 | 麒麟、统信、华为鸿蒙(HarmonyOS)等 | 政务办公优先选Ⅰ级产品 |
| 数据库 | 达梦、人大金仓、南大通用、阿里云等 | 需支持高并发场景、向量数据存储 |
| 中间件 | 东方通、宝兰德等 | 保证与上下层组件的兼容性和稳定性 |
| 虚拟化 | 深信服、云轴科技、H3C等 | 实现信创环境下的资源池化与弹性调度 |
2.3 应用软件要求
| 类别 | 核心产品/厂商 | 关键要求 |
|---|---|---|
| ERP/OA | 用友、金蝶、致远互联等 | 在信创环境下实现业务流程全闭环 |
| 工业软件 | 中望软件等 | 攻克高端内核难题,国产化率在部分领域仍低于5% |
| 协同办公 | 金山办公等 | 支持移动端与PC端协同,兼容国产浏览器 |
| 大模型应用 | DeepSeek、Qwen、火山引擎等 | AI与信创深度融合,首次作为独立大类列入生态图谱 |
2.4 信息安全要求
- 全流程防护:覆盖硬件、软件、平台、应用的全流程防护网
- 核心领域:网络安全、数据安全、终端安全、供应链安全
- 具体措施 :
- 支持 国密算法(SM2、SM3、SM4)
- 符合 网络安全等级保护(等保2.0)
- 建立 三员分离 权限管控、全维度日志审计
- 开展 供应链安全审查,排查境外组件与后门风险
3. SpringBoot组件信创选型建议
3.1 中间件选型
| 组件类型 | 推荐信创方案 | Spring Boot适配方式 | 适配难度 |
|---|---|---|---|
| 缓存 | 华为 GaussDB(for Redis) | spring-boot-starter-data-redis,改连接地址 |
低 |
| 消息队列 | Apache RocketMQ | rocketmq-spring-boot-starter 或 Spring Cloud Stream |
低-中 |
| 对象存储 | 华为 OceanStor OBS | 使用 S3 SDK,替换 endpoint 和认证信息 | 中 |
| Web容器 | 东方通 TongWeb(外置) | Spring Boot 打包为 WAR,部署到外置容器 | 极低 |
| 搜索引擎 | 拓尔思 TRS 搜索 | 适配 RESTful API,可能需要自定义 Spring Data 实现 | 中-高 |
3.2 数据库选型
| 数据库类型 | 推荐信创方案 | 兼容模式 | Spring Boot适配 |
|---|---|---|---|
| 关系型 (MySQL兼容) | 达梦 DM8 | MySQL 兼容模式 | JPA + DM JDBC 驱动,方言: DmDialect |
| 关系型 (PostgreSQL兼容) | 人大金仓 KingbaseES | PostgreSQL 兼容模式 | JPA + Kingbase JDBC 驱动,方言: KingbaseESDialect |
| 分布式数据库 | 华为 GaussDB | 兼容 PostgreSQL | JPA + PostgreSQL 驱动,方言: PostgreSQLDialect |
迁移建议:
- 先在兼容模式下测试 SQL 兼容性
- 逐步替换驱动和方言配置
- 针对特定数据库函数进行适配
3.3 打包发布方案
| 方案类型 | 推荐技术栈 | 适用场景 |
|---|---|---|
| 容器引擎 | iSulad(华为) | 严格信创环境 |
| 容器编排 | Kubernetes + Helm | 生产环境,多云部署 |
| 镜像仓库 | Harbor(国产化部署) | 私有镜像管理 |
| 持续集成 | Jenkins(国产 OS 部署) | CI/CD 流水线 |
部署方案选择:
- 严格信创场景:iSulad + Kubernetes + Helm + Harbor
- 宽松信创场景:Docker(国产 OS+JDK) + 私有仓库
- 云平台部署:华为 CCE、浪潮云海、麒麟容器云
3.4 开发工具链
| 工具类型 | 推荐信创方案 | 说明 |
|---|---|---|
| JDK | 龙芯 JDK、华为毕昇 JDK、阿里 Dragonwell | 基于 OpenJDK,针对国产 CPU 优化 |
| 构建工具 | Maven(阿里云镜像源) | 使用国内镜像加速依赖下载 |
| 版本控制 | Git(GitLab国产化部署) | 部署于信创环境 |
| IDE | IntelliJ IDEA(配置国产 JDK) | 支持国产 JDK 和信创环境 |
3.5 安全组件选型
| 安全组件 | 推荐信创方案 | Spring Boot适配方式 | 合规要求 |
|---|---|---|---|
| 国密算法 | 华为 GMSSL、国密局 SM 算法库 | gmssl-java 或 BCFIPS 国密Provider |
满足密码应用安全性评估要求 |
| HTTPS证书 | 国密SSL证书(SM2-with-SM3) | 配置Tomcat/TongWeb HTTPS国密套件 | 等保2.0三级以上要求 |
| 身份认证 | 国产CA认证中心、FIDO2生物认证 | Spring Security适配国密证书 | 三员分离权限管控要求 |
| 数据加密 | SM4(存储加密)、SM2(传输加密) | 自定义Spring Data加密转换器 | 数据安全法要求 |
国密算法集成要点:
- HTTPS国密配置:在应用服务器(TongWeb/BES)层面配置国密证书和 cipher suite
- 接口签名验签:使用SM2算法替代RSA进行接口签名,使用SM3替代SHA-256
- 敏感数据存储:使用SM4对称加密存储数据库敏感字段(如身份证号、银行卡号)
- 密码卡适配:高安全等级要求场景,使用硬件密码卡加速国密运算
附录A:配置示例
A.1 pom.xml 依赖配置示例(达梦数据库)
xml
<!-- 达梦数据库驱动 -->
<dependency>
<groupId>dm</groupId>
<artifactId>dmjdbc</artifactId>
<version>8.1.0</version>
</dependency>
<!-- 国密算法支持 -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.70</version>
</dependency>
A.2 application.yml 配置示例
yaml
# 数据源配置 - 达梦
spring:
datasource:
driver-class-name: dm.jdbc.driver.DmDriver
url: jdbc:dm://localhost:5236/SCHEMA?compatibleMode=mysql
username: DB_USER
password: DB_PASSWORD
jpa:
hibernate:
ddl-auto: none
properties:
hibernate:
dialect: org.hibernate.dialect.DmDialect
# 缓存配置 - GaussDB(for Redis)
data:
redis:
host: gauss-redis-instance
port: 6379
password: REDIS_PASSWORD
database: 0
# 国密SSL配置(应用服务器层面配置)
# 参考东方通TongWeb文档配置国密证书和 cipher suite
A.3 国密SM4加密工具类示例
java
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
import java.security.Security;
import java.util.Base64;
/**
* SM4对称加密工具类
* 用于数据库敏感字段加密存储
*/
public class SM4Utils {
static {
Security.addProvider(new BouncyCastleProvider());
}
private static final String ALGORITHM_NAME = "SM4";
private static final String ALGORITHM_NAME_CBC_PADDING = "SM4/CBC/PKCS7Padding";
private static final int KEY_SIZE = 128;
/**
* SM4 CBC模式加密
*/
public static String encrypt(String plainText, String keyHex, String ivHex) throws Exception {
byte[] keyBytes = hexStringToBytes(keyHex);
byte[] ivBytes = hexStringToBytes(ivHex);
SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, ALGORITHM_NAME);
IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes);
Cipher cipher = Cipher.getInstance(ALGORITHM_NAME_CBC_PADDING, BouncyCastleProvider.PROVIDER_NAME);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] encrypted = cipher.doFinal(plainText.getBytes());
return Base64.getEncoder().encodeToString(encrypted);
}
/**
* SM4 CBC模式解密
*/
public static String decrypt(String cipherText, String keyHex, String ivHex) throws Exception {
byte[] keyBytes = hexStringToBytes(keyHex);
byte[] ivBytes = hexStringToBytes(ivHex);
byte[] cipherBytes = Base64.getDecoder().decode(cipherText);
SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, ALGORITHM_NAME);
IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes);
Cipher cipher = Cipher.getInstance(ALGORITHM_NAME_CBC_PADDING, BouncyCastleProvider.PROVIDER_NAME);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] decrypted = cipher.doFinal(cipherBytes);
return new String(decrypted);
}
/**
* 生成SM4密钥
*/
public static String generateKey() throws Exception {
KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM_NAME, BouncyCastleProvider.PROVIDER_NAME);
kg.init(KEY_SIZE, new SecureRandom());
SecretKey secretKey = kg.generateKey();
return bytesToHexString(secretKey.getEncoded());
}
// 辅助方法:字节转十六进制
private static String bytesToHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
// 辅助方法:十六进制转字节
private static byte[] hexStringToBytes(String hex) {
int len = hex.length() / 2;
byte[] result = new byte[len];
for (int i = 0; i < len; i++) {
result[i] = (byte) Integer.parseInt(hex.substring(2 * i, 2 * i + 2), 16);
}
return result;
}
}