旧游无处不堪寻
无寻处,惟有少年心
密码学

讲到计算机密码学,就不得不从网络的发展说起,网络初期,主要用于科学研究,只在几个大学之间互联网络,使得设计之初并没有考虑到数据传输安全问题。
随着网络发展,特别是从网络应用于军事,再到后来进入人们的日常生活,网络安全问题日益突出,从而发展出计算机密码学。
到目前为止,不论是系统开发还是应用开发,只要有网络通信,很多信息都需要进行加密,以防止被截取、篡改。所以了解密码学的相关知识,了解在何时使用何种密码技术,已经成为开发人员必不可少的知识。
本篇文章将会科普一下有关密码学的相关知识。

基本术语


  1. 明文: 原始信息
  2. 密文: 加密之后的信息
  3. 加密: 将明文转换成密文的过程
  4. 解密: 将密文转换成明文的过程
  5. 加密算法: 用于加密的算法
  6. 密钥: 用于加密或解密的工具

密码学发展阶段


  • 第一阶段
  1. 密码学在这一阶段不是科学,是艺术
  2. 特点是数据的安全基于算法的保密
  • 第二阶段
  1. 计算机使得基于复杂计算的密码成为可能
  2. 特点是数据的安全基于密钥的保密
  • 第三阶段
  1. 提出公开密钥体系
  2. 公钥密码使得发送端和接收端无密钥传输的保密信息成为可能

加密算法分类


根据使用密钥的个数可分为:

  1. 单密钥算法共享密钥算法对称加密算法
  2. 双密钥算法公开密钥算法非对称加密算法

对称加密


  1. 也称为单密钥加密共享密钥加密
  2. 发送方和接收方共享相同的密钥
  3. 是 20 世纪 70 年代公钥加密之前仅有的加密类型

对称加密算法包括: DES 加密算法、3DES 加密算法和 AES 加密算法等。

非对称加密


微积分是现代数学的分水岭,非对称加密算法是密码学的分水岭

  1. 也称为双密钥加密公开密钥加密
  2. 解决了密钥分发的安全性问题
  3. 巧妙运用数论概念
  4. 与对称加密互为补充,而不是替代(与对称加密相比,运算慢 100 倍左右)

最著名的非对称加密算法: RSA 加密算法(由 MIT 三个教授提出)。

  • 公钥:任何人都可以知道,可以用来加密消息验证签名
  • 私钥:只能接收者知道,可以用来解密消息进行签名

现代计算机通讯加密方式


通过非对称加密分发密钥,之后的信息通过对称加密算法进行加密。

数字签名和认证


认证

问:为什么需要消息认证?
答:消息在传递过程中可能被篡改,为了消息的完整性验证。(要注意认证只是为了消息的完整性,而不是加密性)
我们可以通过短字符串追加到原消息之后,用以认证该消息。

获取短字符

散列函数(哈希函数):可以将变长字符串转为定长字符串的函数。如 MD5,SHA1,SHA256 等算法。
特点:

  1. 易计算
  2. 单向性
  3. 抗碰撞性(MD5SHA1 现在都不安全了,最好使用 SHA256 等更为安全的算法进行散列操作)

数字签名:

数字签名是笔迹签名的模拟。
特征:

  1. 可以验证作者
  2. 可以验证内容
  3. 必须由第三方验证以解决争议
    因此,数字签名包含了认证功能。
    签名过程就是先通过哈希算法计算出信息摘要,再使用私钥对摘要进行签名。
    通过数字签名我们可以保证消息是由正确的人所发送的。

CA(Certificate Authority)


通过非对称加密可以解决用于对称加密的密钥分发的问题,但是又引入了另一个问题,如何保证我们分发出去的公钥是未被篡改的?
我们可以通过 CA 颁发的数字证书来解决此问题。
CA 是可信任的颁发证书的服务器
世界上存在很多 CA,他们以树形结构组织。
CA 使用私钥来签名证书, 我们使用 CA 的公钥来验证证书的合法性。如果合法则从证书上提取公钥,否则认为证书有问题。
我们常用的是 X.509 格式证书:

  1. 基于公钥加密和数字签名
  2. 为用户提供公钥证书
  3. 常用于 IPS TLS/SSL 等地方

我们可以看一下使用数字证书的实例:https
第一阶段:算法协商与传递数字证书

  1. 客户端向服务器发起请求建立 https 链接,告知服务器客户端可以使用的对称加密算法,密钥交换算法以及支持的哈希函数
  2. 服务器收到请求,确定通信使用的对称加密算法,密钥交换算法以及哈希函数并向客户端发送数字证书

第二阶段:客户端校验证书,生成并传递通信密钥

  1. 客户端根据操作系统内置的受信任 CA 列表对证书进行校验。若校验证书合法,就读取其中的公钥。否则断开连接
  2. 客服端生成加密密钥
  3. 客户端使用公钥加密通信密钥,传输给服务器
  4. 服务器使用私钥解密加密的通信密钥

第三阶段:服务器获取通信密钥,双方进行通信

  1. 客户端使用通信密钥加密要传递的信息
  2. 服务器获取加密的信息,使用通信密钥解密,生成响应信息,使用通信密钥加密并回传给客户端

至此一个 https 请求响应完成。

关于申请 TLS 证书,要经过如下三部

  1. 在你的服务器上,生成一个 CSR 文件(TLS 证书请求文件,TLS Certificate Signing Request)
  2. 使用 CSR 文件,购买 TLS 证书
  3. 安装 TLS 证书

也就是说,你在第二步得到的证书不能用在另一台服务器上。
如果你需要这样做,就必须以其他格式输出证书。
比如,IIS 的做法是生成一个可以转移的 .pfx 文件,并加以密码保护。