来自计时攻击的一课(或者,不要使用 MessageDigest.isEquals )

仅中文 | 中英文对照 | 仅英文 | 打印此文章
对于某些打算写一个安全的密码系统的人的角度来说,计时攻击相当可怕。它工作原理是依赖于程序员的最佳本能—不要做多余的工作,而这给攻击者得到一个统计101教科书(而这能很好的得到您应用程序的核心)。

这东西是怎么工作的呢?

简言之,一个计时攻击使用一个统计学的分析关于您的应用程序使用多长时间去做某些事情,这样就能知道关于应用程序操作的数据。对HMACs而言,这意味着使用一定数量的值(您的应用程序花掉的时间的值)和一个改定的计算值比较,这样就能得到这个计算值的信息。

瑞新
瑞新
翻译于 4年前
1人顶
顶 翻译得不错哦!
拿 最近Nate Lawson发现的Keyczar 漏洞 来说。他能够通过一个简单的冲突不等式算法(比较一个候选HMAC时间摘要和Keyczar计算时间摘要)破解Keyczar的事实。

这是攻击代码使用Python:

return self.Sign(msg) == sig_bytes
使用Java:

return Arrays.equals(hmac.doFinal(), sigBytes);
如加密计算摘要一样,如果没有字节就马上返回一个值;如果有15个字节,则返回15次比较后的一个值。虽然他们的不同是微秒级别的,但是已经能够得到足够的尝试-这通常容易在web应用程序中整理(有多少伴随错误会话cookies的请求)-随机的噪音会变得非常容易整理,会按照一定的规则分布倾斜,只留下真正的信号。

瑞新
瑞新
翻译于 4年前
1人顶
顶 翻译得不错哦!
这似乎并没有那么糟
但是恰恰相反。

我可以选择一个我想被授权的消息 —它描述的是一个特定用户的会话cookie—然后计算256位可能的值:

0000000000000000000000000000000000000000
0100000000000000000000000000000000000000
0200000000000000000000000000000000000000
... 省略 250 ...
FD00000000000000000000000000000000000000
FE00000000000000000000000000000000000000
FF00000000000000000000000000000000000000
我计算这些值,直到我找到—A100000000000000000000000000000000000000—这个值使用的时间明显比别的使用的时间超过一小部分的微秒值. 然后我马上直到这个消息的HMAC的第一个的字节很大可能A1. 重复这个过程计算余下的19个字节, 然后突然我使用登陆进去了你的账号。

瑞新
瑞新
翻译于 3年前
1人顶
顶 翻译得不错哦!
你不可能进行衡量,你能吗?

现在开始, 大部分人开始思考关于在web应用程序中衡量两个数组的比较的计时发生的几率, 考虑所有的路由, 解析器, 服务器, 代理, 等等.

根据 Crosby et al的 计时攻击的机会和限制:

我们已经证明, 尽管互联网会有很大的时间延迟, 我们还是可以可靠地分辨低至20µs远程时间差异. 如果局域网的话会有更小的时间延迟, 允许我们区分远程时间差异100ns(甚至更小). 时间差异只要有数百或数千次测量就能够更加精确.

瑞新
瑞新
翻译于 3年前
2人顶
顶 翻译得不错哦!
所以.几乎数百微秒就完成了成千上万的计算.谁敢断定网络延迟会变得更差而不是更好?

最糟糕的情况下进行一个HMAC 需要请求20×256×n 计算, 其他n 是计算请求计算需求确认的单个字节的数量. 所以需要 5,000,000倍数的请求. 在每秒10个请求的情况下(几乎难以察觉),你可以不到一个星期就可以完成.

这种攻击方式需要有一些计划和分析, 但是是可行的.

瑞新
瑞新
翻译于 3年前
1人顶
顶 翻译得不错哦!
好了,废话少说,现在怎么做呢?
您可以使用constant-time算法,用来替换variable-time算法比较加密. Lawson 提供了Python的实现如下:

def is_equal(a, b):
    if len(a) != len(b):
        return False

    result = 0
    for x, y in zip(a, b):
        result |= x ^ y
    return result == 0
Java 实现,如下:

public static boolean isEqual(byte[] a, byte[] b) {
    if (a.length != b.length) {
        return false;
    }

    int result = 0;
    for (int i = 0; i < a.length; i++) {
      result |= a[i] ^ b[i]
    }
    return result == 0;}

耶!问题解决了,是吗?
Oh, 如果仅仅是上面这样,那么是的。

检查在最近Java 6.0 Update 15更新的 java.security.MessageDigestas中的代码,如下:

/*   Compares two digests for equality. Does a simple byte compare.     @param digesta one of the digests to compare.     @param digestb the other digest to compare.     @return true if the digests are equal, false otherwise.  */public static boolean isEqual(byte digesta[], byte digestb[]) {
    if (digesta.length != digestb.length)
        return false;

    for (int i = 0; i < digesta.length; i++) {
        if (digesta[i] != digestb[i]) {
            return false;
        }
    }
    return true;}

瑞新
瑞新
翻译于 3年前
1人顶
顶 翻译得不错哦!

等待什么

Yep. 一个字节一个字节的比较;返回第一个不相等的. 但是不是我们需要的.

我在这里直接的说: 任何java程序(通过MessageDigest.isEqualis比较客户端提供数据和加密值比较的) 都是容易受到计时攻击的. 这里包括 HMACs, 解密结果, 等等.

在2009年7月22号,我把向sun提交了这个问题. 就是问题: # 6863503, 由于安全问题,这是不可以公开的.除了包含问题票号的自动回复邮件,我到目前为止没有从sun听到关于这个问题的任何回复. 在我们问题报告中, 我表达了我的意图:我将会遵守 RFPolicy, 内容:

如果维护者在5个工作日内没有和问题发现者进行任何联系, 这个问题发现者将会选择公开这个问题. 维护者负责定期提供状态更新 (关于解决这个问题) 最短每五天一次.

所以我在这里,完全公开在这个最大的编程平台上的一个相当大的漏洞. 如果我不说那就太可怕了.

瑞新
瑞新
翻译于 3年前
1人顶
顶 翻译得不错哦!
长话短说

像上面的例子那样,使用等值时间算法来取代您使用的MessageDigest.isEqual.

每次你比较两个值, 问问你自己: 如果有人知道这两个值,他们可以做什么? 如果答案是有意义的,使用等值时间算法来比较.

附注

如果更多的加密类库能够有更好的封装,这个问题会小的多. 一个HMAC不仅仅是一系列的字符和字节—为什么这么说? 为什么这么关键的加密算法会出现这种情况的纰漏?

谢谢

Nate Lawson的Keyczar促使我思考出怎么计时攻击我自己的代码.他的何时密码攻击 讲述了需要请给每个人查看编译器的请求.

瑞新
瑞新
翻译于 3年前
1人顶
顶 翻译得不错哦!
2009年8月13号更新

sophacles 在 黑客上指出, 我更多的重构推荐的 constant-time 算法, 并且通过返回状态为布尔值的更加简短表达式,介绍更多计时攻击漏洞的细节. 而这个算法的已经通过这次更新解决了.

2009年12月3号更新

关于MessageDigestwas的计时攻击漏洞已经在Java SE 6 Update 17更新中解决。

文章转载自 开源中国社区 [http://www.oschina.net]

时间: 2024-10-29 05:12:43

来自计时攻击的一课(或者,不要使用 MessageDigest.isEquals )的相关文章

肖新光:熊猫的伤痕——几例中国遭遇APT攻击的案例分析

一年一度的阿里安全峰会创立于 2014 年,今年已是第三届,于7月13-14日在北京国家会议中心举办.峰会旨在促进亚太区信息安全行业发展,为本地区信息安全组织.信息安全专业人士和决策者搭建一个信息交流展示平台,探讨当前安全行业的最佳实践.热点议题.信息安全人才培养.新 兴技术与发展趋势等.2016 阿里安全峰会设立12个分论坛,数十家领军企业参与.国内外顶级安全专家演讲,在电商金融安全,移动安全,威胁情报,人才培养,电子取证等热门安全行业问题进行深入探讨与交流,除此之外大会前一天还进行了顶级电商

微软再次向WinXP推送补丁:防止新一轮攻击

据外媒报道,由于上个月的时候勒索病毒WannaCry在全球泛滥,所以微软也针对老版本的Windows XP等系统推出了安全补丁来抵御病毒的侵袭.就在本周,微软再次向Windows XP系统推送了安全补丁.微软目的可能是防范未来大规模的网络黑客攻击. 微软再次向WinXP推送补丁:防止新一轮攻击(图片来自于谷歌) 在微软的官方博客上,他们提到目前很多电脑都有遭受攻击的可能.他们在审核之前所发布的补丁中,发现了若干个漏洞面临来自不同攻击方更严重的安全风险,其中包括政府组织或者假冒名义进行攻击的机构.

美国联邦调查局局长 宣称 FBI 已经非常确定是朝鲜黑客攻击了索尼

摘要: 近日美国联邦调查局局长 James Comey 在出席福特汉姆大学法学院网络论坛时,宣称 FBI 已经非常确定是朝鲜黑客攻击了索尼. 回顾一下整个事件:从索尼遭到黑客攻击后,朝鲜官方否认. 近日美国联邦调查局局长 James Comey 在出席福特汉姆大学法学院网络论坛时,宣称 FBI 已经非常确定是朝鲜黑客攻击了索尼. 回顾一下整个事件:从索尼遭到黑客攻击后,朝鲜官方否认.黑客发布恐怖威胁.FBI表示这事儿真复杂要好好调查.奥巴马强势应对.索尼发律师函要求禁止散播泄密文件.最终到索尼圣

DDOS攻击之互联网安全主要威胁的表现

以下的文章主要向大家介绍的是DDOS攻击之互联网安全的主要威胁,DDoS即是分布式拒绝服务攻击.它是以使被攻击的服务器或者网络不能提供服务.以分布式攻击为手段的网络攻击方式.DDoS以大量的非法数据耗尽网络带宽和服务器资源,由于分布式攻击的源头分布广泛,且攻击时使用伪造的虚假源IP地址,使这种攻击具有危害大.难以追查.难以抵挡的特点.DDoS攻击是互联网面临的主要威胁拒绝服务攻击的英文意思是Denial of Service,简称DoS.从网络攻击的各种方法和所产生的破坏情况 来看,拒绝服务攻击

加盐密码哈希:如何正确使用

如果你是Web开发者你很可能需要开发一个用户账户系统.这个系统最重要的方面就是怎样保护用户的密码.存放帐号的数据库经常成为入侵的目标所以你必须做点什么来保护密码以防网站被攻破时发生危险.最好的办法就是对密码进行加盐哈希这篇文章将介绍它是如何做到这点. 在对密码进行哈希加密的问题上人们有许多争论和误解这大概是由于网络上广泛的误传吧.密码哈希是一件非常简单的事情但是依然有很多人理解错误了.本文阐述的并不是进行密码哈希唯一正确的方法但是会告诉你为什么这样是正确的. 郑重警告如果你在试图编写自己的密码哈

如何判断用户是否访问过某个网址

我们经常有这样的需求:想知道用户之前有没有访问过某个网址.有没有什么方法或技术能实现这一点呢? 初步探索 注意到,在大部分浏览器默认设置里,用户访问过的链接和没访问过的链接颜色是不同的,如下图: 即用户访问过的链接,computed color默认为紫色(或其他在CSS中指定的颜色): 而没访问过的链接,computed color默认为蓝色(或其他在CSS中指定的颜色): 那是不是说,我们可以在页面上加上我们感兴趣的链接,然后用JavaScript取得这些链接文本实际的颜色,即可知道用户是否访

德国银行自动取款机现重大漏洞

研究人员在德国储蓄银行Sparkasse使用的自动取款机中发现信息泄露和硬件错误配置漏洞. 这位研究人员发现,其自动取款机和自助终端在软件升级期间会被诱骗暴露大量敏感信息后,自动开始进行修复升级. 该问题是被德国安全公司"漏洞实验室(Vulnerability Lab)"的首席执行官兼创始人本杰明·昆兹梅吉里发现的.这位研究员当时正在使用一台Sparkasse终端,忽然之间这台机器就将他的银行卡吐出并将状态设置成了"暂时不可用". 与该设备的互动导致屏幕上弹出了一个

PGP的安全问题分析

PGP本身就是一个数据安全产品,它会有什么安全性问题呢?PGP的作者PhilZimmermann在PGP文档中说到:"没有哪个数据安全系统是牢不可破的."PGP也不例外.我们研究它的安全漏洞就是为了让用户知道哪些事会降低PGP的安全性,以及如何避免它们.下面是这些漏洞:口令或私匙的泄密.公匙被篡改.你删除的文件被人恢复.病毒和特洛伊木马.物理安全受到侵犯(物理安全指计算机等物理资源的安全).电磁泄露.暴露在多用户系统中.网络数据流分析,甚至会有可能被直接从密码学分析的角度被解密(这当然

我们为什么需要防火墙

很多网络初级用户认为,只要装了杀毒软件,系统就绝对安全了,这种想法是万万要不得的!在现今的网络安全环境下,木马.病毒肆虐,黑客攻击频繁,而各种流氓软软件.间谍软件也行风作浪.怎样才能让我们的系统立于如此险恶的网络环境呢?光靠杀毒软件足以保证我们的系统安全吗?下面我就从影响系统安全的几个方面来剖析防火墙的重要性. 现在的网络安全威胁主要来自病毒攻击.木马攻击.黑客攻击以及间谍软件攻击.杀毒软件发展了十几年,依然是停留在被动杀毒的层面,而国外的调查表明,当今全球杀毒软件对80%的病毒无法起到识别作用