本文会讲解一些关于keytap工具的技术细节。我也会分享一些自己关于这个项目的几点想法。这个项目已经开源,源码在这里可以下载。
描述
该工具的主要目标是利用敲击键盘时产生的声音作为一种边信道攻击来猜测输入文本的内容。为了达到这个目标,该算法以训练集作为输入,这个训练集包括音频记录和记录期间你敲了哪些键盘按键。通过这些数据,该算法可以学习到不同按键敲击的声音,之后就可以通过捕获的音频来尝试识别敲键盘的声音。训练数据集的收集非常具体,采集收据的根据也就是键盘、麦克风还有两者之间的相对位置。任何因素发生了变化,这个 *** 就变得毫无意义了。不过好在,当前的 *** 可以进行实时预测。
这个 *** 涉及到的主要步骤如下:
· 收集训练数据
· 创建预测模型,不断学习
· 检测到键盘输入
· 预测具体的每一个输入键
收集训练数据
这个收集训练数据的 *** 已经忽略了两次键盘敲击之间的声音。我们只保留实际按键前和按键后75-100ms的音频。这样做可能会有点不太精确,因为键盘敲击的延迟时间是随机的,程序捕获这种事件,也会受到硬件和软件因素的影响。
举个例子,下图是敲击我键盘上的字母“g”的完整声波:
从图中可以看到,在按键峰值之后,还有一个释放按键的峰值。而keytap直接忽略了这个释放峰值。这个可能会提取到额外的信息,不过为了简单起见,释放峰值的这个数据就直接放弃不用了。所以,最终字母“g”这个按键的训练数据声波图如下:
当然,这个75ms的间隙对打字速度有一定的限制,如果在这个时间段内,按键有重叠的话,不同按键的训练数据就会混杂在一起。
从上图中还可以观察到一点就是某个按键的训练声波图越多越好,结合多个声波图,可以帮助减少环境噪音。而且,每个人按键的声音可能稍有不同,这就取决于用户按键的方式了。所以,你可能会捕获到某个按键的不同的声音。
创建预测模型
这时候就体现出人们的非凡创造性了,可以通过机器学习,人工智能和神经 *** 等技术来创建预测模型。不过keytap使用了最简单的一种办法。对于每一个训练按键,我们执行以下3个步骤:
1.对齐收集到的波形峰值。这有助于避免检测按键之前的随机延迟时间,前面解释过了。
2.基于相似性度量来优化声波的对齐方式,因为有时候,声波的峰值并不是更佳指标,所以我们要选择一个更加精确的 *** 。
3.对其波形进行简单加权平均。权重由相似性度量定义。
我们并没有直接跳到步骤2,而是要先执行之一步,因为相似性度量的计算是很吃CPU的。而步骤1已经有效的缩小了对齐的范围并减少了计算量。
步骤3之后,我们最终会得到每个按键的平均波形。之后会将其与捕获到的数据进行对比并预测最有可能的输入按键。
keytap中使用的相似性度量是交叉相关(CC),公式如下:
这里的Ai和Bi是被比较的两种波形的波形样本。CC值越高,波形越相似。当然也可以使用其他的相似性度量的测试 *** 。
不同按键之间间隔的计时信息其实也可以加入到预测模型中,不过我避免了使用这种 *** ,因为它更加难以实现。
检测键盘输入
keytap使用相对简单的阈值技术来检测原始音频中的按键事件。显然,当用户敲击按键时,我们预计会有一个很高的峰值,这也正是我们想要的效果。阈值相对于过去几百毫秒的样本平均强度而言是自适应的。
这个 *** 并不是十分完美,但我现在还不知道更有效的 *** 来检测按键事件。
预测敲了哪些按键
一旦确定了可能的按键事件,我们就可以定位到波形的峰值位置,计算该部分波形与训练数据中所有平均波形的相似性度量。我们允许在峰值附近有小范围的调整(前面提到过)。我们认为相似性度量更高的将对应的是敲击的按键。
几点观察
我注意到即时这个算法没有检测到敲击的正确按键,它仍然能够预测到附近的按键,意思也就是定位到了正确键的下一个键。对于这个现象,我认为有下面两种解释:
1.键盘上相邻的按键发出的声音类似
2.在这个 *** 中,键相对于麦克风的位置对预测起着决定性的作用
我认为之一种解释不太可能,所以很可能是第二种解释。
另外,我还观察到机械键盘比非机械键盘更容易遭受这种键盘窃听攻击。
keytap2
我很笃定肯定有一种实现预测的 *** 是根本不需要收集训练数据的。假如用户使用某种已知语言来输入文本,比如英语,那么关于该语言的N元模型统计信息和按键检测的相似性度量值结合起来就足够检测出输入的文本了。实际上,归根到底这其实就是破解置换密码的一种攻击。
keytap2尝试着去证明这种攻击。我也在做这方面的研究,但是我卡在了基于他们的CC公式对按键进行聚类分析的部分。但我认为至少我已经准备好了置换密码破解工作。如果在实际中破解成功的话,我将会提供更多的细节。
结束语
科学文献上,关于这个主题的论文有很多。其中有一篇论文中的一个特别的 *** 给了我很大的启发,就是Don’t Skype&Type!大家有兴趣的可以看看。但大多数情况下,我都是自己独立解决了问题,没有阅读别人论文中的细节和他们的研究成果,我觉得自己解决问题更有意思,更有挑战性。
老实说,真没想到这篇文章会受到巨大的关注,完全在意料之外。这一切始于我在一篇Hacker News中发布的一条评论,然后被一个著名的开发工程师注意到了。然后,我的Twitter消息就炸了。
不管怎样,希望这篇文章对大家有所帮助,谢谢!
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。