知识卡片
加密存储要在提高破解成本与登录接口自身被DoS之间权衡
内容
应对账号密码泄漏问题的核心手段是加密存储:不能用明文或安全强度不足的算法(如简单的PBKDF2配置)存储用户密码,而应该给每个用户使用各自独立的随机盐值、并且盐值要和密码分开保存,即使数据库真的发生泄漏,攻击者想要从加密后的密文反推出原始密码,也要为每一条记录单独付出极高的计算成本。但这里有一个容易被忽视的反面代价:像scrypt这类刻意设计成计算成本很高的加密算法,正是靠”算得慢”来提高破解者的成本,可是这个”算得慢”的特性对正常的登录请求同样成立——如果不对用户的登录请求频率加以限制,攻击者完全可以利用这一点,通过发起大量登录请求(而不是真的去破解密文)就能让服务器的计算资源被这些高成本的加密运算耗尽,形成一次拒绝服务攻击(DoS)。这个案例给出一条通用的安全权衡原则:任何”故意提高计算成本”来对抗破解的防御手段,在提升攻击者破解成本的同时,也会成比例地提升正常业务处理这次请求的计算成本,如果不对触发这个高成本运算的入口(这里是登录接口)做限流,这个防御手段本身反而可能被转化为新的攻击面。
参考来源
- 位置:《高可用架构(第1卷)》第7章《安全与网络》"7.5 互联网主要安全威胁分析及应对方案"节,"7.5.2 威胁应对方案","6.加密存储"(源文件:_epub-src/OEBPS/Text/Chapter7_5_3.xhtml)
- 结论依据:原文说明"注意每个用户都需要有不同的盐,且需要和密码分开保存,这样即使发生数据泄漏,也要付出极高的成本来破解,需要注意像scrypt这种算法的计算成本比较高,要控制用户登录频率,如果不控制频率,登录服务器时可能层被DoS攻击",直接支撑本卡片结论。
- 原始内容:需要注意像scrypt这种算法的计算成本比较高,要控制用户登录频率,如果不控制频率,登录服务器时可能层被DoS攻击。