. Table of Contents

1:前言 Perface

  1. 什么是数字签名,数字签名的作用是什么?
  2. 什么是数字证书,数字证书解决了什么问题?
  3. 什么是对称加密和对称加密,区别是什么?
  4. 非对称加密公私钥都可加密,那什么时候用用公钥加密,什么时候用私钥加密?
  5. 为什么要对数据的摘要进行签名,而不是计算原始数据的数字签名?

加密 encrypt 解密 decrypt

  1. Summary 对称加密

2:数字签名 digitial signature

A —-(sign)—-> B

2.1 什么是数字签名

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

1: 数字签名是公钥密码的逆应用:用私钥加密数据,公钥解密数据。 2: 用私钥加密的信息称为签名,只有拥有私钥的用户可以生成签名 signature。 3: 用公钥解密签名称为验证签名,所有拥有公钥的用户都可以验证签名。

数字签名图解

2.1.1 生成数字签名

一般来说,不直接对消息进行签名,而是对消息的哈希值进行签名,步骤如下:

  1. 对消息进行 hash 计算,得到 hash 值;
  2. 发送者利用私钥对 hash 值进行加密,生成签名;
  3. 将签名附在消息后面,一起发送出去。

2.1.2 验证签名

  1. 消息接收者收到消息之后,提取消息中的签名;
  2. 用公钥进行 decrypt,得到哈希值 1;
  3. 对消息的正文进行 decrypt,得到哈希值 2;
  4. 比较哈希值 1 和哈希值 2,如果相同,则校验成功。

2.2 数字签名算法(摘要算法 digest)

摘要算法 是将一段任意长度的数据转换为一个定长,不可逆的数字,其长度通常在 128~256 之间。

MD5 生成 128 位摘要, SHA1 生成 160 位摘要,MD5 速度更快,SHA1 安全性更高。

[md5 加密解密] https://github.com/lppgo/my_test/blob/master/000_utils/util1.md

[sha1:]

1
2
3
4
5
6
func main() {
    h := sha1.New()
    h.Write([]byte("hello,sha1"))
    l := fmt.Sprintf("%x", h.Sum(nil))
    fmt.Println(l)
}

3:数字证书 (Digital Certificate, CA)

公钥是公开的并且可以自行导入到电脑,如果有人比如 C 偷偷在 B 的电脑用自己公钥替换了 A 的公钥,然后用自己的私钥给 B 发送 Email,这时 B 收到邮件其实是被 C 冒充的但是他无法察觉。这种情况安全漏洞的根源就是公钥很容易被篡改。

  1. 首先 A 去找"证书中心"(certificate authority,简称 CA),为公钥做认证。证书中心用自己的私钥,对 A 的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate): CA给A颁发的数字证书

  2. A 在邮件正文下方除了数字签名,另外加上这张数字证书: A发给B的消息结构

  3. B 收到 Email 后用 CA 的公钥解密这份数字证书,拿到 A 的公钥,然后验证数字签名,后面流程就和图 1 的流程一样了,不再赘述.

几点疑惑: (1). 假设数字证书被伪造了呢? 答案:是的,传输中数字证书有可能被篡改。因此数字证书也是经过数字签名的,上文说道数字签名的作用就是验证数据来源以及数据完整性!B 收到邮件后可以先验证这份数字证书的可靠性,通过后再验证数字签名。 (2). 要是有 1 万个人要给 B 发邮件,难道 B 要保存 1 万份不同的 CA 公钥吗? 答案:不需要,CA 认证中心给可以给 B 一份“根证书”,里面存储 CA 公钥来验证所有 CA 分中心颁发的数字证书。CA 中心是分叉树结构,类似于公安部->省公安厅->市级派出所,不管 A 从哪个 CA 分支机构申请的证书,B 只要预存根证书就可以验证下级证书可靠性。 (3). 如何验证根证书可靠性? 答案:无法验证。根证书是自验证证书,CA 机构是获得社会绝对认可和有绝对权威的第三方机构,这一点保证了根证书的绝对可靠。

4:对称加密和非对称加密

对称加密算法只是为了区分非对称加密算法。其中鲜明的特点是对称加密是加密解密使用相同的密钥,而非对称加密加密和解密时使用的密钥不一样。对于大部分情况我们都使用对称加密,而对称加密的密钥交换时使用非对称加密,这有效保护密钥的安全。非对称加密加密和解密密钥不同,那么它的安全性是无疑最高的,但是它加密解密的速度很慢,不适合对大数据加密。而对称加密加密速度快,因此混合使用最好。

4.1 对称加密

对称加密

4.1.1 DES

一共有三个参数入口(原文,密钥,加密模式)。

4.1.2 AES

高级加密标准,新一代标准,加密速度更快,安全性更高。 AES 加解密示例

4.1.3 对称加密特点

  1. 密钥管理: 比较难,不适合互联网,一般用于内部系统
  2. 安全性:中
  3. 加密速度: 比非对称加密速度快得多,适合大量数据的加解密

4.2 非对称加密

一般是私钥,公钥进行加解密。分为公钥(public key)和私钥(private key).公钥可以公开,而私钥自己保存。

非对称加密

4.2.1 RSA

rsa 进行加解密,数字签名

4.2.2 DSA

4.2.3 ECC

4.2.4 非对称加密特点

  1. 密钥管理: 比较容易
  2. 安全性:高
  3. 加密速度: 比较慢,适合 小数据量 加解密或数据签名

5:总结

代码实现:https://github.com/lppgo/my_test/tree/master/033_%E5%8A%A0%E8%A7%A3%E5%AF%86

5.1 散列算法(摘要算法)比较

名称安全性速度其他
MD5
SHA1

5.2 对称加密算法比较

名称密钥长度运行速度安全性资源消耗
DES56 位较快
3DES112 或 168 位
AES128,192,256 位

5.3 非对称加密算法比较

名称安全性运行速度资源消耗
RSA
ECC