Honeywords:Making password cracking detectable

《Honeywords: Making Password-Cracking Detectable》论文阅读笔记(CCS 2013)

这是一篇工程向的文章

摘要

  • 提出一个简单的方法来提高散列密码的安全性:维护与每个用户帐户相关的附加“蜜罐密码”
  • 窃取散列密码文件并反转散列函数的攻击者无法判断他是否找到了密码或蜜罐密码。试图使用蜜罐密码登录会引发警报
  • 设计一个辅助服务器(即“蜜罐密码检查器”),区分登录程序的用户密码和蜜罐密码,并在提交蜜罐密码时发出警报

介绍

  • 密码是弱身份验证机制,用户经常选择糟糕的密码
  • 保护方法之一是让使密码的哈希更加复杂和耗时,但这会减慢合法用户的身份验证过程
  • 此外,管理员有时会设置虚假的用户帐户(“蜜罐帐户”),当攻击者通过反转被盗密码文件中的散列来试图登录蜜罐账户时,会发出警报。但攻击者可能能够区分真实的用户名和虚假的用户名,从而避免警报
  • 本文将这一基本思想扩展到用户(即包括合法账户),即每个账户有多个可能的密码,其中只有一个是真实的,其他的称之为“蜜罐密码”(下文称为蜜语)。试图使用蜜语登录会触发警报
  • 这种方法并不十分深入,但它应该相当有效,因为它会提高攻击者被检测到的风险
  • 不确定这种方法是否是新的,但还没有看到任何文献描述完全相同的方案

技术说明

上下文

  • 假设一个计算机系统有n个用户,系统维护一个文件F,内为用户名+密码散列对的列表:$(u_i, H(p_i))$

    • Unix系统中,F可能是/etc/passwd或/etc/shadow
  • 用户尝试登录时,F检查密码的散列是否存在于相应的账户内

攻击场景

  • 窃取密码哈希文件:攻击者能够以某种方式窃取密码哈希文件,并使用离线暴力计算来破解。攻击者可能在许多系统上或者在不同的时间的同一个系统上窃取密码散列文件
  • 易于猜测的密码:相当一部分用户选择的密码非常糟糕,以至于对手可以通过尝试使用通用密码登录来成功冒充系统的至少一些用户
  • 可见密码:攻击者看到了用户输入的密码,或者看到用户记录密码的媒介
  • 许多系统或服务使用相同的密码:用户可能在许多系统上使用相同的密码,如果他的密码在一个系统上被破解,那么在其他系统上也会被破解
  • 从用户处窃取的密码:攻击者可能会通过危及终端设备、使用恶意软件或对用户实施网络钓鱼攻击来获取用户密码
  • 破坏密码更改机制:允许用户更改或恢复其密码的机制有缺陷或被破坏,此时攻击者可以直接获得用户的新密码,或将其重设为已知值
  • 本文重点考虑第一个攻击场景:攻击者获得了文件F的副本,并获得了计算散列函数所需的salt或其他参数

蜜罐检查器Honeychecker

  • 该系统可以利用一个名为“蜜罐检查器”的辅助安全服务器来帮助使用蜜语
  • 蜜罐检查器是一个独立的加固计算机系统,可以存储这些秘密信息
  • 本文假设
    • 当在计算机系统上进行登录尝试时,或者当用户更改密码时,计算机系统可以与蜜罐检查器通信
    • 这种通信是通过专用线路和/或加密和认证的
    • 蜜罐检测器应该有广泛的工具来检测各种异常
    • 当检测到异常时,蜜罐检测器能够发出警报,警报信号可以发送给管理员或不同于计算机系统本身的其他方,并拒绝登录
  • 蜜罐检查器每个用户维护一个单独的数据库值$c(i)$;值为一些小整数参数,范围为1到k(例如k=20)
  • 蜜罐检查器只接受两种类型的命令:
    • Set:i,j:将$c(i)$设置为j
    • Check:i,j:确认$c(i)=j$,确认失败则发出警报
  • 设计原则:
    • 在最坏的情况下,蜜罐数据库的泄露只会将安全性降低到引入蜜罐之前的水平——此时只需要破解用户的实际密码,因为攻击者现在知道哪些哈希值是真正的密码,哪些哈希值是蜜语
    • 蜜罐可以结合到现有的密码系统中,几乎不需要改变系统,计算和通信开销也很小
    • 蜜罐可以是一个产品,使用一个标准化的接口

建立蜜罐密码

  • 每个用户$u_i$的界面都有一个不同的单词列表$W_i$——潜在密码

    image-20211029163232767

  • 其中一条潜在密码是用户的真实密码“sugarword”,其他密码为蜜语“honeyword”

  • 用户不需要记住蜜语

  • 令$Gen(k)$表示为用户生成长度为k的蜜语列表,以及正确密码的索引$c(i)$的过程

  • 如果有加盐运算,则其散列运算中也加入一个额外的参数

登录

  • 区分用户错误输入密码,以及攻击者输入蜜语的情况

更改密码

  • $Gen(k)$生成新的$W_i$
  • 安全地将新的$c(i)$发送给蜜罐检查器,更新数据库

安全定义

  • 定义一个$Gen$算法的安全性

蜜语的生成

  • 提出了几个生成程序,用于构建一个甜言蜜语列表,并在该列表中选择实际密码的索引
  • 根据密码更改对用户界面是否有影响,分为两个大类

传统用户界面程序

  • UI让用户来连续两次输入密码,而不告知用户使用了什么蜜语,也不会互动,避免影响其密码选择
  • 用户提供密码后,系统生成一组与用户密码的“风格相似”的蜜语(此过程也称为干扰chaffing)

调整字符(Chaffing by tweaking)

  • 对密码选定的字符位置做调整,以获取蜜语——每个选定位置的字符被替换为同一种字符,数字被数字替换,字母被字母替换
  • 或者替换最后的几个字母、最后的几个数字
  • 或者将密码解析为密码头+密码尾(解析过程可以简化为,选择前几个字符为密码头,剩下的为密码尾),随机地转换密码尾的字符

Chaffing with a password model

  • 使用真实密码的概率模型来生成蜜语
  • 例如,原始密码为mice3blind,将其根据pcfg切分后,替换相应的模板为gold5rings,后者即为蜜语

更改用户界面程序

  • 利用修改后的用户界面来更改密码,此时的UI只是传统UI的变体

    image-20211029180621366

  • 此时密码的头部为自己选择,密码尾为系统生成

变体和扩展

  • 一些生成蜜语的其他方法和一些实际的部署注意事项

“随机挑选”的蜜语生成

  • 用户给系统提供潜在密码,由系统随机选择一个密码,告知用户此密码为真实密码,其他作为蜜语存储

Typo-safety

  • 希望合法用户很少因为不小心输入了一个蜜语而触发警报
  • 让密码尾部与蜜语尾部有很大的不同,此时键入错误不会将密码变成蜜语
  • 可以使用错误检测的代码,来检测错别字

管理旧密码

  • 许多密码系统,特别是针对政府和行业用户的密码系统,会存储用户旧密码的散列——通常是最后10个
  • 本文认为,一个系统不应该存储旧的密码或它们的散列,而是记录所有用户以前使用过的密码,如果新创建的密码与此列表中的任何密码冲突,则拒绝更新密码
  • 该列表不应由显式散列的密码组成,而应以更紧凑、更有效的可检查数据结构表示,如布隆过滤器

存储优化

混合生成方法

  • 将不同的蜜语生成策略组合成一个“混合”方案

政策选择

  • 有些单词可能不符合密码条件,因为它们违反了一项或多项有关资格的政策
  • 计算机系统可以被设计为具有“故障转移”模式,这样即使蜜罐检查器出现故障或变得不可访问,登录也可以照常进行
  • 设置策略,以区分不同用户

攻击

  • 回顾了针对本文方法的各种可能的攻击

总结