诸如WhatsApp之类的应用程序使用端到端加密。 WhatsApp表示,只有用户共享特定密钥,而没有第三方可以查看消息。但是我不明白两个用户如何同意共享密钥。它必须已经通过WhatsApp服务器进行了传输。这样,WhatsApp会知道共享密钥正确吗?请帮助我了解如何在端到端加密中共享密钥。

评论

参与者需要“共享密钥”吗?我希望他们每个人都只需要对方的公钥。

通常,对于此类事情,用户使用非对称加密交换共享秘密,然后将该共享密钥用于所有后续通信。原因是共享密钥的加密/解密通常更快。

我的问题是关于最初如何传输共享密钥。接收者首先如何在密钥上达成共识?

你做了什么研究? google关键字共享密钥已经指向Wikipedia文章密钥分发。另外:标题不反映问题。密钥协议只是创建安全协议的一小部分(安全性和安全性之间有区别,您指的是安全)。

考虑到这个问题是在WhatsApp的背景下进行的,除了拥有WhatsApp的Facebook存在的有关安全/滥用的担忧之外,我认为WhatsApp下令停止与Facebook共享用户数据的文章可能也很有意义。

#1 楼

使用窃听程序(如WhatsApp服务器)在通道上进行端到端加密的方法是使用称为Diffie-Hellman密钥协商的数学拼写。接下来的内容实际上不是WhatsApp的工作方式*,而是探索一些高级思路来具体地回答问题,而又不会迷失该协议所有内容的详尽细节,从而防御了比您要求的威胁更多的威胁。

Alice和Bob同意使用公共参数$ p $和$ g $,†说$$ p = 2 ^ {2048}-2 ^ {1984}-1 + 2 ^ {64}(\ lfloor2 ^ {1918} \ pi \ rfloor + 124476)$$和$ g = 2 $。当爱丽丝(Alice)想与鲍勃(Bob)交谈时,她随机选择一个整数$ a $,其中$ 0 \ leq a <(p-1)/ 2 $均匀地随机化,将$ g ^ a $除以$ p $之后计算出余数, ‡写入$ g ^ a \ bmod p $,并在通道上传输$ g ^ a \ bmod p $。 Bob的操作与此类似:在相同范围内随机选择$ b $,计算$ g ^ b \ bmod p $,然后通过通道传输$ g ^ b \ bmod p $。
数学的非凡成就,是当爱丽丝收到$ g ^ b \ bmod p $时,她可以计算$(g ^ b \ bmod p)^ a \ bmod p $,结果与$ g ^ {ab } \ bmod p $。鲍勃做同样的事情:给定$ g ^ a \ bmod p $,计算$(g ^ a \ bmod p)^ b \ bmod p $,并获得与$ g ^ {ab} \ bmod p $相同的数字。 br />
没有人能想到一个非凡的数学壮举,它会让知道$ g ^ a \ bmod p $和$ g ^ b \ bmod p $但不认识$ a $或$ b $的人还可以计算$ g ^ {ab} \ bmod p $。

因此,Alice和Bob可以在通道上共享秘密$ g ^ {ab} \ bmod p $,而不向窃听者透露秘密是。然后,他们会将其哈希成一个短的秘密密钥,例如256位$ k = \ operatorname {SHA3-256}(g ^ {ab} \ bmod p)$,也许是SHA3-256,并继续将其用于对称密钥加密,例如AES-CTR。

但这还不是全部。如果这不仅是一个窃听者,而且是我们的朋友马洛里(Mallory),除了拥有一个令人讨厌的未命名名称之外,还可以主动拦截正在传输的邮件吗? Mallory可以假装是Bob到Alice,而Alice到Bob,并做了一对Diffie-Hellman密钥协议,并与Alice和Bob建立了共享秘密,然后窃听了他们交换的所有消息。 WhatsApp服务器可以执行此操作。

为了阻止这种基于会话的共享秘密,Alice和Bob还使用了长期身份验证。爱丽丝像$ a $一样生成数字$ \ alpha $,并将$ g ^ \ alpha \ pmod p $放入电话簿中,或在电话屏幕上显示给Bob;鲍勃同样使用$ \ beta $。因此,它们具有长期共享的秘密$ \ kappa = \ operatorname {SHA3-256}(g ^ {\ alpha \ beta} \ pmod p)$。现在,当爱丽丝(Alice)想与鲍勃(Bob)进行对话时,她会执行每个会话的协议,但她不仅发送$ g ^ a \ bmod p $,而是发送$(g ^ a \ bmod p,\ operatorname {KMAC256} _ \ kappa(g ^ a \ bmod p))$。

当Bob收到候选消息$(A,t)$时,他首先检查$ t = \ operatorname {KMAC256} _ \ kappa (A)$处理之前。如果不是,他将消息放在地板上并忽略它。只有Alice和Bob可以计算函数$ \ operatorname {KMAC256} _ \ kappa $,因为只有Alice和Bob知道秘密的$ \ kappa $。

下一步,而不是仅使用$ k = \ operatorname {SHA3-256}(g ^ {ab} \ bmod p)$使用AES-CTR,他们使用AES-GCM加密和认证对话。 WhatsApp服务器可以翻转使用AES-CTR加密的消息中的位,而只有Alice和Bob知道秘密密钥,而Alice和Bob都不是明智的,但是不知道秘密密钥,WhatsApp服务器无法更改加密和删除消息中的任何内容使用AES-GCM进行身份验证,而不会引起Alice和Bob的注意。

如果爱丽丝和鲍勃因为从未真正见过面而无法在电话屏幕上交换$ g ^ \ alpha \ bmod p $和$ g ^ \ beta \ bmod p $,该怎么办?他们必须查阅WhatsApp出版的电话簿。当爱丽丝向鲍勃的长期公共身份密钥$ g ^ \ beta \ bmod p $咨询WhatsApp时,WhatsApp可以对其进行欺骗并撒谎,如果爱丽丝后来检查鲍勃的电话屏幕,她将检测到该诡计,因为它将另一方面,如果WhatsApp没有在电话簿中欺骗Bob的长期公共身份,那么Alice将在她的个人通讯簿中记住它。如果WhatsApp服务器在Alice尝试开始对话时曾尝试假冒Bob,则Alice会检测到该情况。这种身份验证模型有时称为TOFU,即首次使用时的信任。您还会在ssh协议中找到它。

有一个陷阱:有时Bob的身份密钥会更改,例如当他获得新手机时。在这种情况下,爱丽丝该怎么办?在Signal中,该应用不会代表爱丽丝发送任何新消息;它会通知她某事不对劲,并问她该怎么办。默认情况下,在WhatsApp中,§该应用程序将自动使用Bob的新身份密钥重试,以减少那些不了解该功能的用户的可用性障碍,从而导致主流媒体对该选项的报道陷入困境。如果它看起来像URL,那么它以某种方式使应用程序中一个更严重的漏洞泄漏了您所键入的文本。

最后,由于WhatsApp(是Facebook的一部分)提供了该软件并且不允许您对其进行审查,因此他们肯定有权阅读和模拟您的消息,他们很可能认真地认为自己不会滥用。这比让每个人都在爱丽丝和鲍勃之间的互联网路由上更好,例如跟缠扰者坐在与爱丽丝相同的wifi网络上的咖啡厅里几张桌子的缠扰者,这就是为什么监护人在呼吸时报告呼吸异常有害

即使您的电话通过固定证书向TLS传递了WhatsApp服务器的TLS证书,对电话簿进行恶意更改的审计跟踪也要比设计它容易得多通过WhatsApp服务器来窃听,从而设计审计线索,无论是利用软件漏洞的技术攻击者,不满的LOVEINT员工还是法院下令的窃听。

因此,第三方可以读取您的WhatsApp讯息?不,不太可能,WhatsApp本身会发起主动攻击(类似于Apple拒绝FBI进行的攻击),以使他们读取您的消息。声明使用信号协议(技术文档)。

†技术详细信息:$ p $是安全的素数,表示它是形式为$ p = 2q + 1 $的素数,其中$ q $也是素数$ g $是取模$ p $的二次余数,因此有序$ q $,这意味着当对任意整数$ x $除以$ p $时,$ q $可能有$ g ^ x $的可能余数。 $ g $模$ p $的幂构成了整数$(\ mathbb Z / p \ mathbb Z)^ \ times $的乘法组的子组。这对于您了解如何在公共渠道上共享秘密都不重要,但是如果您想进一步学习,我提供了一些关键词供您参考。

‡翘不实际计算,例如,2 ^ 13805771959684693407656077397889219317288456747119690312451189306384849479687628613222950288427889322679415500741971589068616989911210949597114445259398229588157002772876797268276100622563299377498600497546320786879884333079126581727906347769889606788799518360227168951984468071470187490408276074397578464837282521956615118563389889631151319459158126320262667606793413409480951816493115818911703426164912115254095626026747790743791560327229116656590818054138360168383331595495242709153295834514181328053967320381842712608527965926684083141420258332671624779764031721576291538707703835661166957458717002972300906725181,然后除以$ P $的结果;取而代之的是,她使用模块化的幂运算算法,以便可以在宇宙耗尽之前得到答案。

§其中一些是可配置的:认真使用用户,必须使用WhatsApp,例如新闻工作者,与消息源联系的是WhatsApp,应研究WhatsApp的隐私和安全选项。

评论


$ \ begingroup $
Obnit:我相信您提供的特定质数$ p $对于DH实际上并不安全;原因是像这样的特殊形式的素数往往容易受到SNFS的攻击,而SNFS的运行速度比我们用来处理大多数素数的标准NFS(GNFS)快得多。这并不意味着降低您原本出色的答案
$ \ endgroup $
–雨披
17/12/19在16:30



$ \ begingroup $
您有参考吗?我不相信您-很明显,除了关于数学法则的glib讽刺,我没有跟上有限域DH的话题,因为在实践中它是如此锋利。
$ \ endgroup $
–吱吱作响的s骨
17年12月19日在16:40

$ \ begingroup $
TOFU通常会扩展为“首次使用时信任”。如果您有充分的理由进行其他扩展,建议您解释一下,否则建议进行更正。
$ \ endgroup $
–tialaramex
17年12月19日在17:26

$ \ begingroup $
@SqueamishOssifrage您在此处使用的素数实际上是塞缪尔·内维斯(Samuel Neves)在其答案中使用的素数,它是极度支持SNFS的素数的示例。
$ \ endgroup $
– SEJPM♦
17年12月19日在17:42

$ \ begingroup $
从我对WhatsApp的一点了解来看,发送方发送消息时,接收方并不在线。因此,所使用的原理必须与DH相距甚远。
$ \ endgroup $
–fgrieu♦
17年12月20日在6:56

#2 楼

有不同类型的加密。


对称加密

这是一个密钥用于加密和解密的地方,通常称为共享密钥。这是我们许多人从小就玩代码(技术上是密码)的时候所熟悉的。

要使用对称加密(例如AES),我们需要事先商定密钥,即


非对称加密

一个密钥用于加密,而另一个对应的密钥则需要解密。匹配的密钥被称为密钥对,加密密钥被称为公共密钥,解密密钥被称为私有密钥。

当爱丽丝想秘密地与鲍勃通信时,她会检索鲍勃的公钥( (可以在互联网上发布),只有鲍勃及其相应的私钥可以阅读。这就解决了对称加密的问题,即必须首先在秘密上达成共识,而无需任何人进行窃听。

PGP使用非对称加密来加密用于消息对称加密的随机密钥。这种混合使用还避免了先安全地建立共享秘密的问题。


也有密钥协议方案


,这些类似于不对称密钥。加密。但是,它们允许2个用户通过不安全的通道(即使有人在窃听)建立共享的机密,而不是en和解密。

最常见的是Diffie–Hellman-Merkle。关于如何工作以及更重要的原因的数学运算有些繁琐,但请查看:https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange#Cryptographic_explanation。


现在,如果WhatsApp仅使用对称加密,那么您就认为密钥必须首先通过其服务器发送并且不安全是正确的。但是,WhatsApp使用信号协议,该协议基本上使用Diffie-Hellman建立共享的秘密会话密钥,然后将其用于对称加密(如果我没记错的话,是AES)。这样可以实现安全的端到端通信。

评论


$ \ begingroup $
您是否不错过WhatsApp服务器可能成为DH中间人的步骤?
$ \ endgroup $
–克苏鲁
17/12/22在15:47

$ \ begingroup $
@Cthulhu信号协议使用长期签名密钥IINF防止MITM攻击。根据对OP当前知识状态的解释,我提供了一个非常简单的答案。好的用户名:-)
$ \ endgroup $
– Pete
17年12月23日在15:52

#3 楼

公开密钥加密技术恰好使您感到困惑:两方可以在窃听者监听的公共通道上提供共享的秘密密钥。普通英语的“ Diffie-Hellman密钥交换”提供了一些对此的简化说明。这就是如果您和您的联系人确实拥有彼此的公用密钥(不需要保密),那么您就可以通过公用渠道进行通信,而无需进行窃听或消息操纵。 />
,但这需要您和您的联系人实际拥有彼此的公钥,而WhatsApp无法独自完全解决这个问题。 WhatsApp在这方面提供的就是所谓的安全代码,您和您的联系人可以使用该机制独立地验证彼此是否拥有正确的公共密钥,而不是模仿者的公共密钥。使用这些安全代码和WhatsApp外部的受信任通信通道(严重!),您和您的联系人可以验证您的设备是否具有彼此正确的密钥。

从WhatsApp站点: >

什么是联系信息屏幕中的“验证安全代码”屏幕?

您的每个聊天都有其自己的安全代码,用于验证您的
呼叫和您发送给该聊天的消息是端到端加密的。

注意:验证过程是可选的,仅用于确认
您发送的消息是结束的-加密。

此代码可以在联系信息屏幕中找到,既可以是QR码,也可以是60位数字。这些代码对于每个聊天都是唯一的,并且可以在每个聊天的人之间进行比较,以验证您发送给聊天的消息是否是端到端加密的。安全代码只是您之间共享的特殊密钥的可见版本-不用担心,它不是真正的密钥本身,总是保密的。

要验证聊天是否已端到端加密


打开聊天。
点击联系人姓名以打开联系人信息屏幕。
轻按“加密”以查看QR码和60位数字。 60位数字。
如果您扫描QR码,并且代码确实相同,则会出现绿色的
复选标记。由于它们匹配,因此您可以确定没有人
截获您的消息或呼叫。 >可以向他们发送60位数字。让您的联系人知道
,他们一旦收到您的代码,便应将其写下来,然后直观地将其与“加密”下联系人信息屏幕中出现的60位数字进行比较。对于Android,iPhone和Windows Phone,您可以
使用QR码/ 60位数字屏幕上的“共享”按钮
通过短信,电子邮件等发送60位数字。


WhatsApp将此验证过程描述为“可选”,但如果您不验证联系人的安全代码(并且在WhatsApp之外进行验证),那么您确实可以信任服务器。从广义上讲,他们提供的是他们所能提供的最好的:您可以用来独立验证他们是否在做他们声称的事情的工具。但是他们实际上不能强迫您进行验证,而您必须自己进行验证。他们可以做的最好的事情就是使它更易于使用(例如,使用QR码)。

如果这在某种程度上使您感到烦恼,则应该养成在接触到联系人的安全码后便要进行验证的习惯。 Signal协议(WhatsApp使用的协议,它从Signal Messenger应用程序中采用的协议)的原则之一是,我们需要少数用户对安全代码保持警惕,以保护大部分用户免受不加选择的大规模监视。如果不时有足够的用户发挥作用,我们可以确信,WhatsApp的服务器在最坏的情况下只能用于针对狭窄用户群的目标监视。

#4 楼

即使通道不安全,端到端加密也是安全的,这很重要。您还可以通过不安全的渠道协商密钥。 />因此,如果客户端正确实施协议,那么正在侦听的人将无法获得协商的密钥。

但是我们仍然需要身份验证。所以我们知道我们在和谁说话。我们仍然依赖于Whatsapp,它们拥有公钥。设备在传输过程中对消息进行加密,以明文形式存储在设备上,然后备份到Google或Apple服务器。因此,即使WhatsApp无法阅读您的消息。 Google或Apple可能可以。

评论


$ \ begingroup $
您是否有这种未加密消息存储源,并且未加密自动备份消息?
$ \ endgroup $
–物理吸引力
17年12月22日在20:19

$ \ begingroup $
在寻找资源时,我发现几个月前情况发生了变化。因此,目前的情况并不像以前那样糟糕。备份加密仍然存在一些问题,但至少它不像以前那样琐碎:google.co.il/amp/s/techcrunch.com/2017/05/08/…
$ \ endgroup $
–梅尔·梅尔(Meir Maor)
17年12月23日在5:51

#5 楼

端到端加密安全取决于两个元素(上面已描述了两个):


每个终端设备上加密的安全性和密钥交换的安全性算法

我怀疑终端设备是最弱的。

评论


$ \ begingroup $
这根本无法回答问题。您是否要评论一个答案(无论您指的是“上方”是指哪个答案)?
$ \ endgroup $
–吉尔斯'所以-不再是邪恶的'
17年12月21日在22:17

#6 楼

端到端加密(etee)的工作方式不涉及Whatsapp。如果是这样,那就是点对点(ptpe)加密。在etee中,双方基于较低的常见受支持/允许选项建立了关于算法等的共同协议,与浏览器对Web服务器的处理方式没有太大不同。

评论


$ \ begingroup $
我怀疑您可能需要研究“相互同意算法”的工作方式,以及中间人如何无法收听的声音-我怀疑AV94尚不了解...
$ \ endgroup $
–雨披
17年12月19日在14:55

$ \ begingroup $
OP:我会假设你愿意,但如果没有,我会很乐意链接到@poncho所暗示的信息。
$ \ endgroup $
–linuxdev2013
17年12月19日在15:08

#7 楼

不完全是服务器,但必须信任您使用的整个软件系统。当然,数据可能已经加密,并且您也许可以验证,但是您无法证明密钥没有泄漏或有意传达给某些第三方。

评论


$ \ begingroup $
端到端加密的要点是根本不需要信任服务器,这回答了主要问题。在端到端加密中,客户端需要被信任。如您所说,糟糕的客户可能会泄露密钥。但是如果端到端是正确的,则服务器不会泄漏您的密钥,因为它根本没有密钥。
$ \ endgroup $
–Rob
17年12月22日在21:53

#8 楼

如果所有通信都是通过不受信任的中介进行的,则无法安全地进行通信,因为中介可能会假装向每一方表示对方(中间人攻击)。因此,假设双方不能/不想直接通信,即使交换密钥的程度也是如此,确实需要对服务器进行一定程度的信任。方案(在其他答案中有详细描述)是安全的,只要中介机构不主动干预通信即可(即在服务器可能窃听消息但会如实转发的前提下是安全的)。由于如果双方直接交谈,很容易检测到干扰,因此攻击者尝试冒险是有风险的,因此在实践中不必过多担心。

#9 楼

您真正需要的是确保您的公钥和其他方确实正确传输。确保这一点的唯一方法是在您信任的设备(最好是模拟设备)上亲自和物理地交出公钥。该技术显然存在(如果我愿意的话,我可以从技术上讲)可以自适应地在开放的互联网交换机公钥中传输伪造的公钥,以允许MITM攻击(如果您只是贿赂合适的人)。


一旦成为父母,您将很容易受贿。同样,世界上大多数投票者都是父母,因此很幸运在民主框架内改变任何一种投票方式。

评论


$ \ begingroup $
这不能回答问题。这也是错的。查找公钥基础结构。
$ \ endgroup $
–吉尔斯'所以-不再是邪恶的'
17年12月21日在22:19

$ \ begingroup $
你是对的,它不能回答问题。但是怎么了?您不需要公共密钥基础结构即可进行公共密钥加密。但是,如果这样做,则需要在Wikipedia页面的图中将事物从不同的RA,CA,VA转移到其他RA,CA,VA。是什么阻止某人坐在那根电线上交换发送的内容?您知道互联网上那些黑色箭头之间有几个中间点,对吗?
$ \ endgroup $
–宏线程
17/12/22在7:48



$ \ begingroup $
使用合适的PKI,每个节点都需要从一个公用密钥开始,其他所有内容都受到中间人的保护。对于WhatsApp,此引导公用密钥通常与电话捆绑在一起(实际上是几个公用密钥:SSL的根CA密钥,以及某些内置于应用安装程序中的密钥)。然后,信任关系传播到WhatsApp应用程序,再从那里传播到WhatsApp用户。
$ \ endgroup $
–吉尔斯'所以-不再是邪恶的'
17年12月22日在9:33

$ \ begingroup $
@Gilles必须以某种方式传输公钥,以使其广为人知。如果它们未经加密而公开传输,则可以在飞行中进行更改。您永远都无法免受中间这种人的伤害。您必须信任公开密钥公开的那个(大概未加密的)通道。唯一完全安全的替代方法是与您要与之通信的人进行物理密钥交换,以便您知道正确的密钥。
$ \ endgroup $
–宏线程
17/12/22在10:09



$ \ begingroup $
除非您需要保密,否则加密对于传输公共密钥毫无用处。所需要的是身份验证,并且公钥加密技术可以使您做到这一点,并确信飞行过程中不会发生任何变化。一旦您拥有一个您信任的实体的公钥,并将其交给其他实体,您就可以引导信任。中间人攻击是一个已解决的问题。 PKI不是,但是问题是要信任谁,而不是如何与您信任的人进行沟通。
$ \ endgroup $
–吉尔斯'所以-不再是邪恶的'
17/12/22在11:36

#10 楼

如果它不是端到端加密的,那根本就不是真正的加密!在明文旁边写密文等同于信息方面的信息,与仅写明文并删除密文等效。即:如果解码的内容在您眼前,请勿解密。将密钥写在密文旁边只会好一点。他们只是将两者结合起来就得到了纯文本。静态加密比较好一点,因为密钥不在磁盘上。但这通常意味着该密钥确实通过了该计算机,并且该计算机可能已将该密钥注销了某个位置(即:写入了一个S3桶加密密钥)。端到端意味着机器从未见过密钥,并且不执行必须在用户机器上停顿的加密/解密...。 -end是您遵循加密的第一条规则的唯一方案……不将密钥提供给不应解密的人。确实拥有密钥的“静态加密”取决于绅士的同意,而不是简单地记住密钥或密文。

评论


$ \ begingroup $
如果有人认为此评论有误,则需要解释一下您实际上是如何知道的(例如,AWS)并未存储您插入S3请求标头中的每个密钥-或记住发送回的解密密文。你不知道这一点。大多数时候不是。但是,从密码上来讲,将您的密钥“短暂地”提供给一个不受信任的系统是胡说八道。无法保证系统会忘记密钥。因此,从关于熵的争论中降低了安全性。是否遵守绅士的协议。
$ \ endgroup $
–Rob
17/12/22在12:58



$ \ begingroup $
答案还不清楚。您的脑海中有些系统无法在答案中传达,这似乎是意识的分离。谁是演员。例如:这是什么意思:“如果在您眼前被解码,请勿解密。” (尚未投票-尚未)
$ \ endgroup $
– zaph
17/12/22在20:10



$ \ begingroup $
“在端到端加密中,服务器不需要受信任吗?” -如果服务器需要被信任,那是因为它正在查看密钥。我建议服务器是否可以解密您的资料;它实际上并未在服务器中加密。因此,我认为端到端是“正确加密”的另一种说法。在现实世界中,人们让AWS执行加密/解密,这为AWS提供了密钥。在AWS忘记密钥的假设下可以这样做。如果AWS收到国家安全信函,则必须遵守。不做端到端的休息。
$ \ endgroup $
–Rob
17/12/22在21:39

$ \ begingroup $
被“加密”的文件确实意味着,未经授权的一方绝对无法使用明文;不是说密文存在。人们将密文存储在服务器中,然后在密文旁边写明文摘要。他们认为它是加密的,因为存在密文。但未加密,因为纯文本以略有不同的形式位于其旁边。
$ \ endgroup $
–Rob
17/12/22在21:41

$ \ begingroup $
如果有人未经授权访问了AWS文件服务器,或者说该服务器本身被盗,则数据仍将被加密并且没有密钥就无法读取。通过TLS / StartTLS发送(通过传出和接收邮件主机)发送的电子邮件仍被加密,并且网络上的窃听者无法读取。现在,端到端加密确实是确保安全和隐私的最佳方法。但是,诸如“如果没有进行端到端加密,则根本没有真正加密”之类的说法是夸张且错误的。因此投降。
$ \ endgroup $
– Pete
17 Dec 23 '23:18