HTTP(四):HTTPS

简述

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

HTTPS的主要思想是在不安全的网络上创建一安全信道,并可在使用适当的加密套件和服务器证书可被验证且可被信任时,对窃听和中间人攻击提供合理的防护。

HTTPS的信任继承基于预先安装在浏览器中的证书颁发机构(如VeriSign、Microsoft等)(意即“我信任证书颁发机构告诉我应该信任的”)。因此,一个到某网站的HTTPS连接可被信任,当且仅当:

  1. 用户相信他们的浏览器正确实现了HTTPS且安装了正确的证书颁发机构;

  2. 用户相信证书颁发机构仅信任合法的网站;

  3. 被访问的网站提供了一个有效的证书,意即,它是由一个被信任的证书颁发机构签发的(大部分浏览器会对无效的证书发出警告);

  4. 该证书正确地验证了被访问的网站(如,访问https://example时收到了给“Example Inc.”而不是其它组织的证书);

  5. 或者互联网上相关的节点是值得信任的,或者用户相信本协议的加密层(TLS或SSL)不能被窃听者破坏。

SSL/TLS

SSL(Secure Sockets Layer,安全套接层),及其继任者 TLS(Transport Layer Security,传输层安全)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。

SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层:

  • SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。
  • SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

SSL协议提供的服务主要有:

  • 认证用户和服务器,确保数据发送到正确的客户机和服务器;
  • 加密数据以防止数据中途被窃取;
  • 维护数据的完整性,确保数据在传输过程中不被改变。

握手

可以参考更有趣的实例:

SSL/TLS协议运行机制的概述

图解SSL/TLS协议

  1. 客户端发送列出客户端密码能力的客户端“您好”消息(以客户端首选项顺序排序),如 SSL 的版本、客户端支持的密码对(加密套件)和客户端支持的数据压缩方法(哈希函数)。消息也包含 28 字节的随机数。
  1. 服务器以服务器“您好”消息响应,此消息包含密码方法(密码对)和由服务器选择的数据压缩方法,以及会话标识和另一个随机数。

    注意:客户端和服务器至少必须支持一个公共密码对,否则握手失败。服务器一般选择最大的公共密码对。

  1. 服务器发送其SSL数字证书。(服务器使用带有 SSL 的 X.509 V3 数字证书。)

    如果服务器使用 SSL V3,而服务器应用程序(如 Web 服务器)需要数字证书进行客户端认证,则客户端会发出“数字证书请求”消息。在 “数字证书请求”消息中,服务器发出支持的客户端数字证书类型的列表和可接受的CA的名称。

  2. 服务器发出服务器“您好完成”消息并等待客户端响应。

  3. 一接到服务器“您好完成”消息,客户端( Web 浏览器)将验证服务器的SSL数字证书的有效性并检查服务器的“您好”消息参数是否可以接受。

    如果服务器请求客户端数字证书,客户端将发送其数字证书;或者,如果没有合适的数字证书是可用的,客户端将发送“没有数字证书”警告。此警告仅仅是警告而已,但如果客户端数字证书认证是强制性的话,服务器应用程序将会使会话失败。

  4. 客户端发送“客户端密钥交换”消息。此消息包含 pre-master secret(一个用在对称加密密钥生成中的 46 字节的随机数字),和 消息认证代码( MAC )密钥(用服务器的公用密钥加密的)。

    如果客户端发送客户端数字证书给服务器,客户端将发出签有客户端的专用密钥的“数字证书验证”消息。通过验证此消息的签名,服务器可以显示验证客户端数字证书的所有权。

    注意: 如果服务器没有属于数字证书的专用密钥,它将无法解密 pre-master 密码,也无法创建对称加密算法的正确密钥,且握手将失败。

  5. 客户端使用一系列加密运算将 pre-master secret 转化为 master secret,其中将派生出所有用于加密和消息认证的密钥。然后,客户端发出“更改密码规范” 消息将服务器转换为新协商的密码对。客户端发出的下一个消息(“未完成”的消息)为用此密码方法和密钥加密的第一条消息。

  6. 服务器以自己的“更改密码规范”和“已完成”消息响应。

  7. SSL 握手结束,且可以发送加密的应用程序数据。

证书

为了能实施SSL,一个Web服务器对每个接受安全连接的外部接口(IP地址)必须要有相应的认证书(Certificate)。

数字证书

数字证书是一个电子文档,其中包含了持有者的信息、公钥以及证明该证书有效的数字签名。

数字证书以及相关的公钥管理和验证等技术组成了PKI(公钥基础设施)规范体系。一般来说,数字证书是由数字证书认证机构(Certificate authority,即CA)来负责签发和管理,并承担PKI体系中公钥合法性的检验责任;数字证书的类型有很多,而HTTPS使用的是SSL证书。

CA的组织结构

CA组织结构中,最顶层的是根CA,根CA下可以授权给多个二级CA,而二级CA又可以授权多个三级CA,所以CA的组织结构是一个树结构。权威CA有 GlobalSignVeriSignGeoTrustComodo ,都是收费的,也有免费的数字证书认证机构,比如CAcert和 StartSSL,为了推广https,EFF推出了免费的CA:Let’s Encrypt以加速所有的网站皆能使用加密传输。

数字证书的签发机构CA,在接收到申请者的资料后进行核对并确定信息的真实有效,然后就会制作一份符合X.509标准的文件。证书中的证书内容包括了持有者信息和公钥等都是由申请者提供的,而数字签名则是CA机构对证书内容进行hash加密后等到的,而这个数字签名就是我们验证证书是否是有可信CA签发的数据。

接收端接到一份数字证书Cer1后,对证书的内容做Hash等到H1;然后在签发该证书的机构CA1的数字证书中找到公钥,对证书上数字签名进行解密,得到证书Cer1签名的Hash摘要H2;对比H1和H2,假如相等,则表示证书没有被篡改。但这个时候还是不知道CA是否是合法的,我们看到上图中有CA机构的数字证书,这个证书是公开的,所有人都可以获取到。而这个证书中的数字签名是上一级生成的,所以可以这样一直递归验证下去,直到根CA。根CA是自验证的,即他的数字签名是由自己的私钥来生成的。合法的根CA会被浏览器和操作系统加入到权威信任CA列表中,这样就完成了最终的验证。所以,一定要保护好自己环境(浏览器/操作系统)中根CA信任列表,信任了根CA就表示信任所有根CA下所有子级CA所签发的证书,不要随便添加根CA证书。

证书信息

X.509 标准规定数字证书应包含标准化信息。具体地说,X.509 版本 3 证书包含下列字段:

  • 版本号 证书所遵循的 X.509 标准的版本。
  • 序列号 唯一标识证书且由证书颁发机构颁发的编号。
  • 证书算法标识 证书颁发机构用来对数字证书进行签名的特定公钥算法的名称。
  • 颁发者名称 实际颁发该证书的证书颁发机构的标识。
  • 有效期 数字证书保持有效的时间段,并包含起始日期和过期日期。
  • 使用者名称 数字证书所有者的姓名。
  • 使用者公钥信息 与数字证书所有者关联的公钥以及与该公钥关联的特定公钥算法。
  • 颁发者唯一标识符 可以用来唯一标识数字证书颁发者的信息。
  • 使用者唯一标识符 可以用来唯一标识数字证书所有者的信息。
  • 扩充信息 与证书的使用和处理有关的其他信息。
  • 证书颁发机构的数字签名 使用证书算法标识符字段中指定的算法以及证书颁发机构的私钥进行的实际数字签名。

证书类型

主要的证书类型有:PEM、DER、PKCS#12

证书的转换

苹果的证书

对于iOS开发证书来说,申请完签名证书后,还需要安装苹果的公钥证书(Xcode安装后会自动安装),只有申请的证书是可以被验证通过的(合法的),可用来进行ipa文件签名的。

苹果的公钥证书,由苹果的Worldwide Developer Relations Certificate Authority(WDRCA)授权签名的,而它是由Apple Certificate Authority授权签名的。证书链中苹果的CA是根。 苹果CA根证书默认是内置在苹果系统中的,所以WDRCA的可信性可以由苹果内置的CA根证书来验证其可信性。

加密算法

对称加密

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。这把秘钥,是不会公开的。

所谓对称,就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥是控制加密及解密过程的指令。算法是一组规则,规定如何进行加密和解密。

因此 加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要。因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题。

对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。

对称加密算法的缺点是在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥。其次如果一方的秘钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。

常用算法

常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES等。

  • DES:数据加密标准(DES,Data Encryption Standard)是一种使用密钥加密的块密码,它基于使用56位密钥的对称算法,这个算法因为包含一些机密设计元素,相对短的密钥长度以及被怀疑内含美国国家安全局(NSA)的后门而在开始时是有争议的,DES现在已经不被视为一种安全的加密算法,主要因为它使用的56位密钥过短,导致容易被破解。为了提供实用所需的安全性,可以使用DES的派生算法3DES来进行加密,虽然3DES也存在理论上的攻击方法。
  • AES:高级加密标准(英语:Advanced Encryption Standard,缩写:AES),这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用,2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。AES的区块长度固定为128比特,密钥长度则可以是128,192或256比特
  • RC4:RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ronald Rivest在1987年设计的密钥长度可变的流加密算法簇。该算法的速度可以达到DES加密的10倍左右,且具有很高级别的非线性。RC4起初是用于保护商业机密的。但是在1994年9月,它的算法被发布在互联网上,也就不再有什么商业机密了。
  • IDEA:是旅居瑞士中国青年学者来学嘉和著名密码专家J.Massey于1990年提出的。它在1990年正式公布并在以后得到增强。这种算法是在DES算法的基础上发展出来的,类似于三重DES,和DES一样IDEA也是属于对称密钥算法。发展IDEA也是因为感到DES具有密钥太短等缺点,已经过时。IDEA的密钥为128位,这么长的密钥在今后若干年内应该是安全的。

非对称加密

非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

场景

  • 对信息保密,防止中间人攻击:将明文使用公钥加密,传输给接收者,这样确保信息只能被有私钥的拥有者解密,其他人无法获得明文信息,因为没有私钥无法进行解密。该方法一般用于交换对称密钥
  • 身份验证和防止信息篡改:私钥拥有者使用私钥加密一段授权明文,并将授权明文和加密后的密文,以及公钥一并发送出来,接收方只需要通过公钥将密文解密后与授权明文对比是否一致,就可以判断明文在中途是否被篡改过。此方法用于数字签名

工作原理

  1. Alice要向Bob发送信息,Alice和Bob都要产生一对用于加密非对称加密算法和解密的公钥和私钥。

  2. Alice的私钥保密,Alice的公钥告诉Bob;Bob的私钥保密,Bob的公钥告诉Alice。

  3. Alice要给Bob发送信息时,Alice用Bob的公钥加密信息,因为Alice知道Bob的公钥。

  4. Alice将这个消息发给Bob(已经用Bob的公钥加密消息)。

  5. Bob收到这个消息后,Bob用自己的私钥解密Alice的消息。其他所有收到这个报文的人都无法解密,因为只有Bob才有Bob的私钥。

常用算法

RSA、Elgamal、背包算法、Rabin、D-H、ECC。

  • RSA:1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名,叫做RSA算法。从那时直到现在,RSA算法一直是最广为使用的”非对称加密算法”。毫不夸张地说,只要有计算机网络的地方,就有RSA算法。这种算法非常可靠,密钥越长,它就越难破解。根据已经披露的文献,目前被破解的最长RSA密钥是768个二进制位。也就是说,长度超过768位的密钥,还无法破解(至少没人公开宣布)。因此可以认为,1024位的RSA密钥基本安全,2048位的密钥极其安全。适用于数字签名和密钥交换。 该算法是目前应用最广泛的公钥加密算法,特别适用于通过 Internet 传送的数据。
  • DSA:数字签名算法 (Digital Signature Algorithm, DSA) 由美国国家安全署 (United States National Security Agency, NSA) 发明,已作为数字签名的标准。在DSA数字签名和认证中,发送者使用自己的私钥对文件或消息进行签名,接受者收到消息后使用发送者的公钥来验证签名的真实性。DSA只是一种算法,和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交换,只用于签名,它比RSA要快很多。DSA 算法的安全性取决于自计算离散算法的困难。这种算法,不适用于数据加密,仅适用于数字签名。
  • Diffie-Hellman:一种确保共享KEY安全穿越不安全网络的方法。Whitefield与Martin Hellman在1976年提出了一个奇妙的密钥交换协议,称为Diffie-Hellman密钥交换协议/算法(Diffie-Hellman Key Exchange/Agreement Algorithm)。这个机制的巧妙在于需要安全通信的双方可以用这个方法确定对称密钥。然后可以用这个密钥进行加密和解密。但是注意,这个密钥交换协议/算法只能用于密钥的交换,而不能进行消息的加密和解密。双方确定要用的密钥后,要使用其他对称密钥操作加密算法实际加密和解密消息。该算法仅适用于密钥交换。
  • ECC:椭圆加密算法(ECC)是一种公钥加密体制,最初由Koblitz和Miller两人于1985年提出,与经典的RSA,DSA等公钥密码体制相比,椭圆密码体制有以下优点:160位的椭圆密钥与1024位的RSA密钥安全性相同;在私钥的加密解密速度上,ECC算法比RSA、DSA速度更快;存储空间占用小;带宽要求低;ECC算法的数学理论非常深奥和复杂,在工程应用中比较难于实现,但它的单位安全强度相对较高。

对比与选择

对比

以上综述了两种加密方法的原理,总体来说主要有下面几个方面的不同:

  1. 管理:公钥密码算法只需要较少的资源就可以实现目的,在密钥的分配上,两者之间相差一个指数级别(一个是n一个是n2)。所以私钥密码算法不适应广域网的使用,而且更重要的一点是它不支持数字签名。

  2. 安全:由于公钥密码算法基于未解决的数学难题,在破解上几乎不可能。对于私钥密码算法,到了AES虽说从理论来说是不可能破解的,但从计算机的发展角度来看。公钥更具有优越性。

  3. 速度:AES的软件实现速度已经达到了每秒数兆或数十兆比特。是公钥的100倍,如果用硬件来实现的话这个比值将扩大到1000倍。

选择

前面的章节已经介绍了对称解密算法和非对称加密算法,有很多人疑惑:那我们在实际使用的过程中究竟该使用哪一种比较好呢?

我们应该根据自己的使用特点来确定,由于非对称加密算法的运行速度比对称加密算法的速度慢很多,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。

对称加密算法不能实现签名,因此签名只能非对称算法。

由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。

在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。

如果在选定了加密算法后,那采用多少位的密钥呢?一般来说,密钥越长,运行的速度就越慢,应该根据的我们实际需要的安全级别来选择,一般来说,RSA建议采用1024位的数字,ECC建议采用160位,AES采用128为即可。

摘要算法

对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希k(Hash)算法、散列算法。

消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。消息摘要算法不存在密钥的管理与分发问题,适合于分布式网络上使用。常见的,例如计算机的口令就是用不可逆加密算法加密的。

消息摘要算法主要应用在“数字签名”领域,作为对明文的摘要算法。

常用算法

常用的算法有,MAC、CRC、MD5、HAVAL、SHA

  • MD5:是RSA数据安全公司开发的一种单向散列算法,MD5被广泛使用,可以用来把不同长度的数据块进行暗码运算成一个固定位位的数值(通常是128位)。

  • SHA-1:与 DSA 公钥算法相似,安全散列算法1(SHA-1)也是由 NSA 设计的,并由 NIST 将其收录到 FIPS 中,作为散列数据的标准。它可产生一个 160 位的散列值。SHA-1 是流行的用于创建数字签名的单向散列算法。

  • MAC(Message Authentication Code):消息认证代码,是一种使用密钥的单向函数,可以用它们在系统上或用户之间认证文件或消息,常见的是HMAC(用于消息认证的密钥散列算法)。

  • CRC(Cyclic Redundancy Check):循环冗余校验码,CRC校验由于实现简单,检错能力强,被广泛使用在各种数据校验应用中。占用系统资源少,用软硬件均能实现,是进行数据传输差错检测地一种很好的手段(CRC 并不是严格意义上的散列算法,但它的作用与散列算法大致相同,所以归于此类)。

数字签名

数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。

数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。

数字签名是非对称密钥加密技术与数字摘要技术的应用。

真实实例

案例来源于What is a Digital Signature?

1. Alice 给 Bob发送消息

Alice拥有Bob的公钥,利用Bob的公钥对Message加密,Bob收到后,利用自己的私钥进行解密。获得Message。

2.数字签名

第二次,Bob想要给Alice发送消息,并且用数字签名,保证自己的消息不被伪造和篡改。

首先,Bob对想要发送的消息,进行Hash,得到Digest,然后对Digest用自己的私钥进行签名,这样就得到了数字签名。

3. Bob给Alice发送消息

Bob将自己的数字签名和消息打包一起发给Alice。

4.Alice收到Bob来信

Alice将获得的数字签名,用Bob的公钥进行解密,得到了摘要,证明此信发自Bob。

同时,对消息本身进行Hash也得到一个摘要,看两个摘要是否一致,如果一致,证明消息未经篡改。

5. 黑客来了

这时候,一个黑客Ben,篡改了Alice电脑上Bob的公钥,替换成了自己的公钥,并且利用自己的私钥同样的给Alice发出了消息。

Alice对一切并不知情,被骗了!

6. CA证书

Alice被骗后,要求Bob去CA申请证书,保证自己下次不再被骗。Bob申请了数字证书。

7. 黑客消失了

Alice安装了Bob的证书,证书由电脑根CA证书,保证了知道公钥中对应的是Bob还是Ben。