2. 加密基础理论:对称加密与非对称加密

聊加密之前,咱们先理清一个概念:加密不是魔法,它就是把数据搅成一锅粥,外加一把钥匙——只有拿着正确钥匙的人才能把它恢复原样。我做了这么多年数据安全,发现很多同学上来就纠结算法细节,却忽略了最根本的东西:密钥长度决定了暴力破解的性价比。你想想看,如果钥匙本身太短,再牛的算法也白搭。

2.1 对称加密:AES-256 到底牛在哪

对称加密,说白了就是加密和解密用同一把钥匙。好比你家大门锁,开门关门的钥匙是一把。优点是快,特别快。我当年在金融项目里做列级加密,千万条记录批量处理,非对称加密根本扛不住,最后全走的对称。

目前行业公认的对称加密标准是 AES(Advanced Encryption Standard)。我习惯直接说 AES-256,因为它是 AES 三种密钥长度(128、192、256)里最安全的一个。为什么?

  • AES-128:密钥 128 位,暴力破解需要 2¹²⁸ 次尝试。现在超级计算机理论上能撞到 2⁶⁰ ~ 2⁷⁰,差得远。但量子计算来了之后,128 位可能会被 Grover 算法降到 2⁶⁴,这就有点危险了。
  • AES-256:密钥 256 位,暴力破解需要 2¹²⁸ 次(Grover 算法也只砍到 2¹²⁸)。我个人认为,未来十年内没有任何实用设备能撞动它。

关键指标:AES-256 的密钥长度是 256 位,每次加密处理 128 位数据块。加解密速度在硬件加速下能达到 GB/s 级别。

我在项目中见过一个坑:有人为了省性能把密钥长度从 256 降到 128,结果过审时被安全团队打回来,理由是“预期使用周期超过 5 年”。嗯,这里要注意——密钥长度选择不是“当前够用就行”,得看你的数据在几年后还值不值得偷。

2.2 非对称加密:RSA-2048 的公私钥体系

非对称加密就高级一点:一把公钥加密,一把私钥解密。公钥随便发,私钥自己藏。我最早接触这个是在做 API 签名时,用私钥签名、公钥验签——那套流程现在还在用。

RSA 是目前最常用的非对称算法。它的原理基于大数分解:两个大质数相乘很容易,但把乘积分解回质数就极难。我讲的粗糙点,你可以理解为把两块乐高积木拼起来只需要一秒,但把拼好的模型拆回两块积木,可能需要几千年。

  • RSA-2048:密钥长度 2048 位,即公钥模数是 2048 位的整数。业内认为它现在有 128 位对称加密相当的安全强度。
  • RSA-4096:密钥长度翻倍,安全强度相当于 AES-256 级别,但计算开销也翻倍。

我个人的选择习惯:列级加密场景下,对称加密负责内容加密,非对称加密只负责对称密钥的包装。RSA-2048 对于绝大多数场景足够了。除非你要防护国家级对手或量子计算,否则没必要上 4096。

2.3 密钥长度与安全性:一张表说清楚

各种算法之间怎么比安全强度?业界有一个对照表,我直接给你列出来:

对称算法密钥长度 非对称算法密钥长度 安全强度(位) 暴力破解难度(相对)
AES-128 RSA-3072 128 2¹²⁸
AES-192 RSA-7680 192 2¹⁹²
AES-256 RSA-15360 256 2²⁵⁶

注意看,AES-256 对应的非对称密钥长度非常夸张——15360 位!但实践中没人用这么长的 RSA,因为性能太差。所以行业标准做法是:非对称只用 RSA-2048 或 ECC,对称密钥直接用 AES-256。

2.4 为什么最终选择 AES-256 + RSA-2048

你可能会问:那为什么不搞一套纯对称或纯非对称?我解释下:

  1. 纯对称的问题:密钥分发是死穴。你想想看,如果我用 AES-256 加密数据库里的身份证,那这把密钥怎么安全地发给各个服务?通过网络传输?密钥本身也要加密——死循环。
  2. 纯非对称的问题:太慢。RSA-2048 加密 1MB 数据可能要几十毫秒,而 AES-256 只需要几微秒。在列级加密场景下,一张表几万行,非对称直接炸穿 CPU。

混合加密才是最优解:用 RSA-2048 加密 AES-256 的密钥(这叫密钥包装),然后用 AES-256 加密真正的数据。既解决了分发问题,又保证了高速。

我经历过的一个真实案例:某电商系统对用户手机号做列级加密,一开始用了纯 RSA-2048,结果数据库写入延迟从 2ms 飙升到 120ms。后来改成混合加密——RSA 只包装对称密钥,AES 处理字段数据——延迟降到 5ms 以内。原理很简单,但很多人上来就写错了。

2.5 核心逻辑图:混合加密流程

下面这张图总结了密钥分发和加密解密的整体流程。你看一眼就能记住。

混合加密核心流程 发送方(Encrypt) 持有数据 + AES密钥 1. AES-256 加密数据 输出:密文 2. RSA-2048 加密AES密钥 输出:密钥密文 传输/存储 密文数据 密钥密文 接收方只能拿到 密文,获取不到 原始密钥 3. RSA-2048 解密密钥 输出:AES密钥 4. AES-256 解密数据 输出:明文原文 接收方 要点说明: • 混合加密结合了对称的高速和非对称的安全分发 • AES-256 负责批量数据加密,RSA-2048 只保护密钥 • 密钥密文可以随数据一起传输,只有持有私钥才能解开

2.6 避坑指南:密钥长度别拍脑门定

我发现很多人写代码时直接写死一个 AES-128,问就是“网上教程都这么写的”。嗯,网上教程可能只针对 Demo。生产环境我建议你按这个规则选:

  • 保护期 ≤ 3 年:AES-128 够用(但我不推荐,万一延期了呢)。
  • 保护期 5~10 年:必须 AES-256 + RSA-2048。
  • 保护期 > 10 年:考虑后量子密码(比如 Kyber),但现阶段的列级加密项目很少到这个级别。

我曾经踩过的一个坑:在一个政府项目中,我用 RSA-1024 包装密钥,结果被评审专家指出“1024 位 RSA 在 2020 年后已被多家机构认定可被国家级对手破解”。当时我脸都绿了,赶紧换成 2048。这事告诉我:密钥长度不是一把尺子量到底,安全要求会随时间变。你最好预留一个可升级密钥长度的接口。

2.7 小结:记住两个数字和一个习惯

两个数字:AES-256(对称密钥长度)和 RSA-2048(非对称密钥长度)。这是当前列级加密的黄金组合。

一个习惯:永远不要把对称密钥硬编码在代码里或明文传输。密钥要用 RSA 加密后传输,到了接收方再解密使用。我每次做代码审查,都会重点看密钥的分发逻辑——这里出问题,基本等于没加密。