一、SM3密码杂凑算法概述
大家好,欢迎来到这门课程。我们从第一章开始,聊聊SM3这个算法到底是什么来头。很多人一听到“国密算法”,就觉得是国家强制的、高深莫测的东西。其实没那么玄乎。SM3说白了就是中国版的SHA-256,一个用来计算数据“指纹”的算法。
我这些年做密码安全项目,碰到过不少团队,直接拿MD5、SHA-1做密钥校验和边界审计。结果呢?一审计,全暴露了。MD5能碰撞,SHA-1的碰撞攻击也已经成熟。所以我个人的建议是:只要涉及国产化合规、金融安全、政务系统,就老老实实用SM3。
1.1 发展历程
我记得刚入行那会儿,国内密码算法市场几乎是MD5和SHA-1的天下。大家图省事,觉得能用就行。但2010年国家密码管理局发布SM3之后,形势就慢慢变了。
SM3的诞生不是心血来潮。你想想看,国际上SHA-1已经被证明存在碰撞攻击,MD5更是千疮百孔。中国需要自己的密码算法标准,既保证安全性,又不受制于人。
- 2010年:国家密码管理局正式发布《SM3密码杂凑算法》。
- 2012年:纳入中国下一代密码算法商用体系。
- 2016年:成为国际标准 ISO/IEC 10118-3:2018,获得国际认可。
- 2019年至今:金融、政企、车联网等领域全面推广。
讲个我亲身经历的事。几年前做一家银行的国产化迁移,对方坚持用SHA-256做交易签名。我跟他们解释了半天:“国内合规审查时,SHA-256算非国密算法,不满足等保要求。”后来一查,果然审计被打了回票。所以从那时候起,我养成了习惯——只要是国产化项目,SM3是首选。
1.2 国密标准背景
很多人问:“为什么非得用国密算法?”其实这是个很现实的问题。
核心原因:自主可控与合规刚需。金融、政务、通信、能源等领域,国家有明确的密码使用要求。SM3作为国家标准(GB/T 32905-2016),是合规的唯一选择。
国密标准体系中,SM3承担的是“哈希”角色。它和SM2(公钥密码)、SM4(对称密码)组合使用,形成一个完整的密码应用生态。
| 算法 | 类型 | 输出长度 | 主要用途 |
|---|---|---|---|
| SM2 | 椭圆曲线公钥密码 | 256位 | 数字签名、密钥协商 |
| SM3 | 密码杂凑算法 | 256位 | 数据完整性、身份认证 |
| SM4 | 对称分组密码 | 128位 | 数据加密 |
我刚接手一个政务云项目时,对方技术负责人问我:“SM3和SHA-256到底差在哪?”其实从安全强度上看,两者在设计上都是256位输出,抗碰撞性接近。但SM3在消息扩展和压缩函数上有自己的优化,而且原生支持国密体系。说白了,用SM3就是“标准合身”,不需要额外的封装和转换。
1.3 主要应用场景
SM3不是摆着好看的,它在实际项目里有几个非常核心的用武之地。
- 数字签名:SM2+SM3是最常见的签名方案。SM3把消息压缩成固定长度的摘要,SM2用私钥对这个摘要签名。嗯,这里要注意——签名前一定要把SM3输出的256位摘要作为签名输入,不能传原始消息。
- 消息完整性校验:我在做边界审计时,经常用SM3计算数据块的哈希值。一旦数据被篡改,哈希值对不上,立马报警。
- 身份认证与密钥校验:HMAC-SM3是典型的挑战-响应认证机制。双方共享一个密钥,用SM3对挑战值和密钥做运算,验证对方身份。
- 密码派生:比如KDF(密钥派生函数)中,SM3可以作为底层哈希函数,从主密钥派生出子密钥。
- 区块链/分布式账本:部分国产化区块链项目用SM3做交易哈希和区块哈希,替代SHA-256。
建议:在做边界审计系统的哈希链设计时,优先使用SM3而非MD5。我曾经碰到一个团队用MD5做完整性审计链,结果链上的两个不同区块产生了同样的哈希值——这就是碰撞攻击的雏形。
1.4 技术特点与性能
SM3采用Merkle-Damgård结构,消息分块处理,每块512位,输出256位。它的核心是压缩函数中的64轮迭代,比SHA-256的64轮在一些细节上做了调整,比如消息扩展的方式不同。
注意:SM3虽然和SHA-256结构相似,但不能直接混用。在合规审计中,如果使用的哈希算法不是SM3,可能会被判定为非国密算法,导致合规不通过。
性能表现方面,SM3在软件实现上略慢于SHA-256,但差距不大。在我的测试中,纯Python实现大约在2-3 MB/s的吞吐量,而C实现可以跑到600 MB/s以上。一般来说,这个性能完全够用。
来看一个简单的SM3 HMAC实现例子——我个人习惯用Python的pysmx库,很方便。
from pysmx.SM3 import SM3
# 假设我们有一个密钥和一个消息
key = b'1234567890123456'
message = b'Hello, SM3!'
# 计算HMAC-SM3
h = SM3()
hmac_value = h.hmac(key, message)
print(f'HMAC-SM3: {hmac_value.hex()}')
# 输出示例:'a3b8c1d2e4f567890...'
你可能会问:“SM3会不会被攻破?”目前看,安全强度足够,256位的输出空间,碰撞攻击的计算复杂度为2^128,在可预见的未来是安全的。不过,量子计算是个长期威胁,但那是后话了。
好了,第一章我们大致了解了SM3的来龙去脉、标准背景、应用场景和实现要点。记住一句话:SM3不是万能灵药,但在国产密码体系中,它是基础中的基础。