密码学基础:对称加密、非对称加密、哈希函数

做密文检索系统,说白了就是把加密技术用到搜索上。你想想看,如果我们连基础密码都不熟,后面那些高阶玩法根本接不住。这一章我带你过一遍三大核心模块——对称加密、非对称加密、哈希函数。我会结合自己踩过的坑,把每个东西到底怎么用讲明白。

一句话总结:对称加密快,非对称加密安全,哈希函数专治完整性。三者在密文检索里缺一不可。

对称加密

对称加密用同一个密钥加密和解密。速度快,适合大量数据。但问题也很明显——密钥怎么安全地交给对方?

常见算法:

  • AES(Advanced Encryption Standard)—— 当前工业标准,推荐 AES-256
  • DES / 3DES —— 老旧,DES 已被暴力破解,3DES 性能差,别用
  • SM4 —— 国密标准,国内项目常用

我记得有一次做支付接口,对方要求用 AES-256-GCM。我一开始用了 CBC 模式,结果每次解密都要手动处理填充。后来发现 GCM 自带认证标签,还能检测篡改。从那以后,除非特殊需求,我都选 GCM 模式。

避坑:我曾经在项目里图省事用了 ECB 模式。结果密文暴露了明文模式(比如同一个块加密结果相同)。这等于把数据特征直接亮出来。千万不要在生产环境用 ECB,除非你明确知道自己在做什么。

对称加密在密文检索里的作用:直接加密文档内容,然后对密文做倒排索引。但索引本身不能暴露原词,所以需要哈希或特殊加密算法配合。

非对称加密

非对称加密有一对密钥:公钥加密,私钥解密。公钥可以公开,私钥自己死死藏好。优点是解决了密钥分发问题,缺点是计算量比对称加密大几百倍。

常见算法:

  • RSA —— 经典,密钥长度至少 2048 位。加密速度慢,适合加密小段数据(如 AES 密钥)
  • ECC(椭圆曲线加密) —— 更短的密钥达到相同安全强度。256 位 ECC 约等于 3072 位 RSA
  • SM2 —— 国密 ECC 实现,国内政务系统强制要求

你想想看,假如你要把 AES 密钥安全传给对方,直接用 RSA 加密这个密钥行不行?当然行。这就是经典的混合加密体系:用对称加密处理大块数据,用非对称加密交换对称密钥。

在密文检索里,非对称加密常用于密钥管理和权限控制。比如用户用公钥加密检索 ,服务端用私钥解密后验证身份。

特性对称加密非对称加密
密钥数1 个2 个(公私钥对)
速度快(硬件加速可达 Gbps)慢(RSA 2048 加密约 2000 次/秒)
密钥分发困难公钥公开,私钥本地
典型用途大数据量加密密钥协商、数字签名

哈希函数

哈希函数把任意长度输入变成固定长度的“指纹”。它是单向的——从哈希值没法反推原文。碰撞抵抗的意思是,很难找到两个不同输入得到同一个哈希值。

常见算法:

  • SHA-256 —— 目前最通用,安全,NIST 推荐
  • SHA-3 —— 新一代,不是 SHA-2 升级版,是全新结构
  • MD5 / SHA-1 —— 已经能构造碰撞,千万别用

我在某云厂商安全审计时发现,他们后端还在用 MD5 存密码。你猜怎么着?我直接给他们报了高危漏洞。密码存储正确的做法是:bcrypt 或 scrypt 或 Argon2,至少加盐。

关键区别:哈希不是加密。加密是可逆的,哈希不可逆。很多新手把哈希叫“加密”,概念上就是错的。

哈希在密文检索里扮演核心角色。比如我们想对密文做关键词索引,不能直接存明文词,又不能做全文扫描。常见做法是把关键词哈希(或加密)后作为索引项。搜索时对查询词做相同哈希映射,就能定位到包含该词的密文文档。

三者如何协作?

下面这张图展示了它们之间的关系和典型链路。

密码学三大核心与密文检索协作 对称加密 AES / SM4 加密文档内容 非对称加密 RSA / ECC 交换对称密钥 哈希函数 SHA-256 生成索引指纹 密钥分发 数字签名 密文检索索引 哈希索引 + 对称密文 + 非对称权限 加密数据 密钥管理 索引指纹 ⚠️ 实际应用中: 密文检索不会直接用明文关键词,而是将关键词哈希或加密后建立倒排索引。 非对称加密负责密钥分发与用户权限认证,让系统安全可控。
核心链路:对称加密保证文档机密性 → 哈希函数生成可搜索的索引指纹 → 非对称加密保证密钥交换和身份验证。三者握拳才能打好密文检索的地基。

避坑汇总

  • 不要自己造加密算法,用标准库。我见过一个前辈手写了个“异或加密”,上线第一周就被攻破。
  • 对称加密的初始向量(IV)必须随机,且每次加密不同。固定 IV 会导致相同明文得到相同密文,特征泄露。
  • 非对称加密不要用来加密大文件,性能撑不住。正确的做法是:用对称密钥加密文件,再用非对称加密保护这个密钥。
  • 哈希算法要注意长度扩展攻击(如 SHA-256 在特定场景下有风险),密钥哈希建议用 HMAC。
  • 密码存储一定要加盐,并使用慢哈希算法(bcrypt、argon2)。
我的个人习惯:在涉及密文检索的项目中,我会先把文档用 AES-256-GCM 加密,然后用 SHA-256 对关键词做哈希,再将哈希—文档 ID 映射存入倒排索引。整个密钥用 RSA 或 ECC 保护。这样每一步都有对应安全措施,出问题也容易定位。

好了,这一章我们把密码学三大组件讲透了。接下来的章节会基于这个基础,一步步搭建可落地的密文检索接口。别急,先把这些概念记牢,代码里才不会翻车。