密码学基础:对称加密与非对称加密、哈希函数与数字签名、密钥管理基础

各位同学好,我是老张。今天咱们聊聊密码学基础。说实话,很多人一听到「密码学」三个字就觉得头大,觉得那是数学家干的事。其实不然,你想想看,我们每天用的微信、支付宝、网银,背后全是这些东西在撑着。

我个人习惯把密码学比作「锁匠的工具箱」。你不需要会造锁,但得知道什么锁用在什么门上。今天这一章,我就带你把这个工具箱里的几样核心工具认全了。

核心知识点一览:

  • 对称加密:一把钥匙开一把锁,快但麻烦
  • 非对称加密:两把钥匙配对用,慢但安全
  • 哈希函数:数据的「指纹」,不可逆
  • 数字签名:证明「是你写的」且「没被改过」
  • 密钥管理:所有安全的基础,也是最容易翻车的地方
密码学基础 对称加密 AES / DES / SM4 速度快,密钥分发难 非对称加密 RSA / ECC / SM2 安全但慢,用于密钥交换 哈希函数 SHA-256 / SM3 不可逆,防篡改 密钥管理 生成 / 存储 / 分发 / 轮换 HSM / KMS 硬件保护 数字签名 哈希 + 非对称加密 防抵赖,验完整性 实际应用中,四种技术往往组合使用

1. 对称加密:一把钥匙开一把锁

对称加密,说白了就是加密和解密用同一把钥匙。就像你家的门锁,用钥匙锁上,再用同一把钥匙打开。

常见的对称加密算法有:

  • AES(Advanced Encryption Standard):目前最主流,密钥长度128/192/256位
  • DES(Data Encryption Standard):老古董了,56位密钥,现在用暴力破解几小时就搞定
  • SM4:国标算法,国内项目经常要求用这个

我的经验:做物联网项目时,设备端资源有限,跑RSA太慢。我一般用AES-128做数据加密,密钥预置在设备里。但注意,密钥不能硬编码在代码里——我曾经见过有人把密钥写在注释里,那叫一个酸爽。

对称加密最大的优点就是快。你想想看,一个视频流如果用非对称加密逐帧加密,服务器得冒烟。但缺点也很明显——密钥怎么安全地传给对方?这就是所谓的「密钥分发问题」。

// AES-256 加密示例(伪代码)
key = "这是一个32字节的密钥12345678"
plaintext = "Hello, 智能通信!"

ciphertext = AES_Encrypt(plaintext, key)
// 输出: 一堆看起来像乱码的字节

decrypted = AES_Decrypt(ciphertext, key)
// 输出: "Hello, 智能通信!"

2. 非对称加密:两把钥匙配对用

非对称加密就聪明多了。它有一对钥匙:公钥和私钥。公钥可以公开给全世界,私钥自己死死藏好。用公钥加密的数据,只有对应的私钥能解开;反过来,用私钥签名的数据,大家用公钥就能验证。

常见的算法:

  • RSA:老牌选手,2048位起步,4096位更稳
  • ECC(椭圆曲线):256位的ECC安全性相当于3072位的RSA,省带宽
  • SM2:国标椭圆曲线算法

避坑指南:我曾经在项目中看到有人用RSA加密大文件,结果性能惨不忍睹。正确的做法是「混合加密」——用非对称加密传输对称密钥,再用对称密钥加密实际数据。这就是HTTPS的底层逻辑。

特性 对称加密 非对称加密
密钥数量 1个(共享密钥) 2个(公钥+私钥)
速度 快(硬件加速可达GB/s) 慢(RSA 2048约几千次/秒)
密钥分发 困难(需要安全通道) 容易(公钥随便发)
典型用途 数据加密、批量加密 密钥交换、数字签名

3. 哈希函数:数据的「指纹」

哈希函数,嗯,你可以把它想象成一个榨汁机。你把一个苹果放进去(输入数据),出来一杯苹果汁(哈希值)。但你不可能从苹果汁里还原出完整的苹果——这就是不可逆性。

好的哈希函数有几个特点:

  • 固定输出长度:不管输入是1字节还是1GB,输出都是固定长度(比如SHA-256输出256位)
  • 雪崩效应:输入改一个比特,输出完全变样
  • 抗碰撞:很难找到两个不同的输入产生相同的哈希值

常用的哈希算法:

  • SHA-256:比特币用的那个,安全性很高
  • MD5:128位输出,已经被攻破,别用了
  • SM3:国标哈希算法,输出256位

实际应用场景:

  • 密码存储:存哈希值而不是明文密码
  • 文件完整性校验:下载文件后比对哈希值
  • 数字签名:先对消息哈希,再对哈希值签名
// 哈希函数示例
message = "转账100元给张三"
hash = SHA256(message)
// 输出: "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a"

// 哪怕改一个字符
message2 = "转账100元给李四"
hash2 = SHA256(message2)
// 输出: "d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592"
// 两个哈希值完全不同

4. 数字签名:证明「是你写的」且「没被改过」

数字签名,说白了就是哈希函数和非对称加密的组合拳。你先把消息算个哈希,然后用你的私钥加密这个哈希值——这就是签名。别人拿到消息和签名后,用你的公钥解密签名得到哈希值,再自己算一遍消息的哈希值,两个一比对就知道有没有被篡改。

为什么需要哈希?直接对消息签名不行吗?行是行,但消息太长的话RSA签名会很慢。哈希一下,把任意长度的消息变成固定长度的摘要,效率就上来了。

我个人的习惯:在做API接口签名时,我一般会把请求参数按字典序排序,拼接成字符串,然后加上时间戳和随机数,最后用私钥签名。这样既能防重放攻击,又能防参数篡改。

5. 密钥管理:所有安全的基础

讲到这里,我得说句大实话:算法再牛,密钥泄露了全白搭。密钥管理才是密码学里最考验工程能力的地方。

密钥管理包括几个环节:

  1. 密钥生成:要用真正的随机数生成器,不能用伪随机
  2. 密钥存储:不能明文存,要用HSM(硬件安全模块)或KMS(密钥管理服务)
  3. 密钥分发:通过安全通道传输,比如用对方的公钥加密后发送
  4. 密钥轮换:定期更换密钥,降低泄露风险
  5. 密钥销毁:废弃的密钥要彻底清除,不能只是删个文件

我曾经踩过的坑:有个项目把私钥放在Git仓库里,结果代码托管平台被拖库,私钥全泄露了。从那以后,我坚持所有密钥必须走密钥管理服务,代码里只留一个密钥ID。

嗯,密码学基础就讲这些。对称加密快但密钥分发难,非对称加密解决了分发问题但慢,哈希函数做完整性校验,数字签名做身份认证和防抵赖,密钥管理则是所有环节的基石。实际项目中,这几种技术往往是组合使用的——你想想HTTPS,不就是非对称加密交换对称密钥,对称加密加密数据,再加上数字证书做身份认证吗?

好了,这一章的内容就是这些。记住,密码学不是数学竞赛,它是工程实践。理解原理,知道什么时候用什么工具,比背下一堆公式重要得多。


专注资料整理