数据加密基础:对称加密与非对称加密、哈希算法与数字签名、国密算法(SM2/SM3/SM4)介绍

各位同学好,我是老张。今天咱们聊聊数据加密的基础。说实话,在金融云这个领域,加密不是「要不要做」的问题,而是「怎么做才合规、才安全」的问题。我见过太多项目因为加密选型不当,最后被监管点名整改的案例。

这一章,我会把对称加密、非对称加密、哈希算法、数字签名,还有咱们国家的国密算法,掰开揉碎了讲清楚。你想想看,这些概念如果搞混了,后面做密钥管理方案时,很容易踩坑。

核心观点:没有一种加密算法是万能的。对称加密快,但密钥分发难;非对称加密解决了密钥分发问题,但慢;哈希算法不可逆,适合做完整性校验。国密算法则是我们金融行业的「合规刚需」。

数据加密基础 对称加密 AES / SM4 / DES 非对称加密 RSA / SM2 / ECC 哈希与数字签名 SHA-256 / SM3 / RSA签名 加密速度快 密钥分发困难 解决密钥分发 性能开销大 不可逆性 防抵赖性 国密算法:SM2 / SM3 / SM4 金融行业合规刚需 · 自主可控 · 等保三级要求

一、对称加密:又快又简单,但有个致命弱点

对称加密,说白了就是「一把钥匙开一把锁」。加密和解密用的是同一个密钥。你想想看,就像你家大门钥匙,自己开门进去,别人拿这把钥匙也能开门。

常见的对称加密算法有:

  • AES(Advanced Encryption Standard):国际主流,密钥长度128/192/256位。我个人习惯用AES-256-GCM模式,因为自带认证标签,能防篡改。
  • SM4:国密标准,分组长度128位,密钥长度128位。金融行业做数据存储加密时,SM4是首选。
  • DES/3DES:老古董了,别用了。我记得2018年有个项目还在用DES,被安全审计直接打回。

我的经验:对称加密适合做「大量数据的加密」。比如数据库表里的身份证号、手机号,用SM4加密后存储,性能损耗可以控制在5%以内。但要注意——密钥不能硬编码在代码里!我曾经见过一个项目,密钥直接写在配置文件里,明文存储...嗯,那场面,惨不忍睹。

对称加密的工作模式也很关键。ECB模式不安全,同样的明文块会生成同样的密文块,容易泄露模式信息。我建议用GCM或CTR模式,它们引入了初始向量(IV),每次加密结果都不一样。

// 对称加密示例(伪代码)
// 使用 SM4-GCM 模式加密数据
function encryptData(plaintext, key) {
    iv = generateRandomIV(12 bytes);  // 每次随机生成
    ciphertext = SM4_GCM_Encrypt(plaintext, key, iv);
    return iv + ciphertext;  // IV 需要和密文一起存储
}

二、非对称加密:解决了密钥分发,但慢

非对称加密,也叫公钥加密。它有一对密钥:公钥公开,私钥保密。公钥加密的数据,只有私钥能解开。反过来,私钥签名的数据,公钥可以验证。

这解决了对称加密最大的痛点——密钥分发。你想想看,如果两个人要通信,对称加密需要提前把密钥传给对方,这个过程很容易被截获。而非对称加密,你只需要把公钥公开,别人用公钥加密数据发给你,只有你的私钥能解开。

常见的非对称加密算法:

  • RSA:经典算法,密钥长度2048位起步。但RSA有个问题,密钥越长性能越差。1024位的RSA已经被破解了,别用了。
  • SM2:国密椭圆曲线算法。相比RSA,SM2在同等安全强度下密钥更短、性能更好。256位的SM2相当于3072位的RSA。
  • ECC(椭圆曲线加密):SM2就是基于ECC的。我个人更推荐ECC系列,因为它在移动端和IoT设备上表现更好。

避坑指南:非对称加密不适合加密大块数据。我曾经有个同事,直接用RSA加密一个10MB的文件,结果加密花了3分钟,解密又花了3分钟...正确的做法是「混合加密」:用非对称加密传输对称密钥,再用对称密钥加密实际数据。这是TLS协议的核心思想。

三、哈希算法与数字签名:完整性校验的基石

哈希算法,也叫散列函数。它能把任意长度的数据,映射成一个固定长度的摘要。哈希算法有几个特点:

  • 不可逆:从摘要反推原始数据,理论上不可能。
  • 抗碰撞:很难找到两个不同的输入,产生相同的摘要。
  • 雪崩效应:输入改一个比特,摘要完全变样。

常见的哈希算法:

  • SHA-256:输出256位摘要,目前最常用。比特币用的就是它。
  • SM3:国密哈希算法,输出256位。和SHA-256安全性相当,但算法细节不同。
  • MD5:128位输出,已经被破解了。别用了,真的。

数字签名是哈希算法和非对称加密的结合。流程是这样的:

  1. 发送方对数据做哈希,得到摘要。
  2. 发送方用私钥对摘要加密,生成签名。
  3. 接收方用公钥解密签名,得到摘要A。
  4. 接收方对收到的数据做哈希,得到摘要B。
  5. 比较A和B,如果一致,说明数据没被篡改,且确实是发送方签的。

为什么需要数字签名?哈希只能保证数据完整性,但不能证明是谁发的。数字签名提供了「防抵赖性」——发送方不能否认自己签过名。这在金融交易中至关重要。比如银行转账指令,必须用数字签名确保是客户本人发起的。

四、国密算法:SM2/SM3/SM4 详解

国密算法是国家密码管理局发布的商用密码标准。在金融行业,国密是合规刚需。等保三级、金融行业监管要求,都明确规定了必须使用国密算法。

算法 类型 密钥长度 典型应用场景
SM2 非对称加密 / 数字签名 256位 密钥交换、数字证书、身份认证
SM3 哈希算法 256位摘要 完整性校验、数字签名中的哈希环节
SM4 对称加密 128位 数据存储加密、通信加密

SM2:基于椭圆曲线密码学。相比RSA,SM2的优势很明显:

  • 密钥更短:256位SM2 ≈ 3072位RSA
  • 计算更快:签名速度是RSA的3-5倍
  • 安全性更高:椭圆曲线离散对数问题比大整数分解更难

SM3:输出256位哈希值。它的结构和SHA-256类似,但做了改进。SM3的抗碰撞性经过严格验证,目前没有发现有效攻击。

SM4:分组密码,分组长度128位,密钥长度128位。它的设计借鉴了AES的一些思想,但轮函数和密钥扩展算法完全不同。SM4在软件实现上性能不错,硬件实现也很成熟。

我的建议:在做金融云方案时,尽量做到「双算法支持」。比如同时支持SM4和AES,SM2和RSA。因为有些第三方系统可能还没完成国密改造,需要兼容。但长期来看,国密是趋势。我记得2021年帮某银行做密钥管理系统时,他们要求所有新建系统必须纯国密,老系统三年内完成迁移。

// 国密算法使用示例(伪代码)
// SM2 签名与验签
function signData(data, privateKey) {
    hash = SM3(data);  // 先哈希
    signature = SM2_Sign(hash, privateKey);
    return signature;
}

function verifySignature(data, signature, publicKey) {
    hash = SM3(data);
    isValid = SM2_Verify(hash, signature, publicKey);
    return isValid;
}

// SM4 加密
function encryptWithSM4(plaintext, key) {
    iv = generateRandomIV(16 bytes);
    ciphertext = SM4_CBC_Encrypt(plaintext, key, iv);
    return iv + ciphertext;
}

五、混合加密:实际项目中的最佳实践

在实际的金融云项目中,我们不会只用一种加密算法。而是采用「混合加密」方案:

  1. 用SM2(非对称)加密传输SM4的密钥。
  2. 用SM4(对称)加密实际业务数据。
  3. 用SM3(哈希)做数据完整性校验。
  4. 用SM2(签名)做身份认证和防抵赖。

这样做的好处很明显:既利用了对称加密的高性能,又利用了非对称加密的密钥分发优势,还通过哈希和签名保证了完整性和真实性。

注意:密钥的生命周期管理比加密算法本身更重要。密钥怎么生成?怎么存储?怎么轮换?怎么销毁?这些环节如果出问题,再强的加密算法也没用。我曾经见过一个项目,SM4密钥用了一年都没轮换,而且密钥存储的HSM(硬件安全模块)密码是默认的...嗯,那项目后来被监管罚了。

好了,这一章的内容就到这里。数据加密基础是密钥管理方案的「地基」,地基打不牢,后面盖什么楼都危险。下一章我们会深入密钥的生命周期管理,到时候会用到今天讲的所有概念。


公众号:蓝海资料掘金营,微信deep3321