设计方案高质量开发 — 网络安全

网络安全的基石(下)— 完整性与身份认证

2020-05-05  本文已影响0人  godliness

网络安全篇,面对复杂多变的网络环境,我们需要掌握哪些关于网络安全的相关知识,聊一聊与网络安全相关的:HTTPS、SSL、TLS 等。


在上一篇文章中,我们介绍了通过非对称加密协商出一个用于对称加密的秘钥,这样便可以保证秘钥不会被窃取,从而实现了机密性。

但仅有机密性,距离安全还差的很远 ...

因为虽然会话密钥无法被窃取,但是恶意者可以尝试修改、重组相关信息返回给网站,因为没有完整性的保证,服务器也只能“照单全收”。

另外,恶意者也可以伪造公钥,如果我们拿到的是“假的公钥”,此时的混合加密就完全失效了。可能我们以为的目标,实际上对方却是伪冒者。

所以,今天我们就来聊一聊,在机密性这一基础之上的完整性和身份认证等特性。


完整性

缺乏完整性的机密,可能会被黑客替换或篡改。接下来我们先来看看如何给机密增加上完整这一特性。

摘要算法

如果说保证机密这一特性的是加密算法,那实现完整性的手段主要是摘要算法,也就是常说的散列函数、哈希函数(Hash Function)。

我们可以把摘要算法近似的理解成一种特殊的压缩算法,它能够将任意长度的数据“压缩”成固定长度,而且是独一无二的“摘要字符串”,就好像是给信息生成了一个数字“指纹”。因此好的摘要算法必须能够“抵抗冲突”(两份不同的原文对应相同的摘要),让这种可能性尽量地小。因为摘要算法对输入具有单向性和雪崩效应

1. 单向性

所有的散列函数都有一个基本特性:如果散列值是不相同的(同一个函数),那么这两个散列值的原始输入也是不相同的。具有这种性质的散列函数称为单向散列函数,即对于给定的散列值不能够逆推出原文

散列碰撞,散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值极大可能是相同的,但也可能不同,这种情况被称之为“散列碰撞”。

2. 雪崩效应

雪崩效应是指当输入发生最微小的改变时,也会导致输出的不可区分性改变。合格的摘要算法,无论是密钥或明文的任何细微变化都必须引起散列值的不可区分性改变。所以摘要算法也被 TLS 用来生成伪随机数(PRF,pseudo random function)。

相信每个开发者在工作中都或多或少的听过或用过 SHA-1(Secure Hash Algorithm 1)和 MD5(Message-Digest 5),它们就是最常用的两个摘要算法,能够生成 20 字节和 16 字节长度的数字摘要。遗憾的是它们先后分别在 2005 年和 2009 年被破解,在 TLS 里已经被禁止使用了。

目前 TLS 推荐使用的是 SHA-1 的后继者 SHA-2,区别于前者,它属于密码散列函数
算法标准,由美国国家安全局研发。总共有 6 种,常用的有 SHA224、SHA256 及 SHA384,它们分别能够生成 28 字节、32 字节及 48 字节的摘要。

保证完整性

摘要算法能够保证“数字摘要”和原文是完全等价的,所以,我们只要在原文后附上它的摘要,就能够保证数据的完整性。

该怎么理解呢?客户端将消息和消息摘要(SHA-2)发送给服务端之后,服务端拿到后也计算下消息的摘要,对这两份“指纹”做个对比,如果一致,就说明消息是完整可信的,没有被修改。因为即使是对消息的很小变动(例如一个标点符号,这就是雪崩效应),摘要也会完全不同,服务端计算对比就会发现消息被篡改,是不可信的。

不过,大家这时候肯定也看出了问题,摘要算法不具有机密性,如果明文传输,那么黑客可以修改消息后,把摘要也一起修改。

所以,真正的完整性必须建立在机密性之上,就是在上期讲解的《网络安全的基石(上)— 加密》:在混合加密系统里用会话密钥加密消息和摘要,这样黑客无法得知明文,也就没有办法“动手脚了”。


身份认证

加密和摘要实现了通信过程的机密性和完整性,我们的通信过程可以说是比较安全了。但这里还有漏洞,那就是通信的两端。

对于通信的两端,我们还要解决身份认证的问题。简单来说,就是如何证明对方真实身份。因为黑客可以伪装成网站来窃取你的信息,反过来,他也可以伪装成你,向网站发送支付、转账等消息,网站没有办法确认你的身份,钱可能就这样被偷走了。

回想下现实生活中,解决身份认证常用的手段有签名、手印和印章等,只要在纸上写下签名加上盖章,就能证明这份文件确实是由本人而非其他人发出的。

那在 TLS 什么东西和生活中的手印、印章很像,只能由本人持有呢?只要有了这个东西,就能够在网络世界里证明你的身份。回想下前面我们介绍的内容,大家也很容易想到,它就是非对称加密里的私钥,使用私钥再加上摘要算法,就能够实现数字签名,同时实现身份认证不可否认

签名与验签

数字签名的原理其实也不复杂,就是将公钥和私钥的用法反过来,之前是公钥加密,私钥解密;现在是私钥加密公钥解密

由于非对称加密的效率太低,所以私钥只加密原文的摘要,这样运算量就小的多,而且得到的数字签名也很小,方便保管和传输。

签名和公钥一样完全公开,任何人都可以获取。但这个签名只有用私钥对应的公钥才能解开,拿到摘要后,再比对原文验证完整性,就可以签署文件一样证明消息确实是你发的。整个过程的两个行为也有其专用术语,分别叫做签名验签

只要客户端和服务端相互交换公钥,就可以用“签名”和“验签”来确认消息的真实性,因为私钥保密,黑客不能伪造签名,就能够保证通信双方的身份。


最后

回顾下安全通信的四大特性我们都已经实现了,整个通信过程是不是已经完美了呢?答案不是的,这里还有一个“公钥的信任”问题,因为谁都可以发布公钥,我们还缺少防止黑客伪造公钥的手段。关于该部分内容你可以参考下篇文章《公钥信任问题 — 数字证书与 CA》


总结


网络安全涉及了方方面面太多的知识,尤其是网络的基础知识对我们来说还是非常重要的,关于这部分大家又有什么要分享的?欢迎你的分享留言或指正。

网络安全系列专题

上一篇 下一篇

猜你喜欢

热点阅读