加密基础:对称加密、非对称加密、哈希函数的概念与应用

这三类加密工具,可以说是整个 Tokenization 和对象存储安全的地基。我刚开始搞数据安全时,也经常搞混它们的用途——反正都是把数据搞乱嘛,有什么区别?后来踩了几次坑才明白,选错工具比不加密更可怕。今天咱就掰开揉碎讲清楚。

对称加密:又快又简单,但密钥是命门

对称加密,说白了就是一把钥匙开一把锁。加密和解密用同一个密钥。你想想看,你给文件上了锁,然后把钥匙连文件一起寄出去,对面用同一把钥匙打开——这不就麻烦了吗?

核心算法:
  • AES(高级加密标准)——当前工业标准,密钥长度 128/192/256 位。我在项目中几乎只用 AES-256-GCM,因为它自带认证加密,能防篡改。
  • DES / 3DES——别碰。DES 密钥只有 56 位,用 FPGA 几小时就能暴力破解。我见过遗留系统还在用 3DES,后来出了合规问题,紧急迁移到 AES,折腾了三个月。

优缺点:速度快,适合加密大量数据。但密钥分发和存储是大麻烦。你想想,如果对象存储里每个文件都用不同的对称密钥,那密钥本身谁来保护?

我的个人习惯: 在做 Tokenization 时,我会用对称加密来加密 本身(不是明文数据),因为 长度小、加密快,而且密钥可以放在硬件安全模块(HSM)里。千万不要把对称密钥硬编码在代码里——我曾经接手过一个项目,密钥就写死在配置文件里,还被提交到了 Git 仓库,当时吓得我赶紧发了个安全公告。

非对称加密:公钥私钥,天生一对

非对称加密有两个钥匙:公钥可以公开,私钥必须保密。用公钥加密的数据,只有对应的私钥能解。这解决了对称加密的密钥分发问题——你只管把公钥发给我,我用它加密文件,你自己留着私钥解密就好。

常见的算法有 RSA 和 ECC(椭圆曲线)。RSA 密钥长度通常 2048 位或 4096 位,ECC 可以用更短的密钥达到同等安全强度(比如 256 位 ECC 等价于 3072 位 RSA)。

避坑指南: 非对称加密速度很慢,比对称加密慢几百上千倍。千万别直接拿 RSA 加密大文件——我曾经看到一个项目用 RSA 加密每张几百 KB 的图片,结果加密耗时超过 10 秒,用户直接投诉。正确的做法是:用对称加密加密数据,再用非对称加密加密对称密钥(这叫混合加密)。在对象存储场景里,这种方式很常见。

应用场景:数字签名、密钥交换、 的签发与验证。例如,当你调用 Tokenization API 时,服务端可以用私钥对返回的 签名,客户端用公钥验证签名,确保 没有被篡改。

哈希函数:单向不可逆,专治完整性

哈希函数不是加密——它没有密钥,也无法解密。它的使命是:把任意长度的输入,输出成固定长度的摘要(比如 SHA-256 输出 256 位)。而且,哪怕输入只改了一个比特,输出也会面目全非。

算法 输出长度 当前安全状态
MD5 128 位 已破解(2004 年发现碰撞)
SHA-1 160 位 已破解(2017 年 Google 公开碰撞)
SHA-256 256 位 安全(推荐用于当前项目)
SHA-3 可配置 最新标准,但未广泛普及

为什么要讲哈希?因为对象存储需要校验数据完整性。你上传一个大文件,下载回来发现损坏了怎么办?我建议在上传时计算文件的 SHA-256 哈希值,把哈希值存储在元数据里(或者放在 的附加字段里),下载时重新计算并对比——一旦不匹配,说明数据已被篡改或传输出错。

哈希函数的误区: 有人喜欢用哈希“加密”密码,这本身没问题(实际上应该用加盐哈希),但千万别以为哈希可以替代加密。哈希是单向的,你不能还原原文。如果你需要既能加密又能解密,必须用对称或非对称加密。

三种方式的核心对比

为了让你一眼看明白区别,我整理了下表。在 Tokenization 集成对象存储加密中,你会反复用到这三种组合。

维度 对称加密 非对称加密 哈希函数
密钥 单一密钥(共享) 公钥 + 私钥对 无密钥
速度 快(GB/s 级别) 慢(MB/s 级别) 快(取决于输入长度)
是否可逆 可逆(用密钥解密) 可逆(用私钥解密) 不可逆
主要用途 大量数据加密 密钥交换、数字签名 完整性校验、密码存储
常见算法 AES-256-GCM RSA-2048, ECC P-256 SHA-256, SHA-3

三者如何配合?一张图说清楚

下面这张 SVG 图展示了三种加密方式的关系和典型应用。注意,在真实项目里,你往往会同时用到它们:用哈希校验数据完整性,用对称加密加密内容,用非对称加密保护对称密钥。

加密基础:三类核心工具 对称加密 AES-256-GCM 速度极快|密钥共享 非对称加密 RSA / ECC 速度慢|公钥公开 哈希函数 SHA-256 / SHA-3 不可逆|固定输出 典型应用场景 数据加密 → 密钥交换 → 完整性校验(Tokenization + 对象存储)
一点个人经验: 在做 Tokenization 集成时,我习惯先用哈希对原始数据做一次完整性摘要,然后把这个摘要放在 的元数据里,最后用对称加密加密整个 包。这样即使有人破解了对称密钥,也改不了 里的原始指纹。

选型建议与常见错误

  1. 别再用 MD5 和 SHA-1 做安全校验——它们已经不再抗碰撞。我在一次审计中发现某个云存储系统还在用 MD5 校验文件,当时就建议立刻升级到 SHA-256。
  2. 非对称加密的密钥对要妥善保管私钥——最好用 HSM 或密钥管理服务(KMS)。公钥谁都能拿,无所谓,但私钥泄露等于整个加密体系崩塌。
  3. 哈希函数不能用于加密数据——经常看到有人想「哈希加密密码」,这句话的准确表述应该是「加盐哈希存储密码」。如果项目里有需求既要保密又要可逆,请用对称加密,不要试图去「逆向」哈希函数——那是方向性的错误。