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

各位同学,咱们今天聊点硬核的——密码学。别一听就头大,其实这东西没那么玄乎。我做了这么多年物联网安全,说白了,密码学就是给数据穿上一件防弹衣。你想想看,设备之间传数据,就像在大街上喊话,谁都能听见。密码学就是让你俩用只有彼此懂的黑话交流。

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

对称加密,顾名思义,加密和解密用的是同一把钥匙。就像你家的门锁,用钥匙锁上,再用同一把钥匙打开。典型的算法有 AES、DES、SM4(国密标准)。

我在项目中遇到过最典型的场景:传感器采集温度数据,通过 Wi-Fi 发给网关。数据量不大,但要求实时。这时候用对称加密最合适,速度快,开销小。

核心要点:对称加密的优点是快,缺点是密钥分发难。你想想,如果每个设备都要预置同一把钥匙,万一哪个设备被破解了,整个系统就全完了。

举个例子,AES-128 加密一段数据:

// 伪代码示例
plaintext = "温度: 25.3°C"
key = "0123456789abcdef"  // 128位密钥
ciphertext = AES_Encrypt(plaintext, key)
// 输出: 一串看起来像乱码的字节

嗯,这里要注意:密钥长度很重要。AES-128 够用,但如果你做的是金融级别的物联网设备,我建议上 AES-256。多花那点算力,换来的是更高的安全余量。

非对称加密:公钥私钥两兄弟

非对称加密就更有意思了。它有一对钥匙:公钥和私钥。公钥可以公开,私钥自己藏好。你用公钥加密,只有对应的私钥能解开。反过来,你用私钥签名,别人用公钥验证。

说白了,这解决了对称加密最大的痛点——密钥分发。你不需要提前把密钥告诉对方,直接把公钥扔出去就行。

常见的算法有 RSA、ECC(椭圆曲线)、SM2(国密)。我个人习惯在物联网设备上用 ECC,因为它的密钥更短,算力要求更低。你想想看,一个温度传感器,CPU 主频可能才几十兆赫兹,跑 RSA 2048 位加密,那得等到花儿都谢了。

我的经验:在资源受限的物联网设备上,ECC 256 位的安全性相当于 RSA 3072 位,但计算速度快了不止一个数量级。我曾经在一个基于 ESP32 的项目中,用 ECC 做密钥交换,整个握手过程不到 200 毫秒。

哈希函数:数据的指纹

哈希函数,你可以把它理解成给数据按个指纹。不管数据多大,哈希函数都能算出一个固定长度的摘要。而且,哪怕你只改了一个比特,算出来的哈希值就完全不一样。

常见的哈希算法有 SHA-256、SHA-3、SM3(国密)。

我在项目中遇到过一件事:有个设备固件升级,下载下来总是不对。后来发现是传输过程中丢包了。怎么发现的?就是对比了固件的哈希值。下载前先拿到官方发布的 SHA-256 值,下载完本地再算一遍,对不上就说明文件坏了。

避坑指南:我曾经见过有人用 MD5 做固件校验。MD5 已经被证明有碰撞风险了,千万别再用。至少上 SHA-256,这是底线。

哈希函数还有一个重要用途:存储密码。你想想,如果数据库里存的是明文密码,一旦被拖库,所有用户就全完了。正确的做法是存密码的哈希值。用户登录时,把输入的密码哈希一下,跟数据库里的比对。

// 密码存储的正确姿势
password = "user123456"
salt = random_bytes(16)  // 加盐,防止彩虹表攻击
hash = SHA256(salt + password)
// 存储: salt + hash

数字签名:证明你是谁

数字签名,说白了就是用私钥给数据打个标记,证明这数据确实是你发的,而且没被篡改过。它结合了哈希函数和非对称加密。

流程是这样的:

  1. 发送方对数据算哈希值
  2. 用私钥加密这个哈希值,得到签名
  3. 把数据和签名一起发出去
  4. 接收方用公钥解密签名,得到哈希值
  5. 再对收到的数据算一次哈希值
  6. 两个哈希值比对,一致就说明数据完整且来源可信

为什么会这样?因为只有持有私钥的人才能生成有效的签名。公钥是公开的,谁都能验证,但伪造不了签名。

我记得有一次做车联网项目,车辆之间要交换位置信息。如果不用数字签名,黑客可以伪造一辆假车的位置,造成交通事故。加了签名之后,每辆车都验证对方的身份,这就安全多了。

密钥管理基础:安全的关键

讲到这里,你可能会问:算法都挺好,但密钥怎么管?

嗯,这才是物联网安全里最头疼的问题。算法再强,密钥泄露了,一切白搭。

我总结了几条密钥管理的铁律:

  • 密钥不能硬编码:我见过太多人把密钥直接写在代码里。编译到固件里,反编译就能看到。正确的做法是用安全芯片或 TEE(可信执行环境)存储密钥。
  • 密钥要定期轮换:一把钥匙用十年,风险太大了。设备上线后,应该通过安全通道定期更新密钥。
  • 不同用途用不同密钥:加密用一把,签名用另一把。万一加密密钥泄露了,签名密钥还是安全的。
  • 密钥要有生命周期:生成、分发、使用、轮换、销毁,每个阶段都要有记录和审计。

核心观点:密钥管理不是技术问题,而是工程问题。你设计得再好,落地执行不到位,照样出问题。我曾经在一个项目中,密钥轮换脚本写错了,导致上千台设备离线。从那以后,我每次做密钥管理方案,都会加上灰度发布和回滚机制。

最后,给大家一个实用的建议:在物联网设备上,优先使用硬件安全模块(如 ATECC608A 这样的安全芯片)。它内置了密钥存储、加密运算、真随机数生成等功能,而且密钥一旦写入,就无法从外部读取。这比你在软件层面做再多防护都管用。

好了,密码学基础就聊到这儿。下一章咱们讲 TLS 协议,看看怎么把这些密码学工具组合起来,实现端到端的安全通信。