



现代计算和通信中的很多安全机制和控制措施均基于密码学的安全协议,下面对一些典型的安全协议进行介绍。
在基于网络的通信和交互中,存在的一个基础的问题就是身份问题或登录问题。该问题可以抽象为,参与方A需要向参与方B证明自己的身份,以得到参与方B所拥有的某种资源的使用权或访问权。
下面举几个直观的例子(按照密码学的惯例,参与方A的名字是爱丽丝)。
当爱丽丝进入一栋建筑时,可能需要输入门禁密码,以证明自己的身份。与之类似的场景是,在智能手机和便携式计算机的登录界面,用户需要输入自己的密码。这两种情况下的攻击场景主要是密码泄露,或者恶意黑客仿冒爱丽丝(用户)的身份。
当爱丽丝需要打开自己的汽车车门时,一般会使用非接触密码车钥匙。对应的攻击场景是有人窃听通信信道,观察车钥匙和汽车之间的交互数据。该场景对安全的主要要求是,恶意黑客在未拿到车钥匙时应无法打开车门。
当爱丽丝拿自己的银行卡到自动取款机取款时,攻击场景分为两部分:从银行的视角,存在爱丽丝的身份、银行卡被仿冒的风险;从爱丽丝的视角,存在自动取款机被仿冒的风险,仿冒的自动取款机可能会窃取爱丽丝银行卡的真实信息,并在随后的交易中仿冒该银行卡。
接下来讨论更复杂的场景,当爱丽丝登录自己的网上银行时,由于这是一种远程登录方式,因此浏览器必须首先与银行网站协商一个安全的传输通道,之后,爱丽丝需要向银行证明自己的身份。一种传统的证明方式是使用银行密码,其对应的攻击场景有很多种。例如,恶意网站可以仿冒银行网站,诱骗爱丽丝输入自己的银行密码来证明自己的身份,这种方式被称为钓鱼攻击,属于主动攻击的一种。在银行方面,既有窃取用户密码之后仿冒用户的攻击,也有尝试暴力破解用户密码的攻击,甚至还有对网站服务器发起的DoS攻击。本节聚焦身份识别和登录问题,这些问题都依赖身份识别协议,该协议是密码学可以提供的基础协议之一。
身份识别协议包含两个参与方:证明者和验证者。证明者可以是用户或服务请求方,验证者可以是计算机、服务器或服务提供方。在爱丽丝去自动取款机取款的例子中,爱丽丝是证明者,自动取款机是验证者。
证明者提供某种凭据[如SK(Secret Key,密钥)]给验证者,验证者验证该凭据有效后,将VK(Verification Key,验证密钥)返回给证明者,从而完成身份识别的过程。
根据验证者和证明者的交互方式,可将攻击场景划分为以下3种类型。
(1)直接攻击场景:参考建筑门禁的场景。此时,验证者和证明者存在近端的物理交互。如果恶意黑客无法窃听,那么其必须亲身仿冒证明者。此时存在多种安全手段,一般而言,简单的口令认证协议即可满足该场景。
(2)窃听攻击场景:参考车钥匙远程打开车门的场景。此时,验证者和证明者存在较近距离的交互,但是传输通道可能被监听。在此场景下,简单的口令认证协议已经不够安全,但基于一次性认证密码的略微复杂的协议可以满足该场景。
(3)主动攻击场景:参考网上银行登录的场景。此时,验证者和证明者存在远距离非直接的交互。验证者和证明者都可能被仿冒。仿冒的验证者可以获得证明者提供的证据,随后向真正的验证者仿冒证明者,这种攻击称为主动攻击。在此场景下,验证者和证明者之间需要更复杂的交互协议,如基于挑战响应机制的交互协议。
除仿冒银行网站外,一些攻击方式也可能获取爱丽丝的网上银行登录凭据。例如,本地计算机上的恶意软件可试图覆盖或仿冒网上银行的登录界面。
下面介绍身份识别协议的多种分类方式。
基于 VK 是否可以公开,可将身份识别协议分为私密验证密钥协议和公开验证密钥协议两类。多数身份识别协议不允许验证者公开 VK。但显而易见的是,可公开 VK 的方式更安全,因为针对假定的恶意验证者,其安全不会受损。
基于VK和SK是否可变,可将身份识别协议分为有状态协议和无状态协议两类。有状态协议在每次执行时,都可能更新VK和SK,其安全性更高。但是,有状态协议要求证明者和验证者之间存在某种同步机制,因此其实现和使用更为复杂。
基于认证的对象,可将身份识别协议分为单向认证协议和双向认证协议两类。双向认证是指不仅资源使用方A需要向资源拥有方B证明自己的身份,而且资源拥有方B也需要向资源使用方A证明自己的身份。
总之,身份识别协议可以防止恶意黑客对资源使用方A进行仿冒(该仿冒一般发生在资源使用方A不知情的情况下)。但恶意黑客依然具备在传输通道上监听、篡改、阻断及仿冒资源拥有方B的能力。
因此,单纯凭借身份识别协议,并不足以在远程交互场景下建立安全会话,还要考虑中间人攻击的场景。在该场景下,恶意黑客会控制爱丽丝和验证方通信的通道,并转发二者之间的所有认证消息,从而在双方不知情的情况下监听其会话。为了克服中间人攻击,可以将身份识别协议与认证密钥交换协议结合使用。
假设爱丽丝和鲍勃希望通过不安全的网络建立安全通道,以进行双方的安全通信,那么此时便存在一个问题:爱丽丝和鲍勃如何互相确定彼此的身份,并建立共享会话密钥呢?用于解决这个问题的协议称为AKE(Authenticated Key Exchange,认证密钥交换)协议。
简单而言,AKE协议允许两个用户建立一个共享的会话密钥。在成功运行此协议后,用户A应该清楚地知道正在与哪个用户(用户B)进行通信,也就是说,与哪个用户建立了共享会话密钥。安全的AKE协议应确保用户A的会话密钥是仅有用户B知道的,新创建的随机密钥。
如果有TTP(Trusted Third Party,可信第三方),事情就会变得简单。系统中的每个用户必须向TTP执行某种注册协议,在执行完注册协议后,用户已经建立了自己的长期密钥。在一些协议中,TTP可以离线,AKE协议的运行过程也不依赖其与TTP的通信,TTP在这些协议中的角色是证书颁发机构。还有一种基于在线TTP的AKE协议,该AKE协议的每次运行都必须联系TTP,且TTP与用户共享秘密信息。显然,在一般场景下,基于离线TTP的AKE协议更安全、方便。值得提及的区别是,在线TTP协议可以使用对称密钥基元构建,而不依赖公钥加密算法与工具,且其密钥撤销更为简单。
AKE协议需要支持用户多次运行,我们将每次运行称为该用户的一个实例。虽然给定用户只有一个长期密钥,但每次运行AKE协议都应该产生一个新的会话密钥。这样,即使恶意黑客能够窃取某一次会话密钥,也不会对其他会话的安全性造成明显影响。此外,实现安全通道的某些方法依赖会话密钥的新鲜度,以在多个会话中维持其安全性。例如,人们会使用流密码来维护通过用户与银行之间的安全通道发送的数据的保密性。如果使用相同的密钥对两个不同的流进行加密,则恶意黑客可以发起两次密码本攻击,以获得有关加密数据的信息。会话密钥的新鲜度可确保在不同会话中使用的密钥彼此有效、独立。
身份验证密钥交换以以下两种不同类型的协议为基础。
(1)认证机制,如MAC或数字签名。
(2)密钥封装(通常通过某种Diffie-Hellman密钥协商)。
应用 AKE协议的一个简单示例是现代的 TLS握手机制,该机制首先使用数字签名签署临时的椭圆曲线 Diffie-Hellman 公钥,然后将其用于共享密钥的派生,以加密和认证网络流量。注意,上述解释略去了复杂的实现机制部分,没有介绍双向认证TLS或协议协商的基础机制。
部分即时消息协议使用的认证密钥交换机制更为复杂。例如,Signal端到端加密通信软件采用的X3DH和双棘轮协议。
目前,IETF(Internet Engineering Task Force,互联网工程任务组)正在努力推进消息传递层安全性的标准,该标准将使用ECDH握手的二进制树来管理状态和优化组操作。此外,PAKE (Password-Authenticated Key Exchange,密码验证密钥交换)协议的标准化工作也在进行中。IETF的密码论坛研究小组中的密码学家正在将一系列密码验证密钥交换协议进行标准化。
PAKE有两种风格:平衡(相互认证)和增强(一侧是证明者,另一侧是验证者)。平衡的PAKE 适用于用户可以控制两个端点(如Wi-Fi 网络)的加密隧道,而增强的PAKE 可以很好地消除服务器被恶意黑客入侵时,客户端(服务器)应用程序中密码被盗的风险。CFRG选择了一个平衡的可组合PAKE(CPace)和一个增强的PAKE(OPAQUE),二者目前均在标准草案或意见征集阶段,尚未成为正式发布的标准。
数据安全旨在保护那些被收集、存储、创建、接收或传输的数据,保护数据传输通道的安全性是其中的关键。密码学提供了构筑安全的数据传输通道的基础。
现代密码学基于密钥的保密性。在私钥加密系统中,通信双方必须在通信之前商定一个共同的私钥;在公钥加密系统中,每一方都有一对公钥和私钥,公钥可以公开,而私钥必须严格保密。公钥加密方案使通信双方不必预先商定共同的私钥,该方案依赖于用户不论出于合法目的还是非法目的,可使用的计算资源都是有限的这一事实。也就是说,公钥加密系统依赖于计算困难的问题。零知识证明的安全性基于以下事实:如果想从公钥中计算出私钥,就必须解决计算困难的问题。发送方可以使用公钥加密消息,而接收方可以使用私钥解密消息。私钥的所有者将是唯一可以解密消息的人,但知道公钥的任何人都可以发送消息。
基于计算困难的现代密码学,以及多数基于密码学的安全算法和安全协议都有自身的局限性。如果有可以降低计算困难度的手段,那么利用该手段可以有效破解安全算法和安全协议。例如,如果量子计算机真的能够从RSA公钥中迅速计算出对应的私钥,则整个公钥加密系统将存在很大的风险。
因此,在不公开任何有关断言本身信息的情况下,证明对某些断言的了解的想法非常有吸引力。零知识协议就是为这种场景构建的。
零知识协议常用的几个术语包括断言、证明和知识。断言是指对某个条件是或否的陈述;证明是指通过某种方式确认断言是否正确,知识是指断言本身包含的信息。例如,初等几何学中的一个断言是三角形的内角和等于180°,其证明是初等几何学中学习过的基础内容(本书不进行深入阐述)。哥德巴赫猜想(任何一个大于2的偶数都是两个素数的和)也是一种数学领域的断言或假设,但该断言至今尚未被证明。在其他学科中,也积累了大量证据(或统计特征)以证明或拒绝某些断言。
作为加密协议,零知识协议不会在操作过程中透露秘密本身,秘密也不会被转移到另一方,但是用户仍然可以向另一方证明自己知道这个秘密。因此,零知识协议是证明通信双方身份,或者在密钥交换步骤中证明自己拥有某个密钥的好方法。
零知识协议中通常会出现3个或4个不同的角色:P(Prover,证明者)、V(Verifier,验证者)、Eve(Eavesdropper,窃听者)和M(Malicious-user,恶意用户)。在零知识协议中,P试图向验证者证明自己对秘密的了解,但不会泄露秘密本身。V可以提出问题,目的是查出证明者是否真的知道秘密,但即使验证者不遵守协议规则,他也无法发现有关秘密的信息。Eve是侦听证明者与验证者对话的第三方。如果零知识协议是安全的,则 Eve将无法学习任何有关该秘密的信息,且无法向其他人证明自己知道这个秘密。若假设有一个M能够发送、修改或销毁消息,那么良好的协议应该可以防御M,且协议必须考虑P和V均有恶意意图的情况。展开说就是,P可能试图欺骗V接收虚假陈述,V可能试图获取信息并滥用,因此,良好的协议必须以以下方式构建。
(1)如果 P不知道秘密,那么他无法假装拥有这种知识。零知识协议通过多重回合,以接近1的概率保证P不会欺骗V。
(2)V可以给出P知道秘密的结论,但V无法获得任何进一步的信息。V也无法向其他人证明自己知道这个秘密。特别是,如果不直接问P问题,则V无法从协议的交互中得到任何东西,这正是零知识的意义。
下面用一个形象但不太精确的例子来描述零知识协议。
P提出的断言是“我可以记住1000张扑克牌的花色和数字”。显然,V可以选择打乱这1000张扑克牌的顺序,让P逐个说出,以此验证P提出的断言。但是这样做会耗费很长的时间,对于验证协议来说性价比很低。
那么,合适的验证协议是什么呢?
验证协议可以包含多个回合,这里我们将每个回合分为如下两个步骤。
(1)P闭上眼睛,允许V用手上的其他扑克牌,随机替换这1000张扑克牌中的任意一张(当然,V也可以什么都不做)。
(2)P睁开眼睛,观察这1000张扑克牌,然后说出是否有被替换的扑克牌。如果有,则指出哪张扑克牌被替换了,以及原来的扑克牌的花色和数字。
第一个步骤结束后,即使P可以准确地说出,V也会半信半疑,想着也许P只是足够幸运呢?如果第二个步骤结束后也是如此,那么 V对 P的断言的相信程度就会增加。若允许多次重复以上步骤,那么V将以几乎100%的概率验证P提出的断言为真。当然,在此过程中,P并没有让V了解自己是怎么记住扑克牌的(这个是秘密),甚至没有透露每张扑克牌的内容。
零知识的概念由美国麻省理工学院的研究人员Shafi Goldwasser、Silvio Micali和Charles Rackoff于1985年在论文“The Knowledge Complexity of Interactive Proof Systems”中提出。在该理论中,P(第一方)与V(第二方)交换消息,以使V确信某些数学陈述的正确性。
在零知识的概念被提出之前,该领域的大多数工作都集中在交互式证明系统的可靠性上。也就是说,零知识概念考虑了有恶意意图的 P 试图欺骗 V 相信其虚假陈述的情况。Shafi Goldwasser 等人从不同的视角分析了该问题。他们提出,不仅需要担心P,还需要考虑V不值得信任的情况。
涉及的问题场景是信息泄露,即除证明事实正确外,V 还将在证明过程中学习到多少额外的信息。
Shafi Goldwasser等人在论文中提出,任何零知识证明都必须满足以下三个关键属性。
(1)完整性:如果P是诚实的,那么他最终将说服V。
(2)健全性:仅在陈述正确的前提下,P才能说服V。
(3)零知识性:V除陈述真伪外,学习不到任何信息。
零知识证明的发展存在较大的波折,其在很长一段时期内仅以理论的形式存在,而没有在预期的场景中得到工程化应用和普及。2007年,Shafi Goldwasser等人的又一篇论文提出了一种在多项式时间内运行的委托计算的验证器,该内容虽然仍停留在理论层面,但具备了可行性。2010年,Gennaro、Gentry和Parno等人在发表的论文中提出了非交互式可验证计算的概念。
自此,在此方向上的研究和创新得以不断推进。最终,论文“Pinocchio:Nearly Practical Verifiable Computation”(匹诺曹:几乎实用的可验证计算)问世。其中的匹诺曹是一个构建系统,可在仅依赖密码学假设的情况下有效地验证常规计算。该论文定义并详细说明了构建特定zkSNARK(Zero-Knowledge Succinct Non-interactive Arguments of Knowledge,零知识的简洁非交互式知识争论)的所有元素,并认为其几乎实用。Ben Sasson等人于2013年年底首次发表的论文“Succinct Non-Interactive Zero Knowledge for a von Neumann Architecture”(冯·诺依曼体系结构的简洁非交互零知识)表明,匹诺曹零知识证明系统是切实可行的。Nir Bitansky等人于2012年发表的论文“From Extractable Collision Resistance to Succinct Non-Interactive Arguments of Knowledge,and Back Again”(从可提取的抗碰撞性到简洁的非交互性知识论证,然后返回)首次定义了零知识简洁非交互式知识论证的缩写,其第一次广泛应用是在Zerocash区块链协议中,零知识密码学以数学方式证明了一方可以拥有某些信息而不透露该信息是什么,并提供了协议的核心计算功能。福布斯网站的一篇文章指出,2021年,总价值88.5亿美元的82种加密货币用零知识证明或类似的隐私技术对交易进行了加密。
安全多方计算也称安全计算、多方计算或隐私保护计算,是密码学的一个子领域,其目标是为各方创造方法,使其在各方提供的输入上联合计算某个函数的结果,并同时保持这些输入的隐私性。与传统密码学的任务不同,现代密码学旨在确保通信或存储的安全性和完整性,以及恶意黑客不是参与者(窃听者不是通信的发送方和接收方)。因此,安全多方计算在保护参与者的隐私方面提供了很大帮助。
安全多方计算始于20世纪70年代后期,当时主要研究在远距离的游戏或计算场景中,当不需要可信赖的第三方时如何加密和计算。传统密码学的方法是隐藏内容,而这种新型计算的方法是隐藏数据的部分信息,同时使用多个来源的数据进行计算,并正确生成输出。
安全多方计算起源于1982年姚期智院士在其论文中提出的百万富翁问题。该问题可以形象地描述为,两个百万富翁想知道彼此谁更有钱,但又都不想把自己的真实资产数额透露给对方及任何第三方。针对此场景,需要寻找一个安全的计算方法或协议,以对二者的资产数进行比较并返回结果。该问题可抽象为布尔型的比较问题,即验证 X 1 > X 2 是否为真。该论文中提出的第一个解决方案在时间和空间上是指数级的,后来又出现了多种改进方案。Oded Goldreich将该问题泛化为多方的比较和计算问题。
安全多方计算问题可以抽象为多个互相不信任的参与者,在没有 TTP的条件下,如何在不泄露每个参与者的隐私信息的同时,用这些信息联合计算。如果有 TTP就很简单,例如,对于计算平均工资的场景,每个人可以把自己的月工资告诉TTP,由其来计算大家的平均工资。
在本质上,安全多方计算属于一个分布式多方协议问题。该协议描述了在分布式网络中,多方参与者如何交互信息。而安全多方计算的多数目标场景,在存在可信第三方的前提条件下很容易解决。因此,安全多方计算的目的是,在不存在可信第三方的条件下,如何“等价于”可信第三方,以得到相同的结果。
之所以称为安全多方计算,是因为协议既需要定义各场景需要的抽象功能和安全目标,又需要考虑恶意参与方的所有可能的攻击场景,还需要严格的数学维度的安全证明。
安全多方计算可以概括为,有 n 个互不信任的参与者( P 1 , P 2 ,…, P n ),每个参与者 i P 秘密输入 X i ,随后,他们需要共同执行一个已知的函数
f :( x 1 , x 2 ,…, x n )→( y 1 , y 2 ,…, y n )
其中, y i 为 i P 得到的相应输出。在函数 f 的计算过程中,要求除 y i 外,任意参与者 i P 均不能得到其他参与者 P j ( j ≠ i )的任何输入信息。
大多数情况下
y 1 = y 2 =…= y n
因此可以将该函数简单地表示为
f :( x 1 , x 2 ,…, x n )→ y
或更为抽象地描述为
也就是说,对于 k 个互不信任的参与者,计算函数 f 接收 k 个来自不同参与者的比特字符串作为输入,并生成 k 个比特字符串作为输出。
安全多方计算聚焦于参与者的隐私保护问题,与外包计算、同态加密等场景有着紧密的联系,但其业务目标和实现机制并不等同。
安全多方计算技术能够较好地解决医疗隐私数据场景的使用需求。基于医疗数据,安全多方计算可以在不侵犯病人隐私的情况下获得研究成果。例如,在基于基因数据的遗传病学研究领域,应用安全多方计算,即使不收集基因组的原始数据,也能得到整体的研究成果。
随着云计算和大数据的普及,构建可保护隐私的安全计算不仅成为学术界的理论研究课题,而且在工业领域得到了越来越多的实践应用,安全多方计算也因此成为工业领域的热点技术之一。
同态加密是一种革命性的加密技术,它使用户能够在加密数据上执行特定的数学运算,并得到依然是加密形式的结果。更重要的是,该加密运算后的结果与直接对明文数据执行相同操作得到的结果一致。这意味着,在不解密数据的情况下,用户能够在加密状态下对其数据直接进行运算,并得出正确的结果。这一特性使得同态加密在云计算、数据共享和远程处理等应用场景中成为一个理想的隐私保护工具。在这些场景中,用户需要将敏感数据上传至第三方服务器进行处理,传统的加密方法要在处理之前对数据进行解密,这面临着数据泄露的风险,而同态加密技术支持在加密数据上进行计算,使得用户无须暴露明文数据,便可完成各种操作,从而保障了数据的隐私性和安全性。同态加密的真正价值在于,其能够解决数据隐私与外部计算需求之间的矛盾,让云计算提供商能够在不访问数据内容的情况下处理用户的数据,这极大地增强了对数据隐私的保护。此外,这项技术还被广泛应用于金融、医疗等行业,以确保敏感数据在处理、存储和分析过程中得到高度保护,促进了数据隐私保护和安全计算的发展。