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

iOS要开始强制推行HTTPS了,你们都开始学习HTTPS的相关知识,网上不少博文一上来就讲对称加密,非对称加密,AES,RSA,和TLS和SSL协议。对于我这种没怎么深刻过网络层的人来讲全靠背!理解起来至关痛苦。尤为是对称加密,非对称加密,私钥加密,公钥加密,证书,数字签名,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种可能的组合。网络

密码:socket

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

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

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

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

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

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

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

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

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

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

非对称加密(公钥加密)


为何要有非对称加密?
对称加密没法知足如下条件:

  • 随着使用它的团体成员增长,团体中的成员要共享同一个密钥,所以出现问题的概率变大了
  • 咱们能够两两一个密钥,这样3我的就须要3个密钥,10我的就须要45个密钥,1000我的就须要49500个密钥!

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

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

数字签名


前面说过MAC就是一种电子签名,它可使用事先安全交换的 散列密钥验证真实性,虽然这种校验很是有用,但仍有不足,由于它仍然依赖于一个私有密钥。
借助于公钥密码,数字签名能够实现与现实生活中的手写签名相似,咱们能够利用公钥密码的非对称性设计出一种算法,使用私钥对信息进行签名,并使用对应的公钥验证它。
实际的方式依照选择公钥的验证密码而不一样,下面以RSA为例:
签名过程:
一、将须要签名的文档用散列函数获得散列。
二、将散列和一些元数据进行编码,例如使用的散列算法。
三、将编码使用私钥加密,其结果就是签名。
四、追加到文档中做为验证的依据。
验证过程:
一、接收方接收文档,并用相同的散列算法算出散列。
二、使用公钥解密,将散列解码出来。
三、对比散列算法是否正确,散列的值是否一致。
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: en.wikipedia.org/wiki/RSA
ECB:electromic codebook 电码本
CBC:cipher block chaining 加密块连接
IV:initialization vector 初始向量

个人简书主页:www.jianshu.com/users/b92ab…

相关文章
相关标签/搜索