在这篇文章中,我们想向您简要介绍一下 TLS(传输层安全),它是一种广泛用于与 PostgreSQL 结合用于加密客户端/服务器连接的技术。
什么是 TLS?
TLS 是“传输层安全性”的缩写,它是一种确保您通过 TCP 连接发送的任何数据免受攻击者攻击的方法。
要了解 TLS 的工作原理,您首先需要了解一些有关加密的内容。
对称加密
如果您有一个文本“我喜欢奶酪”并用英文字母表中的下一个字符替换每个字符(将 a 替换为 b,将 b 替换为 c,……,将 z 替换为 a),那么您就拥有了基本的对称加密。您可以将消息“ j mjlf diddtf ”传输给您的朋友,他们可以通过消息并将每个字符替换为前一个字符(将 b 替换为 a,将 c 替换为 b,… 将 a 替换为 z),他们将知道你最喜欢的零食。
在数学上,对称加密可以这样表示:
如果 enc(x, k)=e 是使用密钥 k 将 x 加密为 e 的函数,则使用反函数 enc^-1(e, k)=x使用 k 将 e 解密回 x。
这是一个极其简单的例子,而且很容易破解。有更复杂的对称加密数据的方法,除非您知道密钥,否则无法破解。对称加密的一个著名例子是第二次世界大战期间使用的 Enigma 机。虽然 enigma (III) 加密在第二次世界大战后期可以破解,但更高级的 enigma (IV) 加密直到今天仍然难以破解。
对称加密有两个实用性问题。一方面,您将需要许多不同的密钥(基本上每个连接一个),因此客户端 B 无法解密服务器发送给客户端 A 的任何内容,例如。另一方面,没有简单的方法可以将密钥本身安全地传达给新客户。
当您管理两个相互通信的服务器时,这不是问题,因为它们都受到高度信任,并且连接不会经常更改。您的客户(您对其硬件和软件几乎没有控制权)不能得到同等程度的信任,并且可能会定期添加新客户。
因此,为了让客户端能够发送和接收加密消息,您需要一些不同的东西。
非对称加密
非对称加密的基础是私钥和公钥的原理,它们一起被称为密钥对。两者通常来自同一组随机数,虽然公钥可用于加密数据,但只有私钥可用于再次解密。
这意味着您可以将您的公钥交给任何人,以便他们可以加密他们想要发送给您的内容,并且只有您才能使用私钥对其进行解密。
在数学上,非对称加密可以这样表示:
如果 enc(x, k_pub)=e 是使用公钥 k_pub 将 x 加密为 e
的函数,那么函数 dec(e, k_priv)=x 用于解密 e ,使用私钥 k_priv,回到 x。
就像对称加密一样,有一些非对称加密比其他加密更不安全,但我们现在不需要担心这一点。
重要的是我们有一种发送加密数据的方法,而不必用我们的密钥信任客户端。
签名验证
非对称加密的另一个好处是它不仅可以用于加密,还可以为数据附加签名。发送方可以计算数据的校验和,并使用他们的私钥对其进行加密以生成签名。接收方计算相同数据的校验和,并将其与发送方的校验和进行比较,后者是使用公钥从签名中解密的。
TLS 如何工作?
TLS 混合使用非对称和对称加密。请记住,理想情况下,对称加密需要为每个连接使用不同的密钥,并且密钥交换很难安全地进行。但同时,与非对称加密相比,对称加密更容易(即更快、更便宜)计算,并且仍然提供类似的安全性。
因此,非对称加密仅用于初始握手,以派生或交换随机密钥,该密钥将用于对称加密连接的其余部分。
创建和交换随机密钥有两种方式:
- 客户端随机生成密钥并使用服务器的公钥对其进行加密。在这种情况下,密码被加密发送到服务器。
- 双方就一个随机值达成一致,并使用这个随机值、他们自己的私钥和另一方的公钥得出一个共享的秘密。这种计算可以在双方完成并产生相同的密码,因此密码本身永远不需要传输。(这被称为 Diffie-Hellman 密钥交换)
第二种方法只有在双方都有密钥对时才有用。当您从计算机访问网站时,通常使用第一种方法,因为您无需使用密钥对即可访问 HTTPS 加密的网站。
如何使用非对称加密进行身份验证?
如果您已经知道给定服务器的公钥,那么您可以挑战他们以测试他们是否确实拥有匹配的私钥。使用已知的公钥,您可以加密随机消息并将其发送到服务器,要求它为您解密。如果已知公钥与服务器中安装的私钥匹配,那么服务器发回的解密消息也将匹配您最初加密的随机消息。
这意味着您可以相信服务器是真实的——否则,它不应该拥有与您已经知道的公钥匹配的私钥。这就是known_hostsssh 文件的工作方式。
但是,还有另一种验证另一方的方法。当您浏览网页时,您没有互联网上每台服务器的已知公钥列表。
因此,在第一次连接时,服务器会向您发送其公钥。但是您如何确定该密钥实际上属于您期望的服务器呢?毕竟,您可能正在尝试访问www.myimaginarydomain.com并且攻击者将您的呼叫转移到他们自己的服务器。
这个问题的解决方法很简单:www.myimaginarydomain.com可以使用已由私钥签名的公钥,该私钥的公钥已安装在您的系统上。这些公钥称为“证书颁发机构”(CA) 证书。有时它更复杂,因为 CA 证书本身几乎从不用于直接签署“最终用户”证书,而是用于签署中间证书,并且可以验证整个链。
例如,证书www.myimaginarydomain.com可能由“Imaginary Corporation CA”签名,该 CA 可能由“Imaginary Global Trust Corporation”签名。如果“Imaginary Global Trust Corporation”的证书是您的系统或浏览器的证书库的一部分,那么服务器交付的证书www.myimaginarydomain.com将被您的系统信任。
最后,只有当其他方的地址与证书中包含的地址匹配时,才会信任连接。如果www.myimaginarydomain.com使用了www.notmyimaginarydomain.com,不打算建立连接的证书。
TLS 世界中的术语
虽然很容易将我们刚刚谈到的所有内容都视为公钥和私钥对——事实上,除了一点元数据和签名之外,无非如此——某些术语经常被使用在 TLS 的上下文中使用。
- 公钥通常称为“证书”——有服务器证书,可用于识别服务器并向其发送加密消息,还有客户端证书,可用于做同样的事情,除了一切朝着客户的方向前进。
- TLS 上下文中的私钥通常简称为“密钥”。
- 签署其他证书的实体(公司或个人)称为证书颁发机构 (CA);如果您信任此 CA,则可以信任由他们签署的证书。
- 属于 CA 用于签署其他证书的私钥的公钥称为 CA 证书。
- 为了让 CA 签发证书,用户创建一个密钥和一个证书签名请求 (CSR) – CSR 包含公钥和该证书应用于的域名或 IP 地址。
- 将要使用证书的服务器的域名或 IP 地址包含在证书的通用名称 (CN) 字段中。对于客户端证书,CN 通常包含用户名。
进一步阅读
如果您想了解有关安全性的更多信息,我们建议您查看有关使用 SSL 在 PostgreSQL 中配置客户端/服务器加密的实用内容。