常见概念:加密、解密、签名、验签、摘要、编码、公钥、私钥

编码

不同编码规则对应不同编码表,常见编码方式:ASCII码,base64编码。
image.png

信息进行编码时 ,没有信息损失 任何人都能通过编码方式对信息进行编码。

摘要

摘要是指 通过一系列的变化和运算使得输出的大小固定,输入随意,也就是“压缩”了输入。但要注意这种压缩是不可逆的!散列算法是一系列的函数运算,且过程是不可逆的。它有这几个特点,第一,同一输入得到的输出是唯一的;第二,输出的大小是固定的;第三:不可能从输出得到输入的任何信息。
消息摘要算法(Message-Digest Algorithm),又称为密码散列函数(cryptographic hash function (CHF)),可以将任意长度的字节码数据通过哈希算法计算出一个固定大小的结果。常用的消息摘要算法有 MD5、SHA-1、SHA-2 系列(包括 SHA-256、SHA-512 等)
使用场景:

  • 对用户的登录密码使用消息摘要算法得到哈希值后再存储到数据库,即使数据库被黑客攻击,拿到所有的数据,也很难获得密码的原始值。这相对明文存储密码来说更加安全。当然,直接使用哈希值存储也是不安全的,特别是对于一些弱密码,黑客可以通过彩虹表轻松的查到对应的原始值。所以通常不会直接存储哈希值,而是经过一些处理,例如加盐、HMAC 等方式。
  • 对比两个文件是否一致,只需要对比两个文件的消息摘要是否一致即可,无需按字节一个个去对比。例如百度网盘曾经就是用文件的 MD5 来判断新上传的文件是否已存在,如果已经存在则不需要重复上传和存储,达到节省空间的目的。
  • 用于数字签名(Digital Signature)

对信息计算摘要值,有信息损失,例如 md5 摘要,sha1 摘要。
image.png

加密

对信息进行加密使其无法被监听者获知内容,没有信息损失。例如:AES、DES、RSA。
image.png
密钥与加密算法
密钥是加密算法的输入参数,加密算法使用密钥加解密,但是密钥并不是由加密算法本身生成的。
密钥与加密算法没有直接的关系,密钥实质是很大的整数,但不同的加密算法对密钥有不同的要求。比如对称加密算法 AES128,要求密钥是 128 位的整数,再如非对称加密算法 RSA1024,要求密钥是 1024 位的整数,且必须是质数,这些大整数都是由随机数生成,与加密算法无关。

公钥

公钥就是两个数字,e(e = 65537,e > 1 且与 ø(n) 互质,ø(n) 为欧拉函数),n(n = p q,p、q 为质数),用于验签或加密。一般不说用公钥解密,说用*公钥验签。例如 RSA 公钥。

私钥

私钥就是两个数字,d(e 对于 ø(n) 的逆元,ø(n) 为欧拉函数)、n(n = p q,p、q 为质数),用于签名或解密。一般不说用私钥加密,说用*私钥签名

公钥与私钥

在数学上没有区别,都是一对数字,取决于将哪一组数字公开。公钥加密的内容要使用私钥解密;私钥加密的内容要使用公钥解密。私钥要自己保护好,不得泄露;公钥可以公开在互联网上,任何人都可以用它来加密信息,当然加密内容只有私钥能够解出来。
image.png

签名

计算信息的摘要值,用私钥对摘要值进行签名,生成一个签名值,签名算法有 RS256 等。
加密是为了防止信息被泄露,而签名是为了防止信息被篡改。
image.png

验签

利用公钥对签名信息进行验证。拿到一段信息和它的签名值,需要先计算信息摘要值,用公钥解密签名值,和计算的信息摘要值进行比对。
image.png

对称加密

AES 高级加密标准

对称加密的 “对称” 就是指加密和解密使用同一个密钥,对称密钥又称为共享密钥(Pre-Shared key,PSK)。由于对称加密只有一个密钥,因此一定要保证密钥的安全,才能保证通信的机密性。
对称加密的原理很简单。比如,Bob 给 Alice 发消息,在此之前双方先约定好使用一个对称密钥,在双方通信的过程中传输的消息全是密钥加密后的密文,除了 Bob 和 Alice 之外,没有人能够解密。即使有黑客窃听,看到的也只是乱码,因为黑客没有密钥,无法解密密文,因此对称加密实现了机密性。
image.png
对称加密看上去实现了通信的机密性,但是却存在密钥交换的问题,即密钥如何安全的传递给对方。在上图中,我们假设黑客没有对称密钥,所以即使窃听到密文也无法解密。但是如果黑客在密钥传递的途中窃取了密钥,如下图所示,那么他就可以随意加解密收发的数据,通信过程的机密性就荡然无存了。
image.png
对称加密无法解决密钥安全交换的问题

非对称加密

非对称加密也叫公钥加密算法。它的 “不对称” 在于它有两个密钥,一个叫 “公钥”,可以交付给任何人(往往通过数字证书的方式交付),另一个叫 “私钥”,必须严格保密,公钥和私钥是 “一对”,称为密钥对(key pair),且具有数学关系。
可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称为公钥和私钥。两者之间有数学相关,该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)。
和对称加密的密钥一样,非对称加密的公钥和私钥也是都可以用来加密与解密的。不过,公钥加密后只能用私钥解密,反过来,私钥加密后也只能用公钥解密,所以,非对称加密具有 “单向” 性”。
非对称加密究竟是如何解决了 “密钥交换” 的问题呢?很简单:因为非对称加密具有 “单向性”,所以公钥加密后只能用私钥解密。又因为用于密钥交换的是公钥,私钥由持有者严格保密,所以黑客是拿不到私钥的,拿不到私钥就没法解密。
举个例子,Alice 生成了一对密钥,给 Bob 和 Eve 每人一把公钥,而私钥则自己持有。这样当 Bob 和 Eve 给 Alice 发消息的时候就可以用公钥加密,Alice 则使用自己的私钥解密,因为黑客 Eve 是无法拿到 Alice 的私钥的,所以即使他窃听到密文也无法解密。
image.png
在上面的图中,我们假设 Bob 只是单向的给 Alice 发消息,因此需要 Alice 生成一对密钥对,私钥自己保存,公钥发给 Bob。那么同理,如果 Alice 要给 Bob 发消息,就需要 Bob 的公钥,所以 Bob 同样也要生成一对密钥对,私钥自己保存,公钥发给 Alice。

混合加密

对称加密速度快,但密钥交换不够安全,非对称加密保证了密钥交换的安全,但速度又太慢。
混合加密方式融合了对称加密和非对称加密两种方式,兼具了性能和安全,保证了通讯的机密性,但不代表绝对的安全。
混合加密方式WebRTC 的 DTLS-SRTP 大致原理:
通信双方选择非对称加密算法,比如RSA,准备进行安全的密钥交换。
通信双方使用随机数生成对称加密算法的会话密钥,用公钥加密后发给对方。
通信双方各自用私钥解密,得到堆成加密的会话密钥。
之后双方全部使用对称加密进行通信。
由于会话密钥通过非对称加密安全传输,所以很难被黑客破解。而且会话密钥一般是一次一密,是一个会话级别的随机数,所以即使被破解也只是本次会话受影响。
在上文介绍非对称加密的图中,黑客 Eve 确实是拿不到 Alice 的私钥了,但是他可以截获到 Alice 发给 Bob 的公钥,并且黑客 Eve 也可以生成一对密钥,私钥自己保存,然后把公钥发给 Alice,让 Alice 误以为这是 Bob 的公钥。也就是说黑客 Eve 对 Alice 扮演了 Bob 的角色,他的这种攻击行为称为中间人攻击。
该如何解决中间人攻击的问题呢?一个核心的解决这个问题的思想是:认证消息发送者的身份,也就是证明消息确实是你发的。

参考

https://www.freebuf.com/articles/database/303713.html
https://docs.authing.cn/v2/concepts/cryptography.html