MAC-then-Encrypt:计算明文上的MAC,将其附加到数据上,然后再对整体进行加密? (这就是TLS的作用)
加密并MAC:在明文上计算MAC,加密明文,然后在密文末尾附加MAC? (这就是SSH所做的事情)
先加密然后加密MAC:先加密明文,然后在密文上计算MAC,然后将其附加到密文上? (在这种情况下,我们不要忘记在MACed数据中包含初始化向量(IV)和加密方法标识符。)
前两个选项通常称为“ MAC-then-encrypt”而第三个是“ encrypt-then-MAC”。支持或反对的理由是什么?
#1 楼
我假设您实际上比我更了解所有这些。无论如何,本文巧妙地总结了所有这些方法以及它们提供或不提供的安全级别。按照我的理解,我将用英语而不是数学符号来解释它。加密-MAC- >提供密文的完整性。假设MAC共享密钥没有受到损害,我们应该能够推断出给定的密文是确实是真实的还是已经伪造的;例如,在公开密钥加密中,任何人都可以向您发送消息。 EtM确保您只读取有效的消息。
纯文本完整性。
如果密码方案具有可扩展性,则不必担心,因为MAC会过滤掉无效的密码文本。
MAC不提供明文中的任何信息,因为假设密码的输出是随机的,则MAC也是如此。换句话说,从明文到MAC,我们没有任何结构。
MAC-then-Encrypt:
在密文上不提供任何完整性,因为在解密消息之前,我们是不知道的,它是否确实是真实的或欺骗性的。
纯文本完整性。可以将消息更改为看起来有效并具有有效的MAC。当然,这是一个理论上的观点,因为从实践上讲,MAC机密应该提供保护。
在这里,MAC也不能在明文上提供任何信息,因为它是加密的。
Encrypt-and-MAC:
再次没有密文完整性,因为MAC是针对明文的。这就打开了对密码进行某些选择的密文攻击的大门,如“破解并证明修复SSH认证的加密方案:第4部分:加密然后加密和MAC范式的案例研究”第4部分所示。明文的完整性可以得到验证
如果密码方案是可延展的,则可以很好地更改密文的内容,但是在解密时,我们应该发现明文是无效的。当然,到那时为止,解密过程中可以利用的任何实现错误都已经存在。
可能会泄露有关MAC中明文的信息。理论上当然可以,但是不理想。如果重复了纯文本消息,并且MACed数据不包含计数器(在SSH 2协议中,但仅作为32位计数器,则会发生这种情况,因此,在溢出之前,请务必小心地重新设置密钥)。简而言之,Encrypt-then-MAC是最理想的方案。对密文的任何修改,如果它们也没有有效的MAC,则可以在解密之前将其过滤掉,从而防止对实现的任何攻击。 MAC也不能用于推断有关纯文本的任何内容。 MAC-then-Encrypt和Encrypt-and-MAC都提供不同级别的安全性,但不能提供Encrypt-then-MAC提供的完整安全性。
评论
$ \ begingroup $
请同时注意托马斯的答案中的“ padding oracle Attack”。
$ \ endgroup $
–马腾·博德威斯♦
11年11月29日在20:55
$ \ begingroup $
供个人/将来参考:Encrypt-then-MAC =加密明文,MAC为密文+ iv,然后将其附加到密文中。 MAC-then-Encrypt = MAC明文,然后将MAC附加到明文,然后全部加密。 Encrypt-and-MAC =加密并加密明文,然后将MAC附加到密文上。
$ \ endgroup $
– MD Kieran
13年6月25日在21:23
$ \ begingroup $
您能否对crypto.stackexchange.com/questions/5458/…发表评论?它似乎是密切相关的,但是答案却截然相反。
$ \ endgroup $
–Clément
2014年3月24日12:42
$ \ begingroup $
@clement很好,虽然我不认为您会使用Mac进行身份验证...但是肯定有一些人不同意crypto-then-mac是最佳解决方案,他们的观点是也非常非常有效。
$ \ endgroup $
–user46
2014年3月30日19:21
$ \ begingroup $
@Clément我可以通过一个单独的问题来解释差异,请参阅crypto.stackexchange.com/q/15485/46-随时在此处进行澄清:)
$ \ endgroup $
–user46
2014年4月9日在9:18
#2 楼
@Ninefingers很好地回答了这个问题;我只想添加一些细节。Encrypt-then-MAC是大多数研究人员推荐的模式。通常,它可以更轻松地证明加密部分的安全性(由于使用了MAC,解密引擎无法获得无效的密文;这可以对选定的密文攻击提供自动保护),还可以避免来自MAC的机密性问题(由于MAC对加密的文本进行操作,因此无论其质量如何,它都无法显示有关纯文本的任何内容)。请注意,已在本领域应用到ASP.NET的padding oracle攻击是选择的密文攻击。 then-encrypt(或MAC-and-encrypt)是“自然”的顺序,那么,那么then-en-MAC过于复杂。加密-然后-MAC的痛点是,您必须注意自己的MAC:不要忘记初始化向量,或者(如果协议允许算法灵活性)加密算法的唯一标识符;否则,攻击者可能会改变其中之一,从而导致MAC无法检测到的纯文本更改。为了证明他们的观点,Ferguson和Schneier描述了对IPsec实例的攻击,在该实例中,加密然后MAC没有正确完成。
因此,从理论上讲,加密然后MAC更好,也很难正确。
评论
$ \ begingroup $
它实际上取决于应用程序的优先级,但是:)每当身份验证是关键点时,都应使用AtE,而当机密性至关重要时,则应使用EtA :)即每当涉及安全性和保障性时,就选择AtE,而当涉及保密性和安全性时,就寻求EtA :)
$ \ endgroup $
– Yeoman
16-10-30在20:31
$ \ begingroup $
绝对不要考虑将相同的密钥用于A&E😬
$ \ endgroup $
– Yeoman
16-10-30在20:51
$ \ begingroup $
“您一定不要忘记初始化向量,或者...加密算法的明确标识符” –在实现时,我想到必须注意如何做到这一点:组合二进制字符串必须是唯一的(即映射单射)!如果多个组件的长度可变,则二进制字符串的普通串联可能不具有此属性。我选择了ASN-DER。
$ \ endgroup $
–拉斐尔
17年7月13日在15:05
$ \ begingroup $
因此,总而言之,零日偏执狂会使用mac-encrypt-mac。甚至crypto-mac-encrypt-mac。
$ \ endgroup $
–起搏器
17-10-24在8:37
$ \ begingroup $
另外,Schneier等人。提到霍顿原理...您可以MAC加密密文,但是没有人可以保证它将使用正确的密钥解密,或者原始消息是解密后获得的,正是它所产生的原始消息
$ \ endgroup $
–user1156544
19年4月19日在21:47
#3 楼
Hugo Krawczyk发表了一篇题为《保护通信的加密和身份验证顺序》(或:SSL的安全性如何?)的论文。它确定了将身份验证(MAC)与加密结合起来的三种类型: IPsec中使用的先加密然后认证(EtA);
SSL中使用的先加密然后认证(AtE);
SSH中使用的先加密然后认证(E&A)。
证明EtA是一种安全的使用方式,除非加密方法是处于CBC模式或流密码,否则AtE和E&A都将受到攻击。我通过用粗体字强调了重要部分:
我们研究在构建“安全通道”以保护不安全网络上的通信时,如何一般地组成对称加密和身份验证的问题。我们表明,旨在与安全加密(针对选定的纯文本攻击)和安全MAC的任意组合一起使用的任何安全通道协议都必须使用crypto-then-authenticate方法。我们通过证明构成加密和身份验证的其他常见方法(包括SSL中使用的authenticate-then-encrypt方法)并不普遍安全来证明这一点。我们以一个提供(Shannon)完美保密性的加密功能为例,但是在authenticate-then-encrypt方法下与任何MAC功能结合使用时,会产生一个完全不安全的协议(例如,找到受密码保护的传输密码或信用卡号)对于主动攻击者而言,这样的协议变得容易。 SSH中使用的加密和认证方法也是如此。
从积极的方面来看,如果所使用的加密方法是CBC模式(具有基础安全块密码)或流密码(使用随机或伪随机填充对数据进行异或),则Authenticate-then-encrypt方法是安全的。 。因此,尽管我们证明了SSL的通用安全性已被破坏,但是使用上述加密模式的协议的当前实际实现是安全的。
评论
$ \ begingroup $
在在线协议中进行身份验证之前,CBC解密是安全的吗?填充oracle攻击怎么办?还是他们明确指定在取消填充之前需要在最后一个块中验证MAC?
$ \ endgroup $
–马腾·博德威斯♦
11年11月29日在21:04
$ \ begingroup $
请注意,OpenSSH现在也支持E-t-M模式(可以通过限制hmacs进行选择):stribika.github.io/2015/01/04/secure-secure-shell.html
$ \ endgroup $
–eckes
2015年1月6日17:00
$ \ begingroup $
不过,该列表并不详尽,有些密码模式提供了经过身份验证的加密,即不需要单独的哈希算法(例如Galois / Counter模式)。我想出了几种自己的方案,但这仍然是早期的实验。其中之一例如称为多遍CBC(在标准密码轮次之间循环应用CBC多次),它似乎不仅可以抵抗对相同密钥CBC-MAC的攻击,还可以填充oracle攻击,但是对于大消息则不切实际。我要等一段时间才能发布。
$ \ endgroup $
– Arne Vogel
19年6月20日在14:56
$ \ begingroup $
@ArneVogel:当然还有其他可能性。然而,OP正在询问组合加密和MAC的顺序。
$ \ endgroup $
– M.S.杜斯蒂
19年6月21日在11:07
#4 楼
尽管这里已经有很多答案,但我还是强烈建议再次反对MAC-then-encrypt。我完全同意托马斯回答的上半部分,但完全不同意后半部分。密文是整个密文(包括IV等),这是必须MAC的内容。这是可以实现的。通过“直截了当的方式”,我的意思是,您称为“解密”功能,然后称为“ mac验证”。但是,如果在解密函数中出现错误,则立即将其作为填充错误返回。现在,您刚刚获得了一次完整的填充oracle攻击,您已经死了。现在,您可以修改API并仅给出一条错误消息,但是无论是MAC错误还是填充错误,返回错误所需的时间必须相同。如果您认为这很容易,请查看针对SSL的Lucky13攻击。这确实真的非常困难(而且不仅仅将所有密文都进行MAC传输也要困难得多)。经过身份验证的加密的定义由“加密然后MAC”来满足,而“ MAC然后没有加密”则不被满足。此外,MAC-then-encrypt的大多数实现实际上完全容易遭受填充oracle攻击,因此实际上在实践中被破坏了。不要这样做!以上已经说了所有,我的建议是不要使用其中任何一个。您今天应该使用GCM或CCM(GCM速度要快得多,因此,只要您确定IV不会重复,就可以使用它)。结合了身份验证加密方案和一个API调用,现在您将不会遇到麻烦。
评论
$ \ begingroup $
提倡不使用MAC-then-encrypt,然后建议使用CCM,它恰好是MAC-then-encrypt方案。这不是矛盾吗?
$ \ endgroup $
–耿鹏和
16 Sep 26 '17:08
$ \ begingroup $
CCM是一种加密模式,具有独立的安全性证明,这与MAC-then-encrypt有所区别。它不应该具有MAC-then-encrypt的陷阱。可能出现的唯一问题是实施不正确。我当然愿意承认,在这样的模式下执行错误的可能性更大,但随后所有事情都可能执行不正确,因此我不确定这应该是一个因素。
$ \ endgroup $
–耶胡达·林德尔(Yehuda Lindell)
16-09-27在0:08
$ \ begingroup $
IV相关问题:如果使用不使用IV的模式(如CTR),则应以某种方式在MAC计算中使用“ nonce”,还是在这种情况下仅从纯文本进行计算?
$ \ endgroup $
– Jolinar
18年8月11日在11:53
$ \ begingroup $
计数器或IV必须包含在MAC中。它是密文的一部分。
$ \ endgroup $
–耶胡达·林德尔(Yehuda Lindell)
18年8月12日在3:31
$ \ begingroup $
如果IV / nonce是从盐(和使用KDF的密码)派生的,那么MAC应该是什么部分?盐,衍生的IV,两者,还是没关系?谢谢
$ \ endgroup $
– Jolinar
18年8月12日在20:11
#5 楼
Moxie Marlinspike在他的文章http://www.thoughtcrime.org/blog/the-cryptographic-doom-principle/厄运原理中称其为:如果必须执行任何加密操作在验证收到的消息上的MAC之前进行操作,将不可避免地导致
毁灭。
他还演示了两次攻击,这可能是因为在检查MAC之前尝试解密的方法。
总结:“先加密然后进行身份验证”是解决方法。
评论
$ \ begingroup $
照原样,我很难找到理由支持该答案,因为您的答案接近仅链接的答案。您能详细说明一下您所引用的内容吗?例如:您能否解释“为什么”在验证身份之前能够对消息进行解密是一个问题,以及为什么Moxie表示如果您先进行MAC然后加密,则消息“将不可避免地导致厄运”?这肯定会使您的答案更有价值……毕竟,问题显然是在问“支持或反对的理由是什么?”我真的看不到您提供论据。相反,您仅指向并引用一个站点。
$ \ endgroup $
– e-sushi
2014年4月3日在10:49
$ \ begingroup $
@ e-sushi同意-仍然是这是对该主题最好的治疗方法之一。
$ \ endgroup $
–user2398029
2014年4月8日,0:51
$ \ begingroup $
值得注意的是,无论以后是否对MAC进行加密,该原理都将MAC排除在明文之外。该原理本身很直观,因为您越早可以丢弃带有无效MAC的消息,针对损坏的输入所针对的代码就越少。人们不必陷入这样的陷阱,即仅仅因为该消息带有有效的MAC,就不可能利用它来利用缓冲区溢出或其他漏洞。
$ \ endgroup $
–卡巴斯德
2014年8月12日20:21在
#6 楼
我认为Encrypt-then-MAC不能提供纯文本完整性,而只能提供密文完整性。如果密文上的MAC正常,但我们使用错误的密钥解密(出于某种原因),则接收方将收到发送方未发送且未提供担保的明文。如果发生这种情况,那就是违反了纯文本完整性。在检查MAC完全正确之后,对密文执行的其他处理/解码。这是Encrypt-then-MAC的一个比较脆弱的方面,也是Ferguson和Schneier提倡反对Encrypt-then-MAC的原因之一。评论
$ \ begingroup $
我编辑了答案,以更清楚地表达约瑟夫想表达的观点。就个人而言,我认为答案很好(我赞成)。
$ \ endgroup $
– D.W.
2014年4月5日在1:08
$ \ begingroup $
我将在下面回应,但是使用错误密钥解密的威胁确实很奇怪。如果我使用错误的密钥验证了MAC,那么它也会被破坏并被拒绝。当然应该使用Encrypt-then-MAC。
$ \ endgroup $
–耶胡达·林德尔(Yehuda Lindell)
15年7月1日在16:16
$ \ begingroup $
@YehudaLindell,最偏执的仍然是mac-encrypt-mac
$ \ endgroup $
–起搏器
17-10-24在8:07
#7 楼
真正重要的是,不是加密和mac。您可以辩论另外两个,但至少在理论上都是合理的-一个实际上可能比另一个更好。但是,“加密和MAC”由于一个非常简单的原因而破裂:MAC并不是要保留明文的秘密。MAC是基于明文的。身份验证的目的不是掩盖明文。因此,MAC提供了一些有关用于创建明文的明文的信息。如果我们有一个9位数字的明文和一个1位的校验和,并以加密的前9位数字发送它,但没有校验和,则校验和将帮助我了解有关明文的前9位数字的知识。如果我能以某种方式找出九位数中的八位数,则可以使用校验和找出最后一位是什么。该校验和可能还有很多其他事情,破坏了前九位数字的完整性。否则,不管怎么说,你很好。
评论
$ \ begingroup $
“ MAC并不意味着保留明文的完整性”也将是避免MAC再加密的一个很好的理由。 $ \; $
$ \ endgroup $
–user991
2014年12月4日下午4:13
$ \ begingroup $
否-因为MAC和纯文本均已加密。解密密文后,就不必再担心完整性了,而是解密了它。
$ \ endgroup $
–丹尼尔(Daniel)
2014年12月4日下午4:15
$ \ begingroup $
...是的,否则,这些结构都将毫无意义。 $ \; $
$ \ endgroup $
–user991
2014年12月4日下午4:53
$ \ begingroup $
我怀疑您的意思是“机密”。 $ \; $
$ \ endgroup $
–user991
2014年12月6日下午5:07
$ \ begingroup $
@Pacerier-如果操作正确,是的。 “ Encrypt-and-mac”是一种愚蠢的策略,即对明文进行加密,对明文进行mac'处理,然后将明文mac置于密文的末尾。
$ \ endgroup $
–丹尼尔(Daniel)
17年3月3日在17:59
#8 楼
MAC没有属性,该属性规定不应泄露有关输入的信息。因此,您应该先加密消息,然后再应用MAC。这样,即使MAC泄漏了信息,泄漏的也是密文。评论
$ \ begingroup $
或者先加密再加密,这样MAC不会泄漏信息,因为任何攻击者都无法读取。
$ \ endgroup $
–丹尼尔(Daniel)
2014年12月4日下午4:09
$ \ begingroup $
@Daniel,那么您如何处理Moxie的DOOM原则?
$ \ endgroup $
–起搏器
17-10-24在8:11
#9 楼
除了许多其他答案提到的先加密然后再加密(MAC)的安全性优势之外,还有性能优势。首先在接收端检查MAC,可以拒绝伪造的邮件,而无需进行解密工作。伯恩斯坦(Bernstein)在http://cr.yp.to/snuffle/design.pdf中提到了这一点(在“流应独立于明文吗?”部分中)。评论
$ \ begingroup $
如此巨大的性能提升,因为绝大多数消息将是正确的消息,并且无论如何都要经过两个步骤,恕我直言,这一好处几乎可以忽略不计。
$ \ endgroup $
–耿鹏和
16-09-26在17:14
$ \ begingroup $
@xiaobai我认为这个主意是,在某些(特殊情况下)情况下,攻击者(稍微)很难使DOS DOS。在DOS攻击中,泛洪您的服务器的所有数据包可能均无法通过身份验证,并且服务器丢弃它们的速率可能很重要。
$ \ endgroup $
–杰克·奥康纳(Jack O'Connor)
16-9-28 at 3:53
$ \ begingroup $
请注意,如果crypto-mac本身不安全,则“性能优势”将无关紧要。
$ \ endgroup $
–起搏器
17-10-24在8:41
#10 楼
如果您看一下Moses Liskov,Ronald L.Rivest和David Wagner撰写的论文“可调整的块密码”,该论文发表在“加密技术的进展-加密2002,论文集” 2442,第4.3节“可调整的认证加密(TAE)”中,则MAC计算纯文本,附加到纯文本,并与纯文本一起加密。然后,他们提供了定理3的证明“如果E是安全的可调整块密码,则在TAE模式下使用的E将不可伪造且是伪随机的”。#11 楼
为了提供消息完整性,使用了哈希或消息身份验证功能(MAC)。有时,加密和完整性可以一起使用,例如:加密-然后-MAC:提供密文完整性,但不提供纯文本完整性, :提供纯文本完整性,但不提供密文完整性。
加密和MAC:提供纯文本完整性,但不提供
密文完整性。
这是最安全的模式,因为可以使用有效的MAC代码在解密之前过滤出密文的所有更改,从而保护消息免受任何修改攻击。但是,加密和MAC的组合,例如Galois / Counter Mode(GCM):将加密的计数器模式与Galois身份验证模式结合,或Counter with Cipher Block Chaining(CBC)-MAC(CCM):将CBC-MAC与出于安全考虑,首选
加密的计数器模式。
评论
$ \ begingroup $
关于“但没有明文完整性”,密文完整性不是断言明文完整性吗?
$ \ endgroup $
–起搏器
17-10-24在8:45
#12 楼
在许多应用程序中,仅部分数据(m
)被加密,而某些所谓的附加身份验证数据(AAD,通常包括一些随机数的标头数据)a
仅经过身份验证,但未加密。 这是我的论点:使用AAD时,Authentication-then-Encryption比Encryption-then-Authentication提供了对AAD的另一层保护,因此有人可能会认为在某些用法中它可能更安全。 。
使用AAD
a
时,如果我们使用Encryption-then-Authentication,则将得到:E(m)+ A(a + E(m))
for scheme,这意味着我们首先加密
m
,然后将其与a串联,然后对结果进行加密。请注意,a
是如何仅由一层加密操作(即MAC操作A
)保护的。 + A(a + m)),这意味着我们首先加密级联的
a
和m
,然后将生成的MAC代码与m
进行级联,然后进行加密。请注意,a
受到A
和E
两层加密操作的有效保护。现在假定身份验证方法已被破坏,并且加密没有被破解,由于某些MAC算法,这并不是那么牵强(例如HMAC-MD5)确实被发现很弱,那么当使用Encryption-then-Authentication时,
a
将完全受到篡改。对于身份验证然后加密,不能说相同。2016年9月27日更新:
我同意某些多次使用密码并不总是可以提高安全性,因此我撤回了该声明。但这实际上与我的主要目的无关,因为AtE提供了额外的安全层,因为在这些A / E方案中我们没有两次将相同的密码应用于相同的数据。
评论
$ \ begingroup $
我们使用3DES而不是2DES的理由很充分,您不认为吗?而且,如果AES损坏了,您是否认为我们会放弃使用的任何一种加密方案的机密性(在每个必须重新设计的加密设备中)?
$ \ endgroup $
–马腾·博德威斯♦
16-09-26在20:35
$ \ begingroup $
“如果我们同意多次使用密码要比一次安全得多” –密码学家对此并不认同。最多可以增加密钥的强度,但这仅是密钥大小成为问题的问题(例如DES的56位)。 AES至少使用128位,因此密钥大小不是问题。 (可能是量子计算提供了,但是我们只需要切换到256位密钥即可。)您的答案中是否有任何内容不取决于多重加密是一件好事的无效论点?
$ \ endgroup $
–吉尔斯'所以-不再是邪恶的'
16-09-26在20:52
$ \ begingroup $
@MaartenBodewes那个原因不适用于密钥足够大的算法,从而使蛮力攻击不可行,您只需要使用双重加密来增加有效回合数,以使其对密码分析的抵抗力更大。
$ \ endgroup $
– CodesInChaos
16-09-26在20:54
$ \ begingroup $
@CodesInChaos是的,只有当吉尔斯(Gilles)将该答案不正确的原因不适用时,我才能使该答案无效。不幸的是,有两个错误。
$ \ endgroup $
–马腾·博德威斯♦
16-09-26在21:59
$ \ begingroup $
@MaartenBodewes关键安全系统需要考虑最坏的情况,以及该系统是否具有正常的降级而不是完全的灾难。如果AES被破坏,是的,我们将失去机密性,但是如果我们仍然可以保留身份验证,那总比没有好。对于许多应用程序,身份验证实际上比机密性更为重要。
$ \ endgroup $
–耿鹏和
16-9-27在14:59
#13 楼
阅读所有这些内容后,我认为最好的解决方案是:MAC-then-Encrypt-then-MAC
同时提供纯文本和密文的保证。
我完全同意,两者都是重要的:
如果您的纯文本不是结构化的,并且不允许在没有MAC的情况下确认其完整性,MAC-then-Encrypt
出于其他答案中提供的原因,先加密然后再添加MAC,尤其是避免解密不良数据
评论
$ \ begingroup $
你能证明-1为正吗?
$ \ endgroup $
– lalebarde
19年2月8日在17:00
$ \ begingroup $
这是结论性的。如果不推荐,最好知道原因。
$ \ endgroup $
– rundekugel
20/11/23在15:47
评论
我听说过第二种方法,通常称为“加密和mac”。我对这个问题似乎与crypto.stackexchange.com/questions/5458 / ...高度相关这一事实感到困惑,但答案却截然相反...
@声明:混淆来自于普遍的(但错误的)习惯,称MAC为“签名”。实际上,MAC和签名是在非常不同的上下文中使用的非常不同的事物。 Sign-then-encrypt协议还为每个消息使用不同的加密密钥,从而使所有填充oracle攻击无效。并且签名应作为证明(例如在试验中),因此必须将其应用于纯文本消息。在MAC + encrypt上下文中,经常重复使用相同的对称密钥,并且没有“证明”要求。
@Clément的不同之处在于,这里的秘密是共享的,而在公共密钥设置中,任何知道接收者公共密钥的人都可以很好地完成加密部分。
Moxie Marlinspike说:“在设计安全协议时,我有一个类似的原则:如果您必须在验证收到的消息的MAC之前执行任何加密操作,那么不可避免地会导致厄运” 。参见moxie.org/blog/the-cryptographic-doom-principle