《HTTPS权威指南》- SSL、TLS和密码学学习笔记

iOS要开始强制推行HTTPS了,大家都开始学习HTTPS的相关知识,网上很多博文一上来就讲对称加密,非对称加密,AES,RSA,和TLS和SSL协议。对于我这种没怎么深入过网络层的人来说全靠背!理解起来相当痛苦。尤其是对称加密,非对称加密,私钥加密,公钥加密,证书,数字签名,TLS和SSL是用来干嘛的,他们之间的关系,协议握手为啥要那么多,绕来绕去的,真是傻傻分不清楚。

这篇笔记就是为了理解上面所说的那些概念,知道上面提到的名词到底是啥意思,之间啥关系,以及最重要最重要的,为什么协议要那么多步骤,这些步骤存在的意思是什么,他为什么就能实现安全性?他又是怎样实现安全性的?

目录:

  • 网络层-OSI模型层
  • TLS和SSL之间的关系
  • 对称加密(私钥加密)
  • 非对称加密(公钥加密)
  • 数字签名
  • 协议
  • 名称简写及全称

网络层:


OSI模型层:

层号 OSI层 描述 协议示例
7 应用层 应用数据 HTTP、SMTP、IMAP
6 表示层 数据表示、转换和加密 SSL/TLS
5 会话层 多连接管理 -
4 传输层 包或流的可靠传输 TCP、UDP
3 网络层 网络节点间的路由与数据分发 IP、IPSec
2 数据链路层 可靠的本地数据连接(LAN) 以太网
1 物理层 直接物理数据连接(电缆) CAT5

TLS和SSL之间的关系:


SSL协议由Netscape公司开发
1995年年底发布SSL3
1996年5月TLS工作组成立,开始讲SLL从Netscape迁移至IETF
1999年1月TLS1.0面市,为了取悦Microsoft,协议进行了更名(从SSL更成TLS)
2006年4月,TLS1.1问世
...

对称加密(私钥加密)


概念:是一种混淆算法,能让数据在非安全信道上进行安全通信。为了保证通信安全,首先要得到双方都认可的加密算法和密钥(双方的密钥相同)
密钥与加密算法:
数据在非安全信道上进行安全通信。为了保证通信安全,要用到密钥加密算法
为何要密钥?
即使攻击者知晓了整个密码系统除密钥以外的所有情报,系统仍然应当能保证安全

  • 如果加密算法要得到广泛使用,就必须让其他人知道,当越来越多的人知道,那敌人知道的可能性就会增加。
  • 没有密钥的简单算法不便于在大群体中使用,每个人都可以解密所有人的通信。
  • 设计出优秀的加密算法非常困难,一种算法想要更安全,就得经过更多的曝光和审视。

如果加密算法足够优秀,攻击者只有一种方法,那就是尝试所有可能的解码密钥,俗称穷举密钥搜索(exhaustive key search),基于这一点,我们可以说密文的安全性完全取决于密钥,我们通过密钥长度来衡量加密强度,如128位的密钥有34*10^37种可能的组合。

密码:

  • 序列密码
    核心:生成一串称为密钥序列的无穷序列
    加密过程:将密钥序列中的1字节与明文序列中的1字节进行异或操作
    解密过程:因为异或操作可逆,将密文序列中的1字节与密钥序列中的相同字节进行异或操作。
    关键点:序列密码决不能第二次相同的密钥
    熟知的序列密码:RC4(简单,但以不再安全)
  • 分组密码
    核心:每次加密一整块数据,只要使用相同的密钥,每一个可能的输入组合都有唯一的输出。因此在输入上制造一个小变化(例如在任意一处变换1位),从而得到大量变体。
    加密过程:接受输入并生成看似杂乱无章的输出。
    问题1:只能使用它们加密长度等于加密块大小的数据。因此需要一个方法处理任意长度的数据(填充
    问题2:对于相同的输入,输出是相同的,这种特性使许多攻击成为可能。
    实践中的应用:使用分组密码模式的加密方案(后面有说明)来使用分组密码,来避免分组算法的问题,作为其他加密基元的基础来使用(例如散列函数,消息验证,伪随机数生成器,甚至序列密码)
    熟知的分组密码:AES
    • 填充
      追加额外的数据到明文的结尾,在TLS中,加密块的最后1字节包含填充长度,指示填充多少字节(不包含填充长度字节)

散列函数:
定义:任意长度的输入转化为定长度的输出,散列函数的结果成为散列,适用于密码学的散列函数有以下特性:

  • 单向性:给定一个散列,无法找到或者构造出生成它的信息。
  • 弱抗碰撞性:给定一条消息和散列,无法找到一条不同的消息具有相同的散列。
  • 强抗碰撞性:计算上无法找到两条散列相同的信息。

使用场合:以紧凑的方式表示比较大量数据,例如比较两个文件。经常被称为指纹,信息摘要(简单称为摘要)
熟知的散列函数:SHA1,SHA256

散列函数的强度最多只是散列长度的一半

消息验证代码:
在数据的散列与数据本身分开传输时(以防攻击者可以同时修改数据和散列),散列函数可以用于验证数据完整性。
用身份验证扩展了散列函数的密码学函数:

  • MAC:只有拥有散列密钥,才能生成合法的MAC
    通常与加密算法一起使用,如果没有MAC,那拦截者即使无法解码密文,也能修改密文。
  • 密钥的散列(keyed-hash):HMAC,将散列密钥和消息以一种安全的方式交织在一起。

分组密码模式:
为了加密任意长度的数据而设置的密码学方案。是分组密码的扩展。所以的分组密码模式都支持机密性。不过有些将其与身份验证连接在一起,有些模式会将分组密码直接转成序列密码。
它有多种输出模式(以下只举出2个):

  • 电码本模式(ECB)
    核心:是最简单的分组密码模式,它只支持数据长度正好是块大小的整数倍的情况,如果数据不满足这个条件就要事先填充。加密就是将数据按块大小切分,然后分别加密每一块。
    劣势:因为分组密码是确定的(输入相同,输出也相同),1、密文中出现的模式对应明文中出现的模式。2、攻击者可以发现信息是否重复。3、攻击者可以观察密文,并提交任意明文进行加密
  • 加密块链接模式(CBC)
    基于ECB,SSl和TLS的主要模式,整个过程开始于生成一个随机初始向量IV,长度与加密块相等,加密前,明文的第一块内容与IV进行异或操作,这一步对明文做了掩饰,并保证密文不尽相同。对于下一个加密块使用上一个块的密文作为IV,以此类推。

必须通过线路传输到接收端,这是解密必须的。

非对称加密(公钥加密)


为什么要有非对称加密?
对称加密无法满足以下条件:

  • 随着使用它的团体成员增加,团体中的成员要共享同一个密钥,因此出现问题的几率变大了
  • 我们可以两两一个密钥,这样3个人就需要3个密钥,10个人就需要45个密钥,1000个人就需要49500个密钥!

而非对称加密可以解决以上问题。
使用两个密钥,公钥和私钥,两个密钥之间存在一定的数学关系。
使用公钥加密,只有对应的私钥能解。
使用私钥加密,任何人都可以用他们相应的公钥解密(不提供机密性,可以用作数字签名)。
使用说明:你可以广泛并安全的分享你的公钥,那么任何人都可以想你发送信息,只有你可以阅读。如果他们使用各自的私钥签名,你还可以精确的知道消息出自何人之手。

注意:虽然公钥密码的属性非常有趣,但它非常缓慢,不适用于数据量大的场景,因此往往部署于身份验证和共享秘密的协商,这些秘密后续用于快速的对称加密。

数字签名


前面说过MAC就是一种电子签名,它可以使用事先安全交换的散列密钥验证真实性,虽然这种校验非常有用,但仍有不足,因为它仍然依赖于一个私有密钥。
借助于公钥密码,数字签名可以实现与现实生活中的手写签名类似,我们可以利用公钥密码的非对称性设计出一种算法,使用私钥对信息进行签名,并使用对应的公钥验证它。
实际的方式依照选择公钥的验证密码而不同,下面以RSA为例:
签名过程:
1、将需要签名的文档用散列函数得到散列。
2、将散列和一些元数据进行编码,例如使用的散列算法。
3、将编码使用私钥加密,其结果就是签名。
4、追加到文档中作为验证的依据。
验证过程:
1、接收方接收文档,并用相同的散列算法算出散列。
2、使用公钥解密,将散列解码出来。
3、对比散列算法是否正确,散列的值是否一致。
RSA的强度取决于加密,散列以及编码组件各自的强度。

协议


加密基元本身没有什么用,例如加密和散列算法。我们只有将这些元素组合成方案和协议才能满足复杂的安全需求。

实例场景:
Alice和Bob要通信。Mallory是个攻击者。
我们假设协议允许交换任意数量的消息。因为对称加密擅长对大量数据进行加密,所以选取我们最喜欢的AES算法来进行数据加密。使用AES,Alice和Bob可以安全的交换消息,Malloc看不到他们通信的内容。但是这还不够,因为Malloc还可以干其它事情,例如神不知鬼不觉的修改消息。为了解决这个问题,我们使用只有Alice和Bob知道的散列密钥计算每个消息的MAC,在发送消息的同时,也发送消息的MAC。这时Mallory再也不能修改消息了,然而他仍然可以丢弃或者重发任意消息。为了解决这个问题,我们扩展协议,为每条消息标记指定序号。最为重要的是,我们将序号作为MAC计算数据的一部分。如果发现序号出现空缺,就能知道消息丢了。如果发现序号重复,就检测重放攻击。为了得到最佳效果,我们使用某个特殊消息来标记会话结束。如果没有这个消息,Mallory能够悄悄的结束(截断)会话。如果所有措施以到位,Mallory最多只能做到阻止Alice和Bob与其他人通信。我们对此无能为力。

到目前为止,有一大块缺失:Alice和Bob如何协商得到需要的两个密钥(一个用于加密(AES的密钥),一个用于检测完整性(MAC的密钥)),同时还要当心Mallory?我们通过为协议添加两个步骤来解决这个问题:

  • 使用公钥密码对会话进行身份验证。
    举个例子,Alice生成一个随机数,要求Bob对其签名以证明真的是他,Bob也要求Alice做同样的事情。
  • 使用密钥交换方案对加密密钥进行秘密协商。
    举个例子,Alice可以生成所有密钥,使用Bob的公钥加密,再发送给Bob,这就是RSA密钥交换的工作方式。

最后我们协议完工时的状态是:

  • 以握手阶段开始,包括身份验证和密钥交换
  • 数据交换阶段,保存机密性和完整性
  • 以关闭序列结束。

站在宏观的角度看,我们的协议与SSL和TLS完成的工作相似。

名词简写及全称:


SSL:secure socket layer 安全套接字层
TLS:transport layer security 传输层安全
IP:internet protocol 网络协议
TCP:transmission control protocol 传输控制协议
PKI:public key infrastructure 公钥基础设施
OSI:open systems interconnection 开放系统互联模型
AES:advanced encryption standard 高级加密标准
MAC:message authentication code 消息验证代码
HMAC:hash-based message authentication 基于散列的消息验证代码
CBC:cipher block chaining 加密块链接
RSA:https://en.wikipedia.org/wiki/RSA
ECB:electromic codebook 电码本
CBC:cipher block chaining 加密块链接
IV:initialization vector 初始向量

你可能感兴趣的:(《HTTPS权威指南》- SSL、TLS和密码学学习笔记)