大家好!👋 继上次A01:访问控制失效之后,今天我们来聊聊在OWASP Top 10 2021中迅速上升到第二位的A02:加密失败(Cryptographic Failures)。
这个项目以前被称为“敏感数据暴露(Sensitive Data Exposure)”,它强调的不仅仅是数据未加密,更是“不正确”加密的危险性,因此上升到了第二位。您的宝贵信息可能会直接暴露在互联网世界中,这是一个可怕的漏洞,现在就让我们一起来了解一下吧!😱

🤔 加密失败?那到底是什么?
“秘密日记一定要放在带锁的盒子里!” 📦
小时候你是不是也有过这样的想法?加密(Cryptography)正是扮演着这个“锁”的角色。它是一种将重要数据转换为任何人都无法识别的秘密代码(密文)来保护数据的技术。
加密失败指的是所有这些情况:锁不牢固、钥匙随意放置,甚至根本不使用锁。数据主要以两种状态存在,在这两种状态下,锁都是必不可少的。
- 传输中的数据 (Data in Transit) ✈️:
- 数据从您的计算机传输到服务器(例如登录、注册、发布帖子等)
- 此时如果没有加密,中间的某人可能会拦截并窥探数据(中间人攻击)。
- 存储中的数据 (Data at Rest) 💾:
- 数据存储在服务器的数据库或文件系统中。
- 如果黑客完全入侵服务器,未加密的数据将直接被窃取。
🚨 加密失败的常见案例
在什么情况下我们可以说加密“失败”了呢?让我们通过开发者常犯的错误来了解一下。
1. 明文通信 (使用HTTP)
这是最基本但仍然经常发现的错误。
- 问题:HTTP以未加密的明文(Plain Text)传输数据。这就像用透明信封寄信一样,任何监控网络的人都可以窥探内容。👂
- 解决方案:必须使用HTTPS。HTTPS利用TLS/SSL协议加密所有通信内容,安全地保护数据。请务必检查地址栏中是否有锁🔒图标!
2. 明文存储密码
这是绝对不能犯的最糟糕的错误!
- 问题:如果密码(如password123)直接存储在数据库中,一旦数据库泄露,所有用户账户将立即被盗。
- 解决方案:密码必须进行哈希(Hash)处理后存储。哈希与加密不同,它是一种无法还原为原始值的单向函数。
- 升级:为了更安全,应使用加盐(Salt)的哈希。盐(🧂)是添加到密码中的随机字符串,即使使用相同的密码,存储在数据库中的哈希值也会不同,从而抵御彩虹表等攻击。
- password123 + Salt(随机值) -> Hash_Value(完全不同的值)
3. 使用弱或过时的加密算法
并非所有的锁都坚固!老旧脆弱的锁很容易被破坏。
- 问题:MD5、SHA-1等旧的哈希算法或DES、RC4等加密算法已经发现漏洞,很容易被破解。☠️
- 解决方案::必须使用经过验证的最新标准算法。
- 哈希:SHA-256或更高版本,Bcrypt、Scrypt、Argon2
- 加密:AES (Advanced Encryption Standard)
4. 密钥管理不善
这就像保险箱很坚固,但钥匙却放在保险箱上面一样。
- 问题:用于加密的密钥(Key)直接硬编码在源代码中,或以明文形式存储在配置文件中。如果源代码泄露,加密将形同虚设。🔑
- 解决方案:加密密钥应存储在单独的安全存储库(如Key Vault、KMS等)中,并严格管理访问权限。此外,定期轮换密钥(Key Rotation)会更安全。
🛡️ 如何防止? (防御方法)
- 数据分类与识别 📂:首先识别我们服务中哪些数据是敏感的(个人信息、金融信息等),并确定需要保护的数据的优先级。
- 传输加密是基本! 🌐:所有通信都应使用HTTPS,并应用最新版本的TLS设置,以防御中间人攻击。
- 存储数据加密 💾:数据库中存储的所有敏感信息都应使用强大的加密算法(如AES)进行加密。
- 强密码哈希 🧂:密码必须使用Bcrypt、Scrypt、Argon2等最新算法,并添加盐进行哈希处理。
- 安全密钥管理 🗝️:不要将加密密钥放在代码或配置文件中,请使用专用的密钥管理系统。
- 不要重复造轮子 🤓:绝不要尝试自己创建加密算法。使用经过众多专家验证并广泛使用的标准库是最安全、最明智的方法。
✨ 总结
加密是安全的基础,但其效果因“如何”应用而异。“反正加密了就没事”这种想法非常危险。
从今天开始,重新检查一下您处理的数据是否用安全的锁锁好,以及钥匙是否妥善保管在只有您知道的地方,这会怎么样呢?数据安全的第一步始于正确的加密!
发表回复