一只海星的主页

关于加密解密SSL/TLS,对称非对称、公钥私钥、签名验签你想知道的加密全在这里

背景

只要做程序开发、特别是网络传输相关的内容,总是绕不开加密,一直想把对称/非对称加密、SSL/TLS、公钥、私钥、签名、验证签名、openssl、x509、crt、key、crs等等这些概念统一的梳理一下,就当是复习功课,也供大家入门参考,本章绝大部分内容均来自网络。

名词简介

对称加密:使用相同密钥与算法进行加解密运算的算法就叫做对称加密算法!
非对称加密:就是不相同密钥加解密算法。详细参考非对称加密章节介绍
SSL:安全套接层(secure sockets layer)主要是在网络层(TCP)和应用层(http)之间做加密。
TLS:传输层安全(transport layer security)TLS 是 SSL 的继任者,两者可以看做一样的东西。
公钥:非对称加密中公开的密钥,谁都能拿到。
私钥:非对称加密中的私有的唯一持有的密钥。
签名:用私钥加密数据的过程叫签名。
验签:用公钥解密数据的过程叫验证签名。
openssl:目前最流行的 SSL 密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS 协议的实现。
CA:证书颁发机构(CA, Certificate Authority)即颁发数字证书的机构。是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
x509:X.509 是密码学里公钥证书的格式标准。上面的CA就是这个标准。
CRT: certificate的缩写,即证书。X.509的证书文件,一般以.crt结尾。
PEM – Privacy Enhanced Mail,打开看文本格式,以”—–BEGIN…”开头, “—–END…”结尾,内容是BASE64编码.
Apache和*NIX服务器偏向于使用这种编码格式.
DER – Distinguished Encoding Rules,打开看是二进制格式,不可读.
Java和Windows服务器偏向于使用这种编码格式
CSR: 是Certificate Signing Request的缩写,即证书签名请求,这不是证书,可以简单理解成公钥,生成证书时要把这个提交给权威的证书颁发机构。
KEY:私钥。

MD5与SHA-1:散列函数也叫做HASH函数,主流的散列算法有MD5与SHA-1。散列函数的主要任务是验证数据的完整性。通过散列函数计算得到的结果叫做散列值,这个散列值也常常被称为数据的指纹(Fingerprint)也叫数字签名。

一、加密简介

1.为什么要加密

定义一个很简单的场景,你出差在外谈判要和主管通信,加密线路搞起来!
主要需求下:
1. 确定消息不被第三方看到! —数据私密性
2. 确定消息来自主管,不能被假主管骗! —数据来源认证
3. 确定消息没被修改,不能被假主管骗! —数据完整性保护
4. 确定主管发过这个消息给我,这个锅我不背! —不可否认性

密码学算法主要分为两个大类,对称加密算法和非对称加密算法!

2.对称加密

这个很好理解,主要流程如下

主流的对称加密算法有:
* DES(56位)
* 3DES (168位)
* AES (128位)      
AES 192 AES 256 AES 512
* Blowfish

下面我们总结一下对称加密的优缺点,
优点
* 速度快
* 加密相对安全
* 加密紧凑(不会发生加密前与加密后文件大小相关太大)

缺点
* 随着参与者数量的增加,密钥数量急剧膨胀((n×(n-1))/2)(一万个员工都需要与老板进行加密通信,每个人的密钥都必须不一样)
* 因为密钥数量过多,对密钥的管理和存储是一个很大的问题
* 不支持数字签名和不可否认性(不能认证数据是否完整,不支持身份认证)

实际中,一般是通过RSA加密AES的密钥,传输到接收方,接收方解密得到AES密钥,然后发送方和接收方用AES密钥来通信。

3.非对称加密

加密和解密用的密钥是不同的,这种加密方式是用数学上的难解(一个素数积求因子)问题构造的,构造一对密钥,一般是公钥和私钥,公钥和私钥都可以用来加密数据,公钥加密可以用私钥解开,私钥加密可以用公钥解开。
用一个很好的比喻就是一把唯一的锁(私钥)和可以复制的N把钥匙(公钥)
公钥加密数据,然后私钥解密的情况被称为加密解
私钥加密数据,公钥解密一般被称为签名和验证签名

因为公钥加密的数据只有它相对应的私钥可以解开,所以你可以把公钥给人和人,让他加密他想要传送给你的数据,这个数据只有到了有私钥的你这里,才可以解开成有用的数据,其他人就是得到了,也看懂内容.同理,如果你用你的私钥对数据进行签名,那这个数据就只有配对的公钥可以解开,有这个私钥的只有你,所以如果配对的公钥解开了数据,就说明这数据是你发的,相反,则不是.这个被称为签名.
主流的非对称加密算法有:
* RSA     加密和签名
* DSA     签名
* ElGamal

优点:
* 安全,因为不必发送密钥给接受者,所以非对称加密不必担心密钥被中途截获的问题
* 密钥数目和参与者数目相同,没有复杂的密钥分发问题
* 在交换公钥之前不需要预先建立某种信任关系

缺点:
* 加密速度很慢
* 密文会变长(案例:若1GB大小文件,加密后会变成1.5GB左右)

实际应用中,一般都是和对方交换公钥,然后你要发给对方的数据,用他的公钥加密,他得到后用他的私钥解密,他要发给你的数据,用你的公钥加密,你得到后用你的私钥解密,这样最大程度保证了安全性.

那么问题来了,对称加密不能解决认证和数据完整性问题,非对称加密又慢且长,怎么玩???

4.摘要函数

简单说,就是一段不论长度的数据,按照某个算法的出一个固定长度的值,就是它的摘要,也叫数字签名,不能和上面的那个签名混淆,我们把它叫做这段数据的数字唯一识别码更合适。只要原始数据改动一点点,不论多小,最后的摘要值都会发生巨大的变化,从而保证数据完整性。

特点:
* 输入一样,输出必须相同
* 雪崩效应:输入的微小改变,将会引起结果的巨大改变
* 定长输出:无论原始数据是多大,结果大小都相同的
* 加密过程不可逆,无法根据特征码还原原来的数据

主流的单向加密算法:
* Md4
* Md5
* SHA1 SHA192 SHA256 SHA384
* CRC-32

  实际应用过程中,因为需要加密的数据可能会很大,进行加密费时费力,所以一般都会把原数据先进行摘要,然后对这个摘要值进行加密,将原数据的明文和加密后的摘要值一起传给你.这样你解开加密后的摘要值,再和你得到的数据进行的摘要值对应一下就可以知道数据有没有被修改了,而且,因为私钥只有你有,只有你能解密摘要值,所以别人就算把原数据做了修改,然后生成一个假的摘要给你也是不行的,你这边用密钥也根本解不开.

那么问题又来了,非对称加密都依赖对方的公钥,而公钥是在网上传输的,极有可能被黑客替换,导致你在和一个假扮成你主管的黑客在通信,怎么办?

5. PKI (Public Key Infrastructure 公共密钥基础设施) 包含CA

为了解决上个章节防止公钥被替换的问题,我们需要一个公证方来做这个事,任何人都可以找它来确认公钥是谁发的.这就是CA,CA确认公钥的原理也很简单,它将它自己的公钥发布给所有人,然后一个想要发布自己公钥的人可以将自己的公钥和一些身份信息发给CA,CA用自己的密钥进行签名.然后这个包含了你的公钥和你的信息的文件就可以称为证书文件了.这样一来所有得到一些公钥文件的人,通过CA的公钥解密了文件,如果正常解密那么机密后里面的信息一定是真的,因为加密方只可能是CA,其他人没它的密钥啊.这样你解开公钥文件,看看里面的信息就知道这个是不是那个你需要用来加密的公钥了.

PKI(Public Key Infrastructure ) 即”公钥基础设施”,是一种遵循既定标准的密钥管理平台,它能够为所有网络应用提供加密和数字签名等密码服务及所必需的密钥和证书管理体系,简单来说,PKI就是利用公钥理论和技术建立的提供安全服务的基础设施。完整的PKI系统必须具有权威认证机构(CA)、数字证书库、密钥备份及恢复系统、证书作废系统、应用接口(API)等基本构成部分,构建PKI也将围绕着这五大系统来着手构建,其中最重要的就是CA认证机构!

CA认证标准是X.509标准,CA具体内容包括,

公钥和证书的有效期

  • 证书的合法拥有者
  • 证书该如何使用
  • CA信息
  • CA签名的检验码
  • CRL 证书撤销列表

总结,CA证书最主要的功能就是认证我们要访问的服务器公钥有权威性 (在我们的案例中就是认证主管的公钥没有被黑客修改过,嘿嘿)

PKI的两种具休实现

(1). TSL/SSL 都符合 X.509标准

(2). OpenGPG

实际应用中,一般人都不会找CA去签名,因为那是收钱的,所以可以自己做一个自签名的证书文件,就是自己生成一对密钥,然后再用自己生成的另外一对密钥对这对密钥进行签名,这个只用于真正需要签名证书的人,普通的加密解密数据,直接用公钥和私钥来做就可以了。

PS:这里有一个问题,如果CA中心的私钥被泄露的怎么办?换一个!又不止你一家,从可信列表删除就ok。

二、SSL/TLS简介

1. SSL通信流程


通过TCP/IP协议模型我们可以看出,SSL协议处于应用层与传输之间,下面我们主要说明https主要的实现过程:

具体说明:

  • Client 能互联网下载CA的公钥,用于验证Server身份
  • Server 通过加密算法生成一对密钥,将公钥发给CA认证机构,做数字证书
  • CA 通过自己的私钥加密 Server 公钥并加上自己的数字签名后,将生成的数字证书发给Server
  • Client 与 Server 通TCP的三次握手建立连接
  • Client 发出HTTP的报文请求,并和Server协商使用哪种算法加密
  • Server 响应报文并将公钥(CA证书)发送给客户端
  • Client 能通过CA的公钥解密CA证书,得到Server的公钥和数字签名,Client 通过散列函数算出Server公钥的数字签名与得到的数字签名对比,来验证Server身份,验证成功并发送数据请求
  • Server 处理请求,并根据Client请求的资源类型,来访问相关资源做出响应报文,并记录日志
  • Client 与 Server 通过TCP的四次挥手断开连接,通信完成

2. SSL协议的握手过程

开始加密通信之前,客户端和服务器首先必须建立连接和交换参数,这个过程叫做握手(handshake)。

假定客户端叫做爱丽丝,服务器叫做鲍勃。
握手阶段分成五步。

第一步,爱丽丝给出协议版本号、一个客户端生成的随机数(Client random),以及客户端支持的加密方法。

第二步,鲍勃确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数(Server random)。

第三步,爱丽丝确认数字证书有效,然后生成一个新的随机数(Premaster secret),并使用数字证书中的公钥,加密这个随机数,发给鲍勃。

第四步,鲍勃使用自己的私钥,获取爱丽丝发来的随机数(即Premaster secret)。

第五步,爱丽丝和鲍勃根据约定的加密方法,使用前面的三个随机数,生成”对话密钥”(session key),用来加密接下来的整个对话过程。

上面的五步,画成一张图,就是下面这样。

至此,我们用SSL/TLS实现了我们基于安全的全部需求!

参考

加密、解密及OpenSSL 详解
openssl基本原理 + 生成证书 + 使用实例-测试场景使用
openssl、x509、crt、cer、key、csr、ssl、tls 这些都是什么鬼?
AES加密算法的详细介绍与实现

发表评论

邮箱地址不会被公开。 必填项已用*标注