SSL与TLS

发表于:2007-06-23来源:作者:点击数: 标签:
第一章 与 安全 有关的概念 1.1 介绍 提供有关通信安全和密码学的基本介绍。 1.2 因特网威胁模型 1.2.1 第一件事就是定义威胁模型(thread model)。它描述了攻击者可望拥有的资源以及可望采用的攻击。几乎每一种安全系统都受制于某种威胁。因此在定义安全威

   
  第一章 与安全有关的概念

1.1 介绍

提供有关通信安全和密码学的基本介绍。

1.2 因特网威胁模型

1.2.1 第一件事就是定义威胁模型(thread model)。它描述了攻击者可望拥有的资源以及可望采用的攻击。几乎每一种安全系统都受制于某种威胁。因此在定义安全威胁时,关心的不止是定义所担心的各种攻击,还要定义我们不准备关心的攻击。使得保障的安全的代价切合实际,物有所值。采用的安全措施应当以实现它们的花费不超过预期的风险为准。

1.2.2 判断不出可接受风险,也就设计不出可接受的系统。

1.2.3 风险计算的部份工作就是评估攻击者实施指定攻击所花费的努力,而每阻止一种攻击类型通常都会增加开销。没有任何一种安全系统可以阻挡任何攻击。安全模型的功能就是让设计者判断哪些攻击值得阻止。

1.2.4 准确估计所必须的安全需要对攻击者能力的准确估算。如果一种原先以为不切实际的攻击现在被发现实施起来很简单,那么就会存在一个暴露安全缺陷的窗口,需调整自身的安全模型和实现以弥补相应的缺陷。

1.3 角色

通信双方分别称作Alice and Bob ,它是沿用RSA论文[Rivest1979]中的名字,攻击者还是被称为攻击者(the attacker)。

1.4 安全目标

通信安全由许多不同的但却又相互关联的特性构成。最为有用的划分是将其分成以下三个主要类别:

1、保密性(confidentiality)

2、信息完整性(message integrity)

3、端点认证(endpoint authentication)

1.5 必要的装备

密码学(Cryptology)是一种设计各种用以提供安全的算法的理论。

密码术(Cryptography)研究使用这些算法来保证系统和协议的安全。

加密(Encryption)算法。其思想是简单的,它接收一些数据(称为明文),并在密钥(key)的控制下将其转换成密文(ciphertext)。它被视为纯粹提供保密性。好的加密算法完全应当由可能的密钥数量决定其安全与否。算法的安全应当只依赖于密钥的保密,算法的保密不应当是安全性的必要条件。

由于发送者和接收者使用同一密钥(这个密钥必须保密),所以也称之为秘密密钥加密(secret key cryptography),与公用密钥加密(public key cryptography)形成对照。

最为流行的加密算法包括数据加密标准(DES)[NIST1993a],Triple-DES(三重DES)

[ANSI1985],RC2[Rivest1998]和RC4。

消息摘要

消息摘要(Message Digest)是一种函数,它接收一个任意长度消息为输入,并产生一个表示消息特征的定长字符串。它的最重要属性就是不可逆性(irreversibility)。给字摘要什,要想计算出它所对应的消息应当是极其困难的。第二个重要属性就是要想产生具有相同的两条消息M and M'应当是困难的。该属性被称为抗冲突性(collision resistance)。实际上,任何抵御冲突发生的消息摘要的强度只有摘要值的一半,因些一个128位的摘要值避免发生冲突的强度只有64位,也就是说需要大约2的64次方次操作才会产生一次冲突。因此,在选择摘要值长度时的限定常常是抵御冲突的强度,而不是抵御可逆性的强度。

消息摘要的首要用途是用于计算数字签名(digital signature)和信息验证码(MAC)。

使用最广泛的消息摘要算法为消息摘要5(MD5)[Rivest1992]和安全散列算法1(SHA-1)

[NIST1994a]。

MAC(message authentication codes信息验证码)

假设Alice与Bob共享一个密钥,Alice 想给 Bob发送一条消息,而Bob将会知道它是Alice发送的,如果她加密的话,只需将他们共享的密钥用做加密密钥即可。但是,这种方法并不能提供任何消息未被篡改的真正保证。只能保证消息来自Alice。我们需要一种新的工具。

这就是MAC。它类似于摘要算法,但它在计算的时候还要采用一个密钥,因此MAC同进依赖于所使用的密钥以及要计算其MAC的信息。

尽管存在许多基于各种摘要算法来构造MAC的尝试,但是因特网安全团体似乎就一种称为

HMAC[Krawczyk1997]的构造方法达成一致。这种方法描述了如何基于满足某种合理假定摘要来创建具有可证明的安全特性的MAC,SSLv3中使用的中一种HMAC的变种,真正的HMAC在TLS中使用。

密钥管理问题

Alice拿到我们的消息,使用共享密钥对信息进行加密,添加一个也是基于该密钥构造的MAC并将其发送给Bob。Bob收到消息,知道发送这条消息的只有Alice,因为只有Alice才具有创建消息上的MAC时所需的密钥。而且能确认信息没有被篡改。

这种共享密钥的方式存在问题,存在很多的密钥,使用不方便。而且更重要的是需进行密钥交换,由于以电子方式交换密钥是很不安全,所以你实际上必须与每一个与之通信的人会面。

这为通过因特网购买商品设置了障碍。

KDC(密钥分发中心)

针对密钥管理问题最流行的解决方案就是公共密钥加密(public key cryptography,PKC)。将在下一节讲述,不过也存在一种只使用目前为止所讨论的工具来解决密钥管理问题的措施。

基本思想是利用受信任的第三方,我们委托它对与我们通信的各方进行认证。这种第三方通常是由网络上一种安全主机来实现的,这台机器被称为密钥分发中心KDC。每个需要保密通信安全的个人都与KDC共享一个密钥。当Alice 与 Bob通信时。她就给KDC发送消息,

该消息以其与KDC共享的密钥加以保护,请求与Bob通信。KDC产生一个新的用于Alice 与Bob之间进行通信的加密密钥,再将其放在一条称为许可证(ticket)的消息中返回。

一条许可证消息由两条消息组成。一条给Alice,其中带有新密钥。另一条给Bob,其中也包括新密钥,通信时用Bob的密钥加密。Alice将许可证中Bob的那部份转交给Bob,现在两者共享密钥。这种基础版由Needham 和 Schroeder[Needham 1978]发明。但是部署最为广

泛的变种称为Kerberos。在MIT及其它地方大量应用于认证与加密。

公共密钥加密

在一篇名为“密码术新动向”[Diffie1976]的论文中,Whitfield Diffie and Martin Hellman提出了现在称之为公用密钥加密的方案,基本思想是设计一种在加密和解密时使用不同密钥的函数。你公共自已的加密密钥(公钥),但解密密角(私钥)要保密。由于公用与私用密钥不

同,公用密钥加密也叫非对称加密,而共享密钥加密有时称为对称加密)。

PKC在针对问题的认证部份也有一套解决方案。你的私钥可用来创建数字签名。它与MAC的关系如同公共密钥加密与秘密密钥加密之间的关系一样。你使用私钥对消息进行签名,而接收方用你的公钥来验证你的签名。数据字签名有一项MAC所不具备的重要属性,不可抵赖性(nonrepudiation)。发送和接收双方都可以产生MAC,但只有数字签名者才能够产生签名。这样,接收者就可以证明发送方对消息进行了签名而送方无法抵赖。

证书

公钥密钥加密也存在密钥管理的问题,公钥要如何交换?如果以电子方式交换,就会存在安全问题,攻击者能在公钥传递过程中篡改。中间人攻击(man-in-the-middle attack)就是其中一种攻击方式。如果物理方式印刷出来,则很不方便。解决方案是通过称之为证书授予权的第三方(certificate authority,CA)。CA发布以其私用密钥签名的目录。在实际应用中,CA不是对目录进行签名,而是对包含密钥属主及其公用密钥的单一信息进行签名。这些信息称为证书(Certificate)。证书的主要标准为X.509[ITU1988a]。rfc是rfc2459。CA的公用密钥以物理方式发布。不过CA并不多而且不经常变换密钥,因此这在实际应用中是不成问题的。

证书的基本结构:

1、证书包含颁发者名称(issuer name),也就是证书签名者的名。

2、主体名称(subject name),证书所担保的密钥的持有者。

3、主体公钥(subject public key),即密钥本身。

4、一组控制信息。诸如有效期限,序列号以及对整个数据对像的签名。

涉及证书的公钥解决方案仍然要包含受第三方,即CA。但修正的PDC的主要问题,由于同一个证书可以用来向任何人证明其公钥,所以CA没有必要为了让双方通信而始终处于联机状态。同时因为CA无法存取任何人的私钥,所以也不能读取任何信息。

DN标识名

证书中的主体名称及颁发者名称为x.500标识名(Distinguished Name,DN)[ITU1988b]。标识名的目的是为每个网络实体提供一个惟一的名字。为了达到这个目的,DN具有一种分层的结构,一个DN由一系列RDN(relative distinguished name,相对标识名)构成,RDN又由

一系列属性-值断言(attribute-value assertion,AVA)构成 。例如:C=CHINA O=COMPANY OU=TIGERHEAD CN=IT。

扩展

证书包含一组标准值,但可扩展,其中最重要的扩展为:

1、 subjectAltName,包含这个用户的其它名称。可能是其它DN,dNSName(dns hostname) and

2、 emailAddress。

2、keyUsgae,包含了该密钥可接受用途的屏蔽位,这些用途包括签名,加密等。

3、 extendedKeyUsage,允许包含一组任意对象标识(oid)的列表。这个列表具体描述该密钥的

4、 用途。

证书的撤消

利用证书撤消列表(Certificate Reveocation List,CRL)。

ASN.1,BER AND DER

ASN.1是抽象语法记法1,其基本思想是为描述数据结构而创建的一种允许通过机器来产生数据编码解码器的系统。它可以将数据格式描述为结构化类型的语言。这非常类似于C中的struct和java中的类。与我们有关的ASN.1编码规则为BER(Basic Encoding Rules)基

本编码规则和DER(Distinguished Encoding Rules)辩识编码规则。DER是BER的子集。

OID(object identifiers,对象标识符)。它是分配给任何种类对象的全局惟一的字节字符串,如算法,密钥用途等。OID空间是邦联性的----ISO将OID空间的各区段分配给各种不同的实体,这些实体还可以进一步针对其它实体对空间进行划分。

1.6 组合起来使用

所有通信安全技术都是根据加密,摘要计算,公用密钥加密和数字签名中的一种来构造。这些技术常被称为安全原语(security primitive),组合使用这些原语可以构造出更为复杂的结构。

组合公用密钥加密和对共享密钥加密的方法提供了对消息的快速加密,同时又具有基于证书的密钥管理的好处。

组合使用信息摘要和数字签名提供了消息完整性和发送方认证而不必共享密钥。

1.7 简单的安全消息系统

发送过程:

1、Alice计算出消息摘要。

2、对消息摘要进行签名并将产生的数字签名与其证书一起附在消息上。

3、产生一个随机会话密钥,使用它来加密经过签名的消息,即证书和签名。

5、 最后,用Bob的公用密钥对会话密钥进行加密并将处理过和会话密钥附到消息上,现在

6、 就可把消息发给Bob。

接收过程:

1、Bob使用其私用密钥对会话密钥解密。

2、他使用会话密钥对消息,即证书和数字签名进行解密。

3、计算出消息的摘要值。

4、对Alice的证书进行验证并取出Alice的公用密钥。

5、使用Alice的公用密钥来验证Alice的数字签名。

1.8 简单的安全通道

刚才的系统在发送单条消息的情况下工作得很好,如E_mail。但是如果我们要的是一条可以在其上传输任意信息的通信通道的话,这个系统就不行了。我们希望能建立一组可以在整

个连接中使用的密钥。这相就不必为每个数据包动用开销昂贵的公用密钥操作。这对于交互式应用犹为重要。这种应用中的每次击键都有可能产生数据包。

构建一个简单协议,实现安全通道。

基本步骤:

握手(Handshake)。Alice 和 Bob使用他们的证书和私用密钥来对对方进行认证并交换共享密钥。

导出密钥(Key derivation)。Alice 和 Bob使用达成一致的共享密钥导出一组加密密钥,以用于对传输进行保护。

数据传输(Data transfer)。将要传输的数据分割成一系统的记录(recode),并对每条记录单独加以保护。这样使用数据一准备好就可以传输,一旦接收就可以进行处理。

关闭连接(Connection closure)。使用特殊的、经过保护的关闭信息,来安全地关闭连接。阻

止攻击者伪造关闭操作而截断正在传输的数据。

简单握手

1、Alice产生一个随机数作为MS(master secret),用Bob的公用密钥加密MS,产生EMS(encryted master secret,加密主密钥)。如果Bob不在意Alice的身份的话。就可以把EMS发送给Bob了,继而就可以开始进行通信了,这种方式称做单向认证。如果Bob经营的是

因特网商店,且只要求Alice的信用卡信息的话,这种认证就可以了。如果需要确认Alice的身份,Alice就要用其私钥对EMS进行签名。Bob会将一个nonce的随机数连同他的证书一起发送给Alice。这样做是为了阻止攻击者重新传送Alice发给Bob的所有信息。这种攻

击叫重放攻击(replay attack)。我们在制作密钥时要用来这个nonce,以确保本次握手所产生的密钥与其它握手所产生的密钥不同。

简单的数据传输协议

在握手结束后,Alice 和 Bob就会共享一个主密钥,但为了让他们能安全传输数据,我们还需做一些工作。第一件就是制作一些密钥。一般来说,使用同一种密钥来完成不止一种类型的加密操作是不安全的。如果使用不同密钥,那么即使加密被攻破,MAC也仍然是安全

的。在这种情况下,我们需要四个密钥,一对用于完成在每个方向上的加密,一对用于完成每个方向上的MAC。使用KDF(key derivation function,密钥导出函数),从主密钥及nonce中创建相应的密钥。

Ecs 用于将数据从客户端发送到服务器端的加密密钥。

Mcs 用于从客户端发送到服务器端数据的MAC密钥。

Esc 用于将数据从服务器端发送到客户端的加密密钥。

Msc 用于从服务器端发送到客户端数据的MAC密钥。

数据记录

下一项任务是描述如何对数据打包。我们将数据分割成一系列的记录,每条记录携带有自已的MAC,在读取一条记录并检查其MAC时就可以知道数据是否完好。当我们从线路上将数据读取过来时,需要能够知道哪些数据字节是加密的,哪些是MAC。所以需要确定记录的格式。定长记录效率低,我们采用变长记录。记录的格式如下:长度|数据|MAC。

客户端想要加密长度为L的数据块D的话,要经以下过程:

1、使用Mcs计算出数据的MAC。称这为MAC M。

2、使用Ecs加密D,我们称之为C。

3、传输。L||C||M。 长度||数据||MAC。

服务器端读取数据则要经历相反的过程:

1、从线路上读取L,我们现在知道D为L字节长。

2、从线路上读取C和M。

3、使用Ecs对C进行解密从而得到D。

4、使用Mcs计算得出D的M'。

5、如果M'=M,那么一切正常。对记录进行处理,否则报告错误。

MAC的计算公式如下:

发送: M = MAC(Mx,D) x为cs or sc

接收: M' = MAC(Mx,D)

序号

但这种简单的协议存在一种安全漏洞,由于记录并没有按照传输的顺序进行标注,因此攻击者可以从线路上拿掉一条记录,转而再发送给接收者(重放攻击)。为克服这种问题,我们需要使用序号(sequence number)。每一方所传送的第一条记录都被编号为1,第二条为2。

当你收到一条记录后,可通过检查其序号,看是否你所期望的数据,如果不是,则报错。序号必须要成为MAC输入的一部份,以防止攻击者对序号进行更改。最简单的方法是把序号添加到D的前面,然后再进行加密和计算MAC。不过,如果我们是在可靠的协议(TCP)上进行通信,那么序号是隐含的,甚至就不必再传了。消息总是按序接收的。因此我们只需在各方维护一个计数器,并使用它来作为MAC计算的一部份。

M = MAC(Mx,Sequence||D)

数据记录的格式变成了:长度|序号|数据|MAC

注意:序号并不能阻止攻击者重新Alice的所有消息,但是,由于Bob每次同Alice握手都生成一个新的nonce。如果攻击者尝试这种攻击的话,Bob会产生一组不同的密钥(由于nonce不同),于是当攻击者对数据进行解密时,所得到的不是明文,而是垃圾信息。

控制信息

还存在一个安全问题,攻击者很容易伪造数据包,而tcp连接的关闭只不过是一个数据包而已。因此攻击者可以伪造连接关闭。实施截断攻击(tuncation attack)。在这种攻击中,攻击者使一方或双方确信数据这这么多,却比实际少。为了克服这个问题,我们需要让Alice告诉Bob她已完成数据发送的方法。一种简单的实现是根据每条记录运载的数据,即普通信息还是控制信息,规定其类型。并把它作为MAC的输入。这样记录格式就变为:长度|序号

|类型|数据|MAC

M = MAC(Mx,Sequence||Type||D)

总结

以上内容复述了ssl的绝大部份核心功能。实现了握手,密钥交换,相互认证以及保密数据传输。但并不完整,它所没有的最重要的一项内容就是磋商(negotiation)功能,我们需要为每种核心任务提供多种算法选择。以便在一种算法被攻破的情况下切换至另一种算法。

1.9 出口形式

美国的出口政策由NSA(国家安全局)负责。NSA具有保证政府通信安全和窃听他人通信

的职责。

1.10 实际的加密算法

1.11 对称加密:序列密码(stream cipher)

惟一受到广泛关注和应用的序列密码是RC4。

1.12 对称加密:分组密码(Block Cipher)

DES(数据加密标准)。具有56位密钥的64位分组密码。数据以8字节大小的分组进行加密,且密钥空间为56位。DES是脆弱的,只适用于低价值或短生存期的信息。

3DES(三重数据加密标准)。

RC2

AES(高级加密标准)

总结:RC4速度最快,而3DES和RC2相当慢。

1.13 摘要算法

就协议设计而言,所有摘要算法都非常相似,唯一的区别是输出尺寸的不同。两种最流行的算法为由Ron Rivest设计的MD5。以及由NIST设计的SHA-1。两者比较

MD5 输出128位 65Mb/s

SHA-1 输出160位 31Mb/s

1.14 密钥的确立

RSA用来做为一种密钥传输算法。DH(Difie-Hellman)是一种密钥磋商算法。

RSA算法在1977年由Ron Rivest,Adi Shamir and Len Adleman(RSA的由来)发明,从高层上讲,RSA非常简单,每个用户都有一个公用密钥和一个私用密钥。公钥可自由发布,而私钥则必须保密。

RSA公钥由两个数据组成。即模数(n)和公共指数(e)。模数为两个非常大的素数(p and q)的乘积,而p and q也需要保密。RSA的安全性就是基于对n进行因数分解以得到p and q的难度。

RSA私钥为另一个数字,通常称为d,且只有在知道p,q,e的情况下才能计算得到。当我们谈论RSA密钥长度时,实际上是在谈论模数的长度。RSA的公共指数e必须与e和p-1 ,q-1互素。为方便起见,通常挑选几个小素数中的一个作为e(常常是3,17或65537)。使用一个小的e,可以使得公用密钥的操作更快一些。选定e后,就可以像下面这样计算得到d:d = e^-1 mod((p-1)(q-1))

DH是首个公开发表的公用密钥算法。它是一种密钥磋商算法,而不是密钥交换算法。

1.15 数字签名

要进行签名,就要计算出消息的摘要值,并使用其私钥进行“加密”,接收方对摘要值进行“解密”,并将其与根据消息独立计算出的摘要值进行比较来验证,如果匹配,则签名就是有效的。

RSA 和 DSS可用一数字签名

1.16 MAC

MAC的唯一一种算法是HMAC。它使用散列算法来构造具有可证明安全特性的MAC。

1.17 密钥长度

密钥长度并不意味着一切。它只是一种通常的衡量方法。

对称密钥

攻击一种设计良好的对称密码的惟一方法就是尝试每个密钥,直到找到能行的那个。

非对称密钥

攻击RSA最好的方法是对模进行因数分解。一般来讲,768或1024位长度的RSA密钥是最少可接受的密钥长度。1024位的非对称密钥大约与80位对称密钥的强度一致。

1.18 总结

对于非交互系统(消息传递)应用来说,我们产生自主式的消息,使用公共密钥加密来保护用来加密消息的密钥,并与数据签名配合,使用消息摘要来提供消息完整性。

对于北交互系统应用来说,我们通过握手来确立密钥,然后再使用对称算法。在握手期间使用公共密钥加密对双方进行认证,并实现密钥交换,然后通过对称密钥加密技术使用那些密钥来保护单条数据记录。

原文转自:http://www.ltesting.net