第3章 密码学基础:非对称加密与哈希
做渗透测试这么多年,有个事儿我一直记着。有次拿到一个系统的备份文件,想着分析一下用户数据。结果发现密码字段存的是明文。说实话,我当时都愣住了。这都什么年代了,还在用明文存密码?后来我帮他们改造成了加盐哈希,才算是把洞补上了。
你看,密码学这东西,说难不难,说简单也不简单。但我发现很多人其实没搞明白几个核心概念。比如哈希和加密有什么区别?RSA和ECC用哪个好?SHA-1还能不能用?
这一章,咱们就把这些事掰扯清楚。
3.1 非对称加密:为什么需要两把钥匙?
对称加密就像你用一把钥匙锁门,也用同一把钥匙开门。但问题来了——你怎么把这把钥匙安全地交给对方?
非对称加密就是为了解决这个传输问题。它用一对密钥:公钥公开,私钥自己留着。公钥加密的数据只能用私钥解密,反过来私钥签名的数据可以用公钥验证。
我建议你把这个关系记牢了:公钥加密,私钥解密;私钥签名,公钥验证。搞反了,整个系统就废了。
3.2 RSA:老牌选手,但要注意密钥长度
RSA应该是大家最熟悉的非对称加密算法了。它基于大整数分解的数学难题——两个大质数相乘容易,但反过来分解就很难。
我记得最早做渗透测试时,见过一个系统还在用512位的RSA密钥。我用一台普通笔记本,跑了个开源工具,不到一上午就分解了。你能想象那个场景吗?整个系统的安全依托瞬间崩塌。
所以现在行业公认:至少2048位,推荐4096位。1024位已经可以被中等资源攻击者破解了。
| 密钥长度 | 安全状态 | 建议 |
|---|---|---|
| 512位 | 已破解 | 立即弃用 |
| 1024位 | 理论上不安全 | 尽快迁移 |
| 2048位 | 当前安全 | 最低要求 |
| 4096位 | 安全裕度高 | 推荐使用 |
3.3 ECC:用更短的密钥实现更高的安全
ECC(椭圆曲线密码学)这玩意儿,说白了就是用椭圆曲线上的点群运算来实现加密。它最大的优势就是密钥短,性能高。
举个具体的对比:256位的ECC可以提供和3072位RSA相当的安全性。这在移动设备、IoT等资源受限的场景下,优势太明显了。
我在做车联网项目的渗透测试时,就遇到过他们用ECC签名的场景。车载芯片算力有限,如果用RSA做签名,一次操作就要几百毫秒,用户体验极差。换成ECC后,几十毫秒就搞定了。
3.4 哈希:单向的,不是加密
哈希是个容易被误解的概念。很多人管它叫"哈希加密",这是错的。哈希是单向的,不可逆的。你无法从哈希值反推出原文。
哈希的三大特性必须记住:
- 确定性:同一输入,永远输出同一哈希值
- 抗碰撞:很难找到两个不同的输入产生相同的哈希值
- 单向性:从哈希值无法反推出原始输入
你想想看,如果一个哈希实现出了问题,比如MD5已经被找到快速碰撞的方法,那用它来做数字签名或者密码存储,后果有多严重?
3.5 SHA系列:该选哪个?
SHA系列是当前最主流的哈希算法。但版本之间差别不小。
| 算法 | 输出长度 | 安全等级 | 状态 |
|---|---|---|---|
| SHA-1 | 160位 | 已被碰撞攻破 | 强烈建议弃用 |
| SHA-256 | 256位 | 当前安全 | 推荐使用 |
| SHA-384 | 384位 | 高安全 | 用于高等级场景 |
| SHA-512 | 512位 | 高安全 | 性能消耗大 |
| SHA-3 | 可配置 | 最新标准 | 适合新系统 |
3.6 安全边际:不只是密钥长度
安全边际这个概念,我估计很多人理解得片面。你以为只有密钥长度才叫安全边际?
举个例子,你用了4096位的RSA,但你的私钥文件权限是777,任何用户都能读。这不等于把家里的钥匙放在大门口吗?
真正的安全边际,应该从这几个维度衡量:
- 算法强度:当前是否有已知攻击方法,比如MD5已被碰撞,SHA-1也岌岌可危
- 实现质量:代码有没有缓冲区溢出、随机数安全等问题
- 密钥管理:生成、存储、分发、轮换、销毁,每个环节都要安全
- 安全余量:比如当前攻击需要2^80次操作,你的系统应该能承受2^128次操作
我个人习惯在渗透测试中,专门拿一个清单去检查这些维度。只要有一条不合格,这个系统的安全边际就是虚的。
3.7 核心知识体系
下面这张图把非对称加密和哈希的核心关系梳理出来了。我建议你多看几遍,把流程刻在脑子里。
我每次做安全评估,都会把这张图翻出来对一遍。看看每个环节有没有疏漏。你也试试?