Table of Contents

  1. 背景
  2. Why为什么需要加密
    1. 窃听
    2. 篡改/劫持(中间人攻击)
    3. 伪装
    4. 重放
    5. 抵赖
    6. 小结
  3. How如何使我们的数据更安全
    1. 保证机密性
      1. 对称加密
      2. 非对称加密
    2. 保证完整性
      1. 单向散列函数
    3. 保证真实性&完整性
      1. 消息认证码
    4. 保证完整性&真实性&不可否认
      1. 数字签名
    5. 总结
  4. 综合应用实例:TLS
    1. TLS/SSL

背景

项目中有一个模块是Api Gateway,api网关在微服务架构中负责整个项目对外的接口,它封装了系统内部的架构,为客户提供定制的rest api调用访问。通常它包含身份认证、负载均衡、路由管理等功能。其中身份认证那部分team用的是hmac,发现自己对一些基本的加密技术并不是很了解,甚至没有一个基本的分类和认知,在网上看到有推荐《图解密码技术》,写的比较容易懂,一周每晚看一点就看完了。故梳理一下基本概念和使用场景,不做深入研究。(精力和智商有限)


Why为什么需要加密

古人云,知其然、知其所以然。学习技术也是,不光要知道它的原理,更要知道这个技术是为了解决什么问题而诞生的。复杂的业务场景推动了技术的进步,而不是技术的进步使复杂的事情变得简单。所以,要学会问–这个技术是为了解决什么问题?
谈到为什么需要加密,不得不总结一下数据在网络传输中遇到了一些挑战(以http访问为例)。

窃听

HTTP 本身不具备加密功能,所以传输过程中都是以明文方式发送。由于在网络的传输过程中,我们所发送的信息要经过许多的网络节点和设备,在这个过程中这些设备是可能会拦截我们的信息并且进行窃听的,直接通过一些常用的抓包工具就可以窃听未加密的网络传输信息。如果信息中存在敏感信息,如密码之类的,就会直接拿到

篡改/劫持(中间人攻击)

如果流量一旦被劫持,就可能被修改,http通常也无法确认消息的准确性。其中有一种攻击方式是中间人攻击:具体来说就是攻击者介入发送者和接收者的中间,对发送者伪装成接收者,对接收者伪装者成发送者,从而能在无需破解数字签名的前提下完成攻击。

伪装

例如攻击者伪装成真正的发送者,执行一些操作。

重放

是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。攻击者不用解密请求的内容,但如果知道这个请求的含义(url中api的名字通常会暴漏请求的含义),就可以做到攻击(加时间戳可以fix)。看到一个通俗易懂的例子:

  • A向服务器发送了一条请求(附带了签名并进行了加密),是像B打一笔钱。
  • 服务器接收到请求并执行了相应的操作。
  • 但是B拿到了这个流量,并重复的发给服务器。进行欺骗。

    抵赖

    发送方不真实的否认已经发送的消息。

    小结

    其实攻击者往往为了达到目的,不仅仅使用某一种方法,通常是组合拳,而且这些方法并不是完全独立了,也有相应的耦合。总的来说这些攻击都是在破坏信息的几个方面。

How如何使我们的数据更安全

保证机密性

发送方对消息进行加密,接收方解密,中途即使被窃听,由于缺少密钥,拿到的是乱码,不知道消息的内容。

对称加密

在对称加密中,只用同一个密钥来加密和解密信息。至于为什么可以用同一串数字加密和解密,加密算法基础是XOR(异或),加强版本有DES(已能被破解)、三重DES、AES、Rijndael等。现在用的大都是AES。

- 优:快
- 不足:密钥配送问题,对方如果要能解密你的信息,就必须把密钥发送给对方,中途一旦被其他人截胡,就可以直接解密之后你们的通信内容了。

非对称加密

考虑到对称加密的劣势,思考有没有一种方法是黑客即使在通信的过程中获取了你们传递的密钥也无法破译消息?非对称加密就解决了这个问题,现在广泛使用的是RSA算法。
(1)发送者只需要加密密钥。
(2)接收者只需要解密密钥。
(3)解密密钥不参与传输,所以不能被窃听者拿到。
(4)加密密钥被窃听者拿到也无所谓。

- 优:不用担心密钥配送问题,更好的保证了消息的机密性。
- 不足:加解密算法复杂,速度慢。解决了密钥配送问题,但无法防御中间人攻击,此外还需要确认B发来的公钥是否真的属于B(这就需要公钥证书)。

保证完整性

除了保证消息的机密性外,我们还要确保消息中途没有被修改过。

单向散列函数

就是我们工作中常用来比较两个文件是否相同的sha1,sha256,md5等。

保证真实性&完整性

消息认证码

消息认证码(MAC):将发送者和接收者之间的“共享密钥”和“消息”进行混合后计算出散列值。HMAC运算利用hash算法,以一个消息M和一个密钥K作为输入,生成一个定长的消息摘要作为输出。

(1)A和B事先共享密钥
(2)A使用密钥+消息计算MAC值
(3)A将消息和MAC两者同时发送给接收者B
(4)B也用共享密钥根据接收到的消息计算出一个MAC值
(5)B对比自己计算的MAC和接收的MAC值是否一致,若一致,则可以判断出消息是来自A,并且没有被篡改过。
在消息认证码中,A和B要使用同一个密钥,这个密钥是不能被攻击者拿到的,否则认证就没有作用了。这种存在密钥配送问题的解决方法,可以使用非对称密码(将共享密钥加密)、密钥分配中心等。
- 优:可以识别消息是否被篡改和发送者是否被伪装,同时保证了完整性和真实性。
- 不足:由于A和B拥有同样的密钥,可以计算相同的MAC,在出具借条的场景中无法使用,因为无法防止否认。

保证完整性&真实性&不可否认

数字签名

既然要具有不可否认性,就不能使用同样的密钥加密。思路是,用自己的私钥生成签名,验证者通过公钥验证但无法用此公钥生成同样的签名(私钥签名,公钥验证),这就是像非对称密码中对消息加密解密的相反过程(公钥加密,私钥解密)。此外,不管是数字签名还是非对称密钥,不可泄漏的密钥不能参与传输,只有一方持有。
(1)我们这次不使用消息直接进行签名,是因为消息不论多么长,散列值试固定了,所以对散列值进行签名更加简单。
(2)最后对比的是散列值:通过公钥解密签名后的消息的散列值和通过直接对消息计算得出的散列值。
-优:保证了完整性、真实性和不可否认性。
-不足:我们看到消息没有加密就发送了,无法保证机密性。因为数字签名确实不是保证机密性的。我们可以同时使用加密和签名组合的方法解决这个问题。在综合应用的时候会讲。

总结


综合应用实例:TLS

TLS/SSL

SSL/TLS是世界上应用最广泛的密码通信方法,它综合应用了对称密码、非对称密、数字签名、伪随机数生成器。具有消息加密,身份认证,防篡改等。
基本过程:

  • 客户端通过服务端证书得到了服务器的合法公钥,完成服务器认证。

  • 服务器通过客户端证书得到了客户端的合法公钥,完成客户端认证。(当需要客户端认证的时候)

  • 客户端和服务器生成了密码通信中使用的共享密钥。

  • 客户端和服务器生成了消息认证码中使用的共享密钥。是整个握手阶段出现的第三个随机数。

  • 客户端随机数、服务端随机数、预备主密码。根据预备主密码客户端和服务器- 通过约定好的单向散列函数生成同样的主密码。该主密码怎么参与后面的通信呢?作用如下:
    (1)作为对称密码的密钥进行消息的加密/解密。(客户端<–>服务器)
    (2)作为消息认证码的密钥,确认客户端和服务器的真实性和一致性。(客户端<–>服务器)

    密码技术 作用
    非对称加密(公钥密码) 加密预备主密码
    单向散列函数 伪随机数生成器
    数字签名 验证服务器和客户端证书
    伪随机数生成器 生成预备主密码
    单元格 单元格

关于证书的验证:
在使用非对称加密的时候,我们需要确认对方给我们的公钥确实是属于他的,这就需要一个第三方的认证机构。流程是这样的:

服务端生成密钥对,并在认证机构注册自己的公钥,认证机构用自己的私钥对服务端的公钥施加数字签名并生成证书,证书中包含了服务器的公钥和第三方机构的签名。客户端拿到证书,用机构的公钥验证签名,解密后的公钥和证书中的服务器公钥进行对比,确认服务端的公钥的合法性。就是相当于信任第三方机构的公钥,来验证客户的公钥的合法性。