GM/T 0133-2024 关键信息基础设施密码合规实战:从零构建自动化检查工具
前言
2025年7月1日,GM/T 0133-2024《关键信息基础设施密码应用要求》正式实施。这是国家密码管理局在《密码法》和《关键信息基础设施安全保护条例》框架下,针对CII运营者密码应用合规的专项标准。
与 GM/T 0054-2018(适用于一般信息系统)不同,GM/T 0133-2024 针对金融、能源、交通、水利、医疗、电子政务等八大行业的关键信息基础设施,提出了更严格的密码应用要求。CII运营者必须在系统规划、建设、运行的全生命周期中满足这些要求,并通过密评。
然而,CII运营者的安全团队在面对这个标准时,常常陷入两个困境:
- 标准理解难:标准条文分散在多个章节,缺乏系统化的检查清单
- 自查效率低:人工检查耗时耗力,容易遗漏关键项
一、GM/T 0133-2024 标准核心框架
1.1 与 GM/T 0054-2018 的关系
| 维度 | GM/T 0054-2018 | GM/T 0133-2024 |
|---|---|---|
| 适用范围 | 一般信息系统 | 关键信息基础设施 |
| 法律依据 | 密码法 | 密码法 + 关基条例 |
| 密码算法 | 推荐国密 | 强制国密 |
| 密码模块等级 | 推荐二级 | 强制二级以上 |
| 密钥管理 | 基本要求 | 全生命周期管控 |
| 检测频率 | 一次性 | 每年一次 |
1.2 四大技术面
┌─────────────────────────────────────────────────────────┐
│ GM/T 0133-2024 密码应用要求架构 │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 物理环境 │ │ 网络通信 │ │ 设备计算 │ │
│ │ 密码应用 │ │ 密码应用 │ │ 密码应用 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
│ ┌──────────┐ │
│ │ 应用数据 │ │
│ │ 密码应用 │ │
│ └──────────┘ │
│ │
│ ┌──────────────────────────────────────────────┐ │
│ │ 管理制度 │ 人员管理 │ 建设运行 │ 应急处置 │ │
│ └──────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘1.3 密码应用等级要求
GM/T 0133-2024 将密码应用要求分为三个等级:
| 等级 | 适用对象 | 核心要求 |
|---|---|---|
| 等级一 | 一般CII系统 | 基础密码应用,确保数据传输和存储机密性 |
| 等级二 | 重要CII系统 | 增强密码应用,增加身份鉴别和访问控制 |
| 等级三 | 核心CII系统 | 全面密码应用,覆盖全技术面和管理面 |
二、工具整体设计
2.1 架构设计
本工具采用模块化架构,每个检查模块对应一个技术面,最终汇总生成检查报告。
┌──────────────────────────────────────────────────────────┐
│ CII 密码应用合规检查工具 │
├──────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 物理环境 │ │ 网络通信 │ │ 设备计算 │ │ 应用数据 │ │
│ │ 检查模块 │ │ 检查模块 │ │ 检查模块 │ │ 检查模块 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ │
│ ┌──────────────┐ │
│ │ 报告生成引擎 │ │
│ └──────────────┘ │
└──────────────────────────────────────────────────────────┘2.2 数据结构定义
本工具使用 Python dataclass 定义 CII 系统的密码应用配置,每个字段对应标准中的一个检查项。
三、核心代码实现
3.1 数据模型定义
# 环境要求:cryptography >= 42.0
from dataclasses import dataclass, field
from typing import List, Dict, Optional
from enum import Enum
class CIILevel(Enum):
"""GM/T 0133-2024 密码应用等级"""
LEVEL_1 = 1
LEVEL_2 = 2
LEVEL_3 = 3
@dataclass
class PhysicalSecurityConfig:
"""物理和环境安全密码应用配置"""
has_video_encryption: bool = False # 视频监控系统是否加密存储
has_access_control_crypto: bool = False # 电子门禁是否使用密码技术
has_firewall_crypto: bool = False # 机房防火墙是否支持国密VPN
has_env_monitoring_crypto: bool = False # 环境监控数据是否加密传输
access_control_algorithm: str = "" # 电子门禁使用的算法
video_encryption_algorithm: str = "" # 视频加密使用的算法
@dataclass
class NetworkCommConfig:
"""网络和通信安全密码应用配置"""
has_tls_enabled: bool = False # 是否启用 TLS
tls_version: str = "" # TLS 版本
uses_gm_ciphersuite: bool = False # 是否使用国密密码套件
gm_ciphersuite: str = "" # 国密密码套件名称
has_network_boundary_crypto: bool = False # 网络边界是否部署密码设备
data_transmission_encryption: str = "" # 数据传输加密算法
key_exchange_algorithm: str = "" # 密钥交换算法
@dataclass
class DeviceComputeConfig:
"""设备和计算安全密码应用配置"""
has_remote_auth_crypto: bool = False # 远程管理是否使用密码技术
auth_algorithm: str = "" # 远程管理认证算法
has_log_integrity: bool = False # 日志是否完整性保护
log_integrity_algorithm: str = "" # 日志完整性算法
has_code_signing: bool = False # 代码是否签名验证
code_signing_algorithm: str = "" # 代码签名算法
has_secure_boot: bool = False # 是否支持安全启动
password_module_level: int = 0 # 密码模块安全等级
@dataclass
class AppDataConfig:
"""应用和数据安全密码应用配置"""
has_identity_auth_crypto: bool = False # 身份鉴别是否使用密码技术
auth_algorithm: str = "" # 身份鉴别算法
has_data_encryption: bool = False # 敏感数据是否加密存储
encryption_algorithm: str = "" # 数据存储加密算法
has_data_integrity: bool = False # 数据是否完整性保护
integrity_algorithm: str = "" # 数据完整性算法
has_digital_signature: bool = False # 是否使用数字签名
signature_algorithm: str = "" # 数字签名算法
key_management_compliant: bool = False # 密钥管理是否合规
@dataclass
class CIIAssetConfig:
"""CII 系统完整密码应用配置"""
system_name: str # 系统名称
system_level: CIILevel # 系统等级
physical: PhysicalSecurityConfig = field(default_factory=PhysicalSecurityConfig)
network: NetworkCommConfig = field(default_factory=NetworkCommConfig)
device: DeviceComputeConfig = field(default_factory=DeviceComputeConfig)
appdata: AppDataConfig = field(default_factory=AppDataConfig)3.2 物理环境安全检查模块
class PhysicalSecurityChecker:
"""
GM/T 0133-2024 物理和环境安全检查模块
"""
# 国密合规算法列表
GM_ALGORITHMS = {"SM2", "SM3", "SM4"}
# 国际合规算法列表
COMPLIANT_ALGORITHMS = {"SM2", "SM3", "SM4", "AES-256", "SHA-256", "SHA-384"}
def __init__(self, target_level: CIILevel):
self.target_level = target_level
self.results: List[Dict] = []
def check(self, config: PhysicalSecurityConfig) -> List[Dict]:
"""执行物理环境安全检查"""
self.results = []
# 1. 电子门禁检查
self._check_access_control(config)
# 视频监控检查
self._check_video_surveillance(config)
# 3. 机房网络边界检查
self._check_network_boundary(config)
# 4. 环境监控数据加密
self._check_env_monitoring(config)
return self.results
def _check_access_control(self, config: PhysicalSecurityConfig):
"""电子门禁密码技术应用检查"""
issues = []
if not config.has_access_control_crypto:
issues.append("电子门禁未使用密码技术")
elif config.access_control_algorithm not in self.GM_ALGORITHMS:
issues.append(f"电子门禁算法非国密: {config.access_control_algorithm}")
self.results.append({
"检查项": "电子门禁密码应用",
"要求等级": "二级",
"通过": len(issues) == 0,
"说明": "合规" if not issues else "; ".join(issues),
"标准要求": "电子门禁系统应使用密码技术进行身份鉴别",
"建议": "建议使用 SM2 算法进行门禁身份鉴别"
})
def _check_video_surveillance(self, config: PhysicalSecurityConfig):
"""视频监控数据安全检查"""
issues = []
if not config.has_video_encryption:
issues.append("视频监控数据未加密存储")
elif config.video_encryption_algorithm not in self.COMPLIANT_ALGORITHMS:
issues.append(f"视频加密算法不合规: {config.video_encryption_algorithm}")
self.results.append({
"检查项": "视频监控数据安全",
"要求等级": "二级",
"通过": len(issues) == 0,
"说明": "合规" if not issues else "; ".join(issues),
"标准要求": "视频监控数据应加密存储,防止非法访问",
"建议": "建议使用 SM4 算法加密视频监控数据"
})
def _check_network_boundary(self, config: PhysicalSecurityConfig):
"""机房网络边界密码应用检查"""
issues = []
if not config.has_firewall_crypto:
issues.append("机房网络边界未部署国密VPN设备")
self.results.append({
"检查项": "机房网络边界",
"要求等级": "二级",
"通过": len(issues) == 0,
"说明": "合规" if not issues else "; ".join(issues),
"标准要求": "重要机房网络边界应部署密码设备保护",
"建议": "建议部署支持 GM/T 0022-2015 的 IPSEC VPN 网关"
})
def _check_env_monitoring(self, config: PhysicalSecurityConfig):
"""环境监控数据加密检查"""
self.results.append({
"检查项": "环境监控数据",
"要求等级": "三级",
"通过": config.has_env_monitoring_crypto,
"说明": "合规" if config.has_env_monitoring_crypto else "环境监控数据应加密传输",
"标准要求": "环境监控数据应使用密码技术保证传输机密性",
"建议": "建议使用 TLS 国密套件加密环境监控数据"
})3.3 网络通信安全检查模块
class NetworkCommChecker:
"""
GM/T 0133-2024 网络和通信安全检查模块
"""
GM_CIPHERSUITES = {
"TLS_SM4_GCM_SM3": {"key_exchange": "SM2", "encryption": "SM4-GCM", "hash": "SM3"},
"TLS_SM4_CBC_SM3": {"key_exchange": "SM2", "encryption": "SM4-CBC", "hash": "SM3"},
}
def __init__(self, target_level: CIILevel):
self.target_level = target_level
self.results: List[Dict] = []
def check(self, config: NetworkCommConfig) -> List[Dict]:
"""执行网络通信安全检查"""
self.results = []
# 1. TLS 启用检查
self._check_tls_enabled(config)
# 2. 国密密码套件检查
# 注:TLS_SM4_GCM_SM3/TLS_SM4_CBC_SM3 需要支持国密算法的 SSL/TLS 库(如 GmSSL、TaSSL)才能使用
self._check_gm_ciphersuite(config)
# 3. 数据传输加密检查
self._check_data_transmission(config)
# 4. 密钥交换算法检查
self._check_key_exchange(config)
return self.results
def _check_tls_enabled(self, config: NetworkCommConfig):
"""TLS 启用检查"""
issues = []
if not config.has_tls_enabled:
issues.append("未启用 TLS/国密 SSL")
# 检查 TLS 版本
if config.tls_version in ["TLS 1.0", "TLS 1.1"]:
issues.append(f"TLS 版本不安全: {config.tls_version}")
elif config.tls_version in ["TLS 1.2", "TLS 1.3"]:
pass # OK
else:
issues.append(f"TLS 版本未知: {config.tls_version}")
self.results.append({
"检查项": "通信加密",
"要求等级": "一级",
"通过": len(issues) == 0,
"说明": "合规" if not issues else "; ".join(issues),
"标准要求": "网络通信应使用密码技术保护数据传输安全",
"建议": "建议启用 TLS 1.3 或国密 SSL(TLCP)"
})
def _check_gm_ciphersuite(self, config: NetworkCommConfig):
"""国密密码套件检查
# 注:TLS_SM4_GCM_SM3/TLS_SM4_CBC_SM3 需要支持国密算法的 SSL/TLS 库(如 GmSSL、TaSSL)才能使用"""
issues = []
if not config.uses_gm_ciphersuite:
issues.append("未使用国密密码套件")
elif config.gm_ciphersuite not in self.GM_CIPHERSUITES:
issues.append(f"国密密码套件不合规: {config.gm_ciphersuite}")
self.results.append({
"检查项": "国密密码套件",
"要求等级": "二级",
"通过": len(issues) == 0,
"说明": "合规" if not issues else "; ".join(issues),
"标准要求": "CII 系统应使用国密密码套件进行通信加密",
"建议": "推荐使用 TLS_SM4_GCM_SM3(GM/T 0024-2012,需部署 GmSSL/TaSSL 环境)"
})
def _check_data_transmission(self, config: NetworkCommConfig):
"""数据传输加密检查"""
# 检测数据传输加密算法
compliant = config.data_transmission_encryption in {"SM4", "AES-256"}
self.results.append({
"检查项": "数据传输加密",
"要求等级": "一级",
"通过": compliant,
"说明": f"当前算法: {config.data_transmission_encryption} "
f"({'合规' if compliant else '不合规'})",
"标准要求": "敏感数据传输应使用合规密码算法加密",
"建议": "建议使用 SM4 或 AES-256 加密传输数据"
})
def _check_key_exchange(self, config: NetworkCommConfig):
"""密钥交换算法检查"""
# CII 强制要求国密算法
compliant = config.key_exchange_algorithm in {"SM2", "SM2+Pre-share"}
self.results.append({
"检查项": "密钥交换算法",
"要求等级": "二级",
"通过": compliant,
"说明": f"当前算法: {config.key_exchange_algorithm} "
f"({'合规' if compliant else '不合规'})",
"标准要求": "CII 系统应使用 SM2 进行密钥交换",
"建议": "建议使用 SM2 密钥交换算法"
})3.4 设备计算安全检查模块
class DeviceComputeChecker:
"""
GM/T 0133-2024 设备和计算安全检查模块
"""
def __init__(self, target_level: CIILevel):
self.target_level = target_level
self.results: List[Dict] = []
def check(self, config: DeviceComputeConfig) -> List[Dict]:
"""执行设备计算安全检查"""
self.results = []
# 1. 远程管理认证检查
self._check_remote_auth(config)
# 2. 日志完整性检查
self._check_log_integrity(config)
# 3. 代码签名检查
self._check_code_signing(config)
# 4. 安全启动检查
self._check_secure_boot(config)
# 5. 密码模块等级检查
self._check_password_module_level(config)
return self.results
def _check_remote_auth(self, config: DeviceComputeConfig):
"""远程管理认证检查"""
issues = []
if not config.has_remote_auth_crypto:
issues.append("远程管理未使用密码技术")
elif config.auth_algorithm not in {"SM2", "ECDSA", "RSA"}:
issues.append(f"远程管理认证算法不合规: {config.auth_algorithm}")
self.results.append({
"检查项": "远程管理身份鉴别",
"要求等级": "二级",
"通过": len(issues) == 0,
"说明": "合规" if not issues else "; ".join(issues),
"标准要求": "远程管理应使用密码技术进行身份鉴别",
"建议": "建议使用 SM2 数字证书进行远程管理认证"
})
def _check_log_integrity(self, config: DeviceComputeConfig):
"""日志完整性检查"""
issues = []
if not config.has_log_integrity:
issues.append("日志未进行完整性保护")
elif config.log_integrity_algorithm not in {"SM3", "SHA-256", "HMAC-SM3"}:
issues.append(f"日志完整性算法不合规: {config.log_integrity_algorithm}")
self.results.append({
"检查项": "日志完整性保护",
"要求等级": "二级",
"通过": len(issues) == 0,
"说明": "合规" if not issues else "; ".join(issues),
"标准要求": "重要系统日志应使用密码技术保证完整性",
"建议": "建议使用 HMAC-SM3 对日志进行完整性保护"
})
def _check_code_signing(self, config: DeviceComputeConfig):
"""代码签名检查"""
issues = []
if not config.has_code_signing:
issues.append("代码/配置未签名验证")
elif config.code_signing_algorithm not in {"SM2", "ECDSA", "Ed25519"}:
issues.append(f"代码签名算法不合规: {config.code_signing_algorithm}")
self.results.append({
"检查项": "代码签名验证",
"要求等级": "二级",
"通过": len(issues) == 0,
"说明": "合规" if not issues else "; ".join(issues),
"标准要求": "重要代码和配置应签名验证后执行",
"建议": "建议使用 SM2 数字签名验证固件和软件完整性"
})
def _check_secure_boot(self, config: DeviceComputeConfig):
"""安全启动检查"""
self.results.append({
"检查项": "安全启动",
"要求等级": "三级",
"通过": config.has_secure_boot,
"说明": "已支持安全启动" if config.has_secure_boot
else "不支持安全启动",
"标准要求": "CII 系统应支持安全启动验证固件完整性",
"建议": "建议启用基于 SM2/SM3 的安全启动链"
})
def _check_password_module_level(self, config: DeviceComputeConfig):
"""密码模块安全等级检查"""
# CII 要求二级以上
compliant = config.password_module_level >= 2
self.results.append({
"检查项": "密码模块安全等级",
"要求等级": "二级",
"通过": compliant,
"说明": f"当前等级: {config.password_module_level}级,"
f"要求 ≥ 2级",
"标准要求": "CII 系统使用的密码模块应达到 GM/T 0028-2014 二级以上",
"建议": "建议使用通过 GM/T 0028-2014 二级检测的密码模块"
})3.5 应用数据安全检查模块
class AppDataChecker:
"""
GM/T 0133-2024 应用和数据安全检查模块
"""
def __init__(self, target_level: CIILevel):
self.target_level = target_level
self.results: List[Dict] = []
def check(self, config: AppDataConfig) -> List[Dict]:
"""执行应用数据安全检查"""
self.results = []
# 1. 身份鉴别检查
self._check_identity_auth(config)
# 2. 数据加密存储检查
self._check_data_encryption(config)
# 3. 数据完整性检查
self._check_data_integrity(config)
# 4. 数字签名检查
self._check_digital_signature(config)
# 5. 密钥管理合规检查
self._check_key_management(config)
return self.results
def _check_identity_auth(self, config: AppDataConfig):
"""身份鉴别密码应用检查"""
issues = []
if not config.has_identity_auth_crypto:
issues.append("身份鉴别未使用密码技术")
elif config.auth_algorithm not in {"SM2", "ECDSA", "RSA"}:
issues.append(f"身份鉴别算法不合规: {config.auth_algorithm}")
self.results.append({
"检查项": "身份鉴别",
"要求等级": "一级",
"通过": len(issues) == 0,
"说明": "合规" if not issues else "; ".join(issues),
"标准要求": "应用系统应使用密码技术进行用户身份鉴别",
"建议": "建议使用 SM2 数字证书进行身份鉴别"
})
def _check_data_encryption(self, config: AppDataConfig):
"""数据加密存储检查"""
issues = []
if not config.has_data_encryption:
issues.append("敏感数据未加密存储")
elif config.encryption_algorithm not in {"SM4", "AES-256"}:
issues.append(f"数据加密算法不合规: {config.encryption_algorithm}")
self.results.append({
"检查项": "数据加密存储",
"要求等级": "一级",
"通过": len(issues) == 0,
"说明": "合规" if not issues else "; ".join(issues),
"标准要求": "敏感数据应使用合规密码算法加密存储",
"建议": "建议使用 SM4-CBC 或 SM4-GCM 加密敏感数据"
})
def _check_data_integrity(self, config: AppDataConfig):
"""数据完整性检查"""
issues = []
if not config.has_data_integrity:
issues.append("重要数据未进行完整性保护")
elif config.integrity_algorithm not in {"SM3", "HMAC-SM3", "SHA-256"}:
issues.append(f"完整性算法不合规: {config.integrity_algorithm}")
self.results.append({
"检查项": "数据完整性保护",
"要求等级": "一级",
"通过": len(issues) == 0,
"说明": "合规" if not issues else "; ".join(issues),
"标准要求": "重要数据应使用密码技术保证完整性",
"建议": "建议使用 HMAC-SM3 进行数据完整性保护"
})
def _check_digital_signature(self, config: AppDataConfig):
"""数字签名检查"""
issues = []
if not config.has_digital_signature:
issues.append("未使用数字签名技术")
elif config.signature_algorithm not in {"SM2", "ECDSA", "RSA"}:
issues.append(f"签名算法不合规: {config.signature_algorithm}")
self.results.append({
"检查项": "数字签名",
"要求等级": "二级",
"通过": len(issues) == 0,
"说明": "合规" if not issues else "; ".join(issues),
"标准要求": "重要操作和交易应使用数字签名保证不可否认性",
"建议": "建议使用 SM2 数字签名"
})
def _check_key_management(self, config: AppDataConfig):
"""密钥管理合规检查"""
self.results.append({
"检查项": "密钥管理合规",
"要求等级": "二级",
"通过": config.key_management_compliant,
"说明": "密钥管理合规" if config.key_management_compliant
else "密钥管理不合规",
"标准要求": "密钥管理应符合 GM/T 0028-2014 及相关标准要求",
"建议": "建议建立全生命周期密钥管理体系"
})3.6 检查报告生成器
import json
from datetime import datetime
class CIIComplianceChecker:
"""CII 密码应用合规检查工具(主入口)"""
def __init__(self, target_level: CIILevel = CIILevel.LEVEL_2):
self.target_level = target_level
self.physical_checker = PhysicalSecurityChecker(target_level)
self.network_checker = NetworkCommChecker(target_level)
self.device_checker = DeviceComputeChecker(target_level)
self.appdata_checker = AppDataChecker(target_level)
def check(self, config: CIIAssetConfig) -> Dict:
"""执行完整合规检查"""
physical_results = self.physical_checker.check(config.physical)
network_results = self.network_checker.check(config.network)
device_results = self.device_checker.check(config.device)
appdata_results = self.appdata_checker.check(config.appdata)
all_results = {
"物理和环境安全": physical_results,
"网络和通信安全": network_results,
"设备和计算安全": device_results,
"应用和数据安全": appdata_results
}
# 生成报告
return self._generate_report(config, all_results)
def _generate_report(self, config: CIIAssetConfig, all_results: Dict) -> Dict:
"""生成检查报告"""
# 统计
total_items = 0
passed_items = 0
failed_items = []
for category, results in all_results.items():
for item in results:
total_items += 1
if item["通过"]:
passed_items += 1
else:
failed_items.append({
"技术面": category,
"检查项": item["检查项"],
"说明": item["说明"],
"建议": item.get("建议", "")
})
# 判定结论
compliance_rate = passed_items / total_items * 100 if total_items > 0 else 0
conclusion = "合规" if len(failed_items) == 0 else "部分合规"
return {
"基本信息": {
"系统名称": config.system_name,
"系统等级": f"GM/T 0133-2024 {self.target_level.value}级",
"检查日期": "2026-07-10",
"检查依据": "GM/T 0133-2024《关键信息基础设施密码应用要求》"
},
"检查结果汇总": {
"检查项总数": total_items,
"通过项数": passed_items,
"未通过项数": len(failed_items),
"通过率": f"{compliance_rate:.1f}%",
"合规判定": conclusion
},
"详细检查结果": all_results,
"问题清单": failed_items,
"整改建议": self._generate_recommendations(failed_items)
}
def _generate_recommendations(self, failed_items: List[Dict]) -> List[str]:
"""生成整改建议"""
recommendations = []
for item in failed_items:
recommendations.append(
f"[{item['技术面']}] {item['检查项']}: {item['建议']}"
)
return recommendations3.7 运行示例
def main():
"""运行 CII 密码应用合规检查"""
# 定义某 CII 系统的密码应用配置
cii_system = CIIAssetConfig(
system_name="某电力调度系统",
system_level=CIILevel.LEVEL_2,
physical=PhysicalSecurityConfig(
has_access_control_crypto=True,
access_control_algorithm="SM2",
has_video_encryption=True,
video_encryption_algorithm="SM4",
has_firewall_crypto=True,
has_env_monitoring_crypto=False
),
network=NetworkCommConfig(
has_tls_enabled=True,
tls_version="TLS 1.2",
uses_gm_ciphersuite=True,
gm_ciphersuite="TLS_SM4_GCM_SM3",
data_transmission_encryption="SM4",
key_exchange_algorithm="SM2"
),
device=DeviceComputeConfig(
has_remote_auth_crypto=True,
auth_algorithm="SM2",
has_log_integrity=True,
log_integrity_algorithm="HMAC-SM3",
has_code_signing=True,
code_signing_algorithm="SM2",
has_secure_boot=False,
password_module_level=2
),
appdata=AppDataConfig(
has_identity_auth_crypto=True,
auth_algorithm="SM2",
has_data_encryption=True,
encryption_algorithm="SM4",
has_data_integrity=True,
integrity_algorithm="HMAC-SM3",
has_digital_signature=True,
signature_algorithm="SM2",
key_management_compliant=True
)
)
# 执行检查
checker = CIIComplianceChecker(target_level=CIILevel.LEVEL_2)
report = checker.check(cii_system)
# 输出报告
print("=" * 60)
print("CII 密码应用合规检查报告")
print("=" * 60)
print(json.dumps(report, ensure_ascii=False, indent=2))
# 保存报告
with open("gm0133_cii_compliance_report.json", "w", encoding="utf-8") as f:
json.dump(report, f, ensure_ascii=False, indent=2)
print("\n报告已保存至 gm0133_cii_compliance_report.json")
if __name__ == "__main__":
main()运行输出示例:
============================================================
CII 密码应用合规检查报告
============================================================
{
"基本信息": {
"系统名称": "某电力调度系统",
"系统等级": "GM/T 0133-2024 2级",
"检查日期": "2026-07-10",
"检查依据": "GM/T 0133-2024"
},
"检查结果汇总": {
"检查项总数": 18,
"通过项数": 16,
"未通过项数": 2,
"通过率": 88.9%,
"合规判定": "部分合规"
},
"问题清单": [
{
"技术面": "物理和环境安全",
"检查项": "环境监控数据",
"说明": "环境监控数据应加密传输",
...
},
{
"技术面": "设备和计算安全",
"检查项": "安全启动",
"说明": "不支持安全启动",
...
}
]
}四、检查案例实战
4.1 某电力调度系统(二级)
某省电力调度系统依据 GM/T 0133-2024 二级要求进行密码改造。
检查结果:
- ✅ 物理环境:电子门禁和视频监控均使用国密算法
- ✅ 网络通信:使用 TLS_SM4_GCM_SM3 国密套件
- ⚠️ 设备计算:不支持安全启动(三级要求)
- ✅ 应用数据:身份鉴别、加密存储、数字签名全面合规
4.2 某政务云平台(二级)
某市政务云平台承载多个委办局的业务系统。
关键改造点:
- 网络通信:原来使用 RSA 证书,改造为 SM2 双证书方案
- 设备计算:服务器 BMC 远程管理增加 SM2 证书认证
- 应用数据:数据库字段级加密从 AES-256 迁移到 SM4-CBC
- 密钥管理:部署符合 GM/T 0034-2014 的密钥管理系统
五、常见问题与踩坑记录
5.1 混淆"密码合规"与"国密合规"
现象:认为所有密码算法都必须换成国密算法才算合规。 原因:对标准理解存在偏差。GM/T 0133-2024 在部分场景允许使用国际算法(如 AES-256、SHA-256),但强烈推荐使用国密算法。 解决:对于新建CII系统,建议全面采用国密算法。对于已运行系统,可逐步迁移,优先改造核心业务系统。
5.2 密码模块等级选择不当
现象:采购的密码模块仅通过 GM/T 0028-2014 一级检测,不满足 CII 二级要求。 原因:采购时未将密码模块等级纳入技术规格。 解决:CII 系统的密码模块必须达到 GM/T 0028-2014 二级以上。采购时应要求供应商提供检测认证证书。
5.3 密钥管理"表面合规"
现象:部署了密钥管理系统(KMS),但实际使用中存在密钥硬编码、明文传输等问题。 原因:密钥管理制度执行不到位,开发人员安全意识不足。 解决:KMS 部署只是第一步。必须建立:
- 密钥生成、分发、存储、使用、归档、销毁的全流程管理制度
- 密钥使用的代码审查机制(禁止硬编码)
- 定期密钥轮换策略
- 密钥操作的审计日志
六、总结
本文构建了一个完整的 CII 密码应用合规检查工具,覆盖 GM/T 0133-2024 的四大技术面。该工具可作为 CII 运营者在密评前的自查手段,帮助发现合规差距并制定整改计划。
关键要点:
- CII 系统密码模块必须达到 GM/T 0028-2014 二级以上
- 国密算法是优先选择,但非全部场景强制
- 密钥管理是贯穿所有技术面的核心,必须建立全生命周期管理
- 物理安全容易被忽视,但三级 CII 系统的要求非常严格
参考来源
- GM/T 0133-2024《关键信息基础设施密码应用要求》
- GM/T 0054-2018《信息系统密码应用基本要求》
- GM/T 0028-2014《密码模块安全技术要求》
- GM/T 0034-2014《基于SM2的证书认证系统密码及相关安全技术规范》
- https://www.oscca.gov.cn(国家密码管理局)
- https://std.samr.gov.cn(全国标准信息公共服务平台)