前言
当使用互联网交换数据时,数据通过各种网络和设备到达另一方。因此,为了安全地使用互联网,安全技术是不可缺的。
本文通过围绕信息的安全传输讲解一些基本的、常见的安全技术来普及一些基本的安全知识,不特定深入去讲解某种技术,仅是用简单的语言去粗略地描述这种过程,目的是能通俗易懂地使读者理解。
正文
安全基础知识
前面说到,数据是通过互联网传输的,而在互联网中,彼此之间是看不到对方的,因此就会出现一些问题。
接下来列举在互联网交换数据时可能出现的四种代表性问题。
窃听
当A方向B方发送信息时,信息传输过程中可能会被X方窃听。
欺骗
当A方向B方发送消息时,B方可能会被X方欺骗,即X方冒充了B方。
相反,即使B方相信他收到了A方的消息,A方也可能被X方欺骗。
伪造
即使A方确定了他的信息发送给了B方,在传输过程中,信息有可能被X方重写。
当然,除了被第三方故意伪造之外,数据也有可能因为某种通信故障而被损坏。
否认
当发送信息的A方有恶意时,A方可能坚持说“这不是他发到信息”。
如果发生了这种情况,互联网上的商业交易和合同将不会成立。
这些问题不仅发生在人与人之间的交易中,同时在浏览网站时也会发生。
解决
为了解决第一个问题“窃听”,我们可以采用“加密”技术。
为了解决第二个问题“欺骗”,我们可以使用“消息认证码”,
或者“数字签名”技术。
为了防止第三个问题“伪造”,我们同样可以使用“消息认证码”或者“数字签名”技术。
同时“数字签名”技术也可以防止第四个问题“否认”。
可以得到一下总结:
问题 | 解决 |
①窃听 | 加密 |
②欺骗 | 消息认证码 或者 数字签名 |
③否认 | |
④窃听 | 数字签名 |
还有一种叫做“数字证书”的技术,
它解决了“数字签名”技术中存在的“公钥持有人无法识别”这一个问题。
加密基础知识
前面说到,数据在互联网中传输时,有可能会被第三方看到。所以对于一些重要的数据,我们有必要对其进行加密。而加密后的数据简称为密文。当A方给B方发送密文后,B方再将密文还原成原始数据,这个还原过程称为解密。即使密文传输过程中被第三方看到也是安全的。
接下来讲一下加密的具体操作。
首先,计算机使用数字0和1来管理任何二进制数据。
数据有很多种格式,如文字,音乐,电影等。。。他们在计算机中都以二进制数字形式进行管理。
基于此,我们将考虑加密技术。
数据是对于计算机有意义的数字序列。而密文也作为数字序列进行管理,但它是一个无法由计算机解释的随机数。
所以加密便是通过对数据进行某种操作来更改成计算机无法识别的随机数。
在加密的数值计算中,我们使用了“钥匙”,它也是由数值组成。所以,加密就是用钥匙来做数值计算,将数据转化为不能读取的东西。相反的,解密就是通过使用钥匙的数值计算来将密文还原成原始数据。
下面介绍一种简单的加密运算:异或加密。
异或运算:
0 XOR 0 = 0
1 XOR 1 = 0
0 XOR 1 = 1
1 XOR 0 = 1
即相同为0,不同为1。
逻辑异或的特性:A XOR B = C 等价于 A = B XOR C (细细品味)
当A异或某个值得到C时,C也可以通过异或这个值来换取A。
在编程中,可以使用异或运算交换两个变量的值,而不需要借助临时变量。如果能自己实现这个过程,那么便对异或的特性理解透彻。
接下来构造场景,我有一个文字文件,它在计算机中对应的二进制值为0101,我使用一个密钥key,对应1100。
通过异或,0101 XOR 1100 = 1001。
1001便是加密后的密文,它无法被计算机识别,即使识别出来也是无规则的乱码。
当我们再次用这个密文去异或我们加密用的key时
1001 XOR 1100 = 0101
明文便被还原出来,这就是解密。
至此便结束对加密基础的解释。
哈希函数
哈希函数是将给定数据转化为固定长度的不规则值的函数。
将数据输入到哈希函数中,就会输出不规则的值。
“ABC”->hash()->7f0579bc2d
输出的数值常会用16进制表示。
虽然哈希值用16进制表示,但它同样是数值,在计算机中同样是以二进制的形式进行管理。所以哈希函数实质是在计算机内进行某种运算。
下面来看看哈希函数的特征。
哈希函数第一个特征就是输出的哈希值长度不变。不管输入的数据很小或者很大,哈希值的长度保持不变。
第二个特征就是输入的数据相同,输出也必然相同。
第三个特征就是,即使输入的数据相近,输出的哈希值变化也很大。称为雪崩效应。
第四个特征就是,当输入两个不相同的数据时,哈希值有低概率相同。即哈希冲突(碰撞)。
第五个特征就是不能通过哈希值反推出原来的数据。
最后,求哈希值的计算一般是相对容易的。
哈希函数算法在具有代表性的有:MD5,SHA-1和SHA-2等。而SHA-2是目前应用较为广泛的。
在网站的数据库中,用户的密码常常转为哈希值存储,即使数据库被拿下也不会泄露出用户的密码。
公共密钥加密
前面讲到,数据在互联网传输时,为了防止被第三方窃听,我们需要用到加密技术。发送方先将明文加密成密文,再将密文发送给接收方,接收方再解密。这种加密技术中,加密和解密都使用相同的密匙,所以也被称为对称加密。
比较代表性的加密算法有:AES,DES,一次性加密等,其中AES应用最为广泛。
接下来想一下公共密钥加密可能发生的问题,我们回到A方向B方发送密文的时候。
密文可能被X方窃听了。
这时我们假设A方和B方是无法直接沟通的,而B方不知道A方加密时用的密钥是什么,所以A方就要通过某种手段将密钥交给B方。就像密文传输一样,A方又在互联网上向B方发送了密钥。
既然在互联网上传输,那么密钥同样可会被X方窃听到,这样X方就能解开密文得到明文。
如果A方用一个新的密钥去加密密钥,再将被加密的密钥发给B方,B方也不知道这个加密密钥用的新密钥。问题就会重演。这是公共密钥最大的问题。
总之,公共密钥需要一种安全的方法进行传送,这就是“钥匙交付问题”。
这个问题有两种解决方案,分别是使用“密钥交换协议”和“公开密钥加密”两种方法。
公开密钥加密
公开密钥加密是加密和解密使用不同密钥的一种加密技术,因为使用了不同的密钥,也被称为非对称加密。加密使用的密钥称为“公开密钥”,解密使用的密钥称为“私有密钥”。
我们来简单的描述一下这个过程:
首先A方想给B方发送信息,这时B方需要创建一对密钥对,公开密钥(Public Key)和私有密钥(Secret key),然后将公开密钥发送给A方,A方就可以使用这个公开密钥加密明文,再将密文发送给B方,最后B方通过私有密钥还原出明文。
具有代表性的加密算法有:RSA加密算法和椭圆曲线加密算法等,最为广泛应用的是RSA算法。
因为公钥和密文都是通过互联网传输,所以有可能被X方窃听。但是公钥是无法解密密文的,所以X方无法得到原始数据。
还有一个好处就是,当多方之间进行通信时,发送信息的一方只需要拿到接收方的公钥就可以了。若使用公共密钥加密,那么密钥需求会随着人数的增多急剧上升。
而B方在收到密文后使用私钥还原出原始数据,不用为每个对象都准备相应的密钥。
需要保密的密钥由接收方保管,所以安全性也高。
下面讲讲公开密钥加密可能存在的问题。
第一个问题是加密和解密都需要时间,所以不适合用于来回换取少量数据。
第二个问题是公钥的可靠性问题,因为公钥无法指示是谁创建了它,所以。。。
当X方想窃听A方和B方的信息时,X方可以创建一对密钥对PX和SX,
当B方给A方发送公钥PB时,X方可以拦截下PB,将PX发给A方。。。
由于公钥的来源无法得知,所以A方会用PX去加密信息并发送,这样X方就可以用SX去解密出来,再用拦截下来的PB去再次加密并转发给B方。。。这个过程中A方和B方都是没有意识的,也就是所谓的中间人攻击。
为了解决第一个耗时问题,可以采用“混合加密”技术。而第二个公钥可靠性问题,可以使用“数字证书”技术。
混合加密
所谓混合加密就是结合了公共密钥加密和公开密钥加密的优点。
我们知道公共密钥加密的速度快,但是密钥传输的安全性不能保障。
而公开密钥加密耗时,但是安全性高。
基于此,我们可以先使用安全性高的公开密钥加密去传输公共密钥加密使用的密钥,然后再用公共密钥加密去交换数据。
混合加密的速度和安全性都很有优势。像SSL(安全套接层)协议就是采用混合加密技术。
SSL协议升级改版后已经改名叫TLS(传输层安全),但由于SSL这个名字在人们心中根深蒂固,因此该协议也常称为SSL协议或SSL/TLS协议。
迪菲-赫尔曼密钥交换
迪菲-赫尔曼(Diffie-Hellman)密钥交换是通过将双方共有的秘密数值隐藏在公开数值相关的运算中,来实现双方之间密钥的安全交换。
我们先来理解一下这个概念:
假设我们有一种方法,或称为运算,可以合并两个密钥:P+S=PS
需要注意的是,这里面的“+”符号知识代表这种运算,而非日常生活的加法。
这种运算可以合并密钥但不能分解,即:PS=?+S或PS=P+?
而且合成后的密钥还能继续合并P+PS=PPS
合成结果和合成顺序无关,只与使用了哪种密钥有关,即PPS=SPP=PSP
下面我们使用这种方法去交换密钥。
A方或B方准备一个密钥P,它相当于一个公开密钥,所以无需担心泄露,可以直接在互联网中发送给另一方。这时A方和B方都有了密钥P。
然后A方和B方各自准备自己的私钥SA和SB,并与P进行合成,分别得到P(SA)和P(SB),再发送给对方。
最后A方使用得到的P(SB)和自己的SA合成P(SB)(SA),同理B方得到了P(SA)(SB),我们知道这两个合成密钥是等价的。
所以A方和B方可以使用这把合成密钥作为公共加密技术的密钥来交换数据。
我们可以看到在这个过程中,若X方窃听,可以得到P,P(SA),P(SB)。
由于无法分解,所以X方得不到SA和SB。因此X方无论怎么合成也得不到A方与B方加密使用的密钥。
下面回到迪菲-赫尔曼密钥交换。
我们用公式来表示这个密钥交换法。
首先我们用两个整数表示一开始生成的公开密钥P:(P,G),其中P是一个大素数,G是素数P对应生成元中的一个。
然后A方和B方分别准备自己的秘密数字X和Y。X和Y都要小于P-2。
A计算:G^X mod P
B计算:G^Y mod P
这个计算等同于前面说的合成。
接下来交换计算结果,再次进行合成。
如A方得到了B方的G^Y mod P,再次合成即(G^Y mod P)^X mod P = G^XY mod P
同理的,B方会得到G^YX mod P
这个G^XY mod P的计算结果便是最后的密钥。
至此,迪菲-赫尔曼密钥交换解释完毕。
由素数P,生成元G和G^X mod P求解X的问题是“离散对数问题”,人们至今未找到这个问题的解法,所以迪菲-赫尔曼密钥交换正是利用了这个数学难题。
消息认证码
消息认证码是检测数据在传输过程是否被伪造的技术。
假如A方要向B方购买商品,A方需要将商品编码发送给B方,这个过程可能会被第三方伪造,从而使得B方发送错误的商品。这时就需要使用消息认证码来辨别数据是否被伪造。
首先,在A方将商品编码加密成密文后,还要再创建一个钥匙,并用这把钥匙和加密后的密文生成一个值,这个值就是消息认证码,称为MAC,同时还要将这个钥匙通过安全的方式发送给B方。
传输数据时把密文和MAC一并发给B方,B方收到数据后先用密文和钥匙生成MAC进行对比,不一致则说明数据被伪造了,B方向A方提出重新发送请求。
需要注意的是,即使我们采用加密技术,因为加密实质上是数值计算,所以就算X方篡改了密文,这个密文也是能进行解密的,只不过还原出来的意思可能让人难以理解,这样情况接收方可能会意识到数据被伪造了。但是对于商品编码这种本来就无法让人直接理解的内容,解密后接收者也难以判断数据是否被伪造。
MAC我们可以理解成密钥和密文组成的字符串的“哈希值”,计算MAC的方法由HMAC,OMAC,CMAC等,目前HMAC(Hash-based MAC)应用最为广泛。
消息认证码技术解决了通信中数据被篡改的问题。但是也存在缺点,因为使用消息认证码时,AB双方都能对消息进行加密并且计算出MAC,所以无法证明消息是A生成的还是B生成的。这就导致了事后否认的问题,比如A方发送消息后,声称“这条消息是B方捏造的”,或者B方自己生成一条消息并声称“这是A方发给我的消息”。要解决“否认”的问题,就要用到“数字签名”技术了。
数字签名
数字签名不仅实现了消息认证码的认证和防篡改功能,同时还解决了“否认”的问题。因为数字签名只有发送者才能生成,所以可以确定谁是消息的发送者。
假设A方要给B方发送消息,A方要在发送消息时加上数字签名,这个数字签名只能由A方生成。这样,只要发送的消息上有A方的数字签名,B方就能确定是A方发送的消息。但是,B方只能验证数字签名,但不能生成。
接下来看一下数字签名如何生成:
我们回想前面说到的公开密钥加密,消息接收者需要保管自己的私钥,并将公钥发布出去,发送者使用这个公钥加密消息。
我们将这个过程逆过来。
发送者用自己的私钥加密消息,接收方用发送者的公钥去解密。
如A方要发送消息给B方,那么A方就准备一对公私密钥对,将公钥交给B方,自己用私钥加密数据,B方再用公钥解密。这样就能确定消息是A方发出的。
这个过程中,由于解密使用的是公钥,那么所有人都解开密文,这个密文就没有意义了。但换一个角度来看,它保证了密文的创造者只能是持有私钥的人。
在公开密钥加密中,使用公钥加密,私钥解密。而在数字签名中,使用了私钥加密,公钥解密。也就是说密钥使用顺序不同,但运行结果也一样。并非所有公开密钥加密都有这一性质,但RSA加密算法是可以的。
这样便防止了事后否认的问题。
我们知道公开密钥加密比较耗时,所以为了节约时间,实际上不会对消息进行直接加密,而是先求得消息的哈希值,再对哈希值进行加密,然后作为签名来使用。
虽然“数字签名”技术实现了“认证”“防篡改”“预防事后否认”的功能,但仍然存在缺陷。
那就是使用了“数字签名”时,虽然B方相信消息发送者是A方,但实际上也有可能是X方冒充了A方。
其根本原因在于,公钥中没有制作者的信息,我们无法确定公钥的制作者是谁。
这时就要使用“数字证书”来解决这一问题。
数字证书
“公开密钥加密”和“数字签名”都无法保证公钥来自信息的发送者,因此,就算公钥被第三方替换,接收方也不会注意到。而“数字证书”则可以解决这一问题。
假设A方准备了一对密钥对,他想把公钥PA发送给B。
A方首先要向认证中心(简称:CA)申请发行证书,证明PA确实是由A方生成的。
认证中心里保管着他们自己准备的公钥PC和密钥SC。
A方将自己的公钥PA和包含邮箱信息的资料发给认证中心。
认证中心判断这些资料是否为A本人。确认完毕后,认证中心用自己的私钥SC根据A的资料生成一个数字签名,并把这个数字签名和资料放到同一个文件中。再将这个文件发回给A方。这个文件就是A方的数字证书。
A方将作为公钥的数字证书发送给B方,B方检查数字证书中的邮箱是否为A方的,然后从认证中心获取公钥验证签名,确认这个证书是否为认证中心发行的。
确认完毕没有异常后,B方从数字证书中提取出A方的公钥PA,公钥便传输完毕。
我们来看看这个过程有没有什么问题。
假如X方冒充A方,向B方发送X方的公钥PX,B方没有必要信任这个以非证书形式收到的公钥。所以X方无法冒充A方。
如果X方为了冒充A方,向认证中心登记自己的公钥,由于X方无法使用A方的邮箱,因此无法拿到A方的证书。
那么,X方有没有可能冒充认证中心,替换了认证中心的公钥PC呢?
没错,这里同样存在着公钥来源的问题。
但实际上,认证中心的公钥PC也是以数字证书的形式交付的,因为会有更高级的认证中心对这个认证中心署名。
比如公司B想提供认证服务,但是公司B还没有得到社会广泛认可,那么公司B可以向被社会广泛认可的公司A申请数字证书,这就说明公司B得到了公司A的信任。
这样,通过大型组织对小型组织的信赖担保,树结构就建立起来了。
位于顶端的认证中心被称为“根认证中心”,其自身的正当性由自己证明,对自身进行声明的证书称为“根证书”。如果根认证中心不被信任,整个组织就无法运转。
根认证中心多为大型企业,或与政府关联且取得社会信赖的组织。
到这里,我们可以知道,其实每个人都能成为认证中心,但还是建议向经过政府审查的大型企业机构进行申请,这些机构更令人放心。
到这里,我们介绍完了个人之间交付公钥的例子,而网站之间的通信同样也要用到数字证书,只要收到网站的数字证书,就说明网站未被第三者冒充。
此处的证书称为“服务器证书”,同样由认证中心发行。个人证书与邮箱信息对应,而服务器证书与域名信息对应。这样就能确定,域名和储存网站内容的服务器是由同一个组织管理的。
结束语
本文并未讲解详细的技术,仅是围绕信息传输的安全问题,牵扯出一些安全技术,算作信息安全的启蒙。这也是本人阅读某些资料发现的内容,觉得有意思,有意义,便摘写下来。若有错误,敬请联系本人进行改正!