4月阅读周·HTTP权威指南:安全HTTP之公开密钥加密技术篇
引言
HTTP(Hypertext Transfer Protocol,超文本传输协议[插图])是在万维网上进行通信时所使用的协议方案。HTTP有很多应用,但最著名的是用于Web浏览器和Web服务器之间的双工通信。
《HTTP权威指南》一书将HTTP中一些互相关联且常被误解的规则梳理清楚,并编写了一系列基于各种主题的章节介绍HTTP各方面的特性。纵观全书,对HTTP“为什么”这样做进行了详细的解释,而不仅仅停留在它是“怎么做”的。此外,这本书还介绍了很多HTTP应用程序正常工作所必需且重要的非HTTP技术。
这本书主要包括以下内容:
- 第一部分描述了Web的基础构件与HTTP的核心技术
- 第二部分重点介绍了Web系统的结构构造块:HTTP服务器、代理、缓存、网关以及机器人应用程序。
- 第三部分提供了一套用于追踪身份、增强安全性以及控制内容访问的技术和技巧。
- 第四部分涵盖HTTP报文主体和Web标准,前者包含实际内容,后者描述并处理主体内容。
- 第五部分介绍了发布和传播Web内容的技巧。
- 第六部分是一些很有用的参考附录,以及相关技术的教程。
安全HTTP
在友好环境中,这些技术都能够很好地工作,但在充满各种利益驱动和恶意对手的环境中,它们并不足以保护那些重要的事务处理。
接下来讨论一种更复杂,更安全的技术,通过数字密码来保护HTTP事务免受窃听和篡改的侵害。
公开密钥加密技术
公开密钥加密技术没有为每对主机使用单独的加密/解密密钥,而是使用了两个非对称密钥:一个用来对主机报文编码,另一个用来对主机报文解码。编码密钥是众所周知的(这也是公开密钥加密这个名字的由来),但只有主机才知道私有的解密密钥。这样,每个人都能找到某个特定主机的公开密钥,密钥的建立变得更加简单。但解码密钥是保密的,因此只有接收端才能对发送给它的报文进行解码。
节点X可以将其加密密钥ex公之于众。现在,任何想向节点X发送报文的人都可以使用相同的公开密钥了。因为每台主机都分配了一个所有人均可使用的编码密钥,所以公开密钥加密技术避免了对称密钥加密技术中成对密钥数目的N2扩展问题。
尽管每个人都可以用同一个密钥对发给X的报文进行编码,但除了X,其他人都无法对报文进行解码,因为只有X才有解码的私有密钥dx。将密钥分隔开来可以让所有人都能够对报文进行编码,但只有其所有者才能对报文进行解码。这样,各节点向服务器安全地发送报文就更加容易了,因为它们只要查找到服务器的公开密钥就行了。
RSA
所有公开密钥非对称加密系统所面临的共同挑战是,要确保即便有人拥有了下面所有的线索,也无法计算出保密的私有密钥:
- 公开密钥(是公有的,所有人都可以获得);
- 一小片拦截下来的密文(可通过对网络的嗅探获取);
- 一条报文及与之相关的密文(对任意一段文本运行加密器就可以得到)。
RSA算法就是一个满足了所有这些条件的流行的公开密钥加密系统,它是在MIT发明的,后来由RSA数据安全公司将其商业化。即使有了公共密钥、任意一段明文、用公共密钥对明文编码之后得到的相关密文、RSA算法自身,甚至RSA实现的源代码,破解代码找到相应的私有密钥的难度仍相当于对一个极大的数进行质因数分解的困难程度,这种计算被认为是所有计算机科学中最难的问题之一。因此,如果你发现了一种能够快速地将一个极大的数字分解为质因数的方法,就不仅能够入侵瑞士银行的账户系统,而且还可以获得图灵奖了。
混合加密系统和会话密钥
任何人只要知道了其公开密钥,就可以向一台公共服务器发送安全报文,所以非对称的公开密钥加密系统是很好用的。两个节点无须为了进行安全的通信而先交换私有密钥。
但公开密钥加密算法的计算可能会很慢。实际上它混合使用了对称和非对称策略。比如,比较常见的做法是在两节点间通过便捷的公开密钥加密技术建立起安全通信,然后再用那条安全的通道产生并发送临时的随机对称密钥,通过更快的对称加密技术对其余的数据进行加密。
数字签名
签名是加了密的校验和
数字签名是附加在报文上的特殊加密校验码。使用数字签名有以下两个好处。
- 签名可以证明是作者编写了这条报文。只有作者才会有最机密的私有密钥,因此,只有作者才能计算出这些校验和。校验和就像来自作者的个人“签名”一样。
- 签名可以防止报文被篡改。如果有恶意攻击者在报文传输过程中对其进行了修改,校验和就不再匹配了。由于校验和只有作者保密的私有密钥才能产生,所以攻击者无法为篡改了的报文伪造出正确的校验码。数字签名通常是用非对称公开密钥技术产生的。因为只有所有者才知道其私有密钥,所以可以将作者的私有密钥当作一种“指纹”使用。
数字签名通常是用非对称公开密钥技术产生的。因为只有所有者才知道其私有密钥,所以可以将作者的私有密钥当作一种“指纹”使用。
下面一个例子,说明一下节点A是如何向节点B发送一条报文,并对其进行签名的。
- 节点A将变长报文提取为定长的摘要。
- 节点A对摘要应用了一个“签名”函数,这个函数会将用户的私有密钥作为参数。因为只有用户才知道私有密钥,所以正确的签名函数会说明签名者就是其所有者。在图14-10中,由于解码函数D中包含了用户的私有密钥,所以我们将其作为签名函数使用。
- 一旦计算出签名,节点A就将其附加在报文的末尾,并将报文和签名都发送给B。
- 在接收端,如果节点B需要确定报文确实是节点A写的,而且没有被篡改过,节点B就可以对签名进行检查。节点B接收经私有密钥扰码的签名,并应用了使用公开密钥的反函数。如果拆包后的摘要与节点B自己的摘要版本不匹配,要么就是报文在传输过程中被篡改了,要么就是发送端没有节点A的私有密钥(也就是说它不是节点A)。
总结
通过公开密钥加密技术,全球所有的计算机用户就都可以使用安全协议了。制定标准化的公开密钥技术包是非常重要的,因此,大规模的公开密钥架构(Public-Key Infrastructure, PKI)标准创建工作已经开展十多年了。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
- 点赞
- 收藏
- 关注作者
评论(0)