跳到主要内容

网络安全基础

概述

网络安全涉及三个方面:网络安全涉及三个方面:安全威胁、安全服务 和 安全机制

安全威胁

计算机网络所面临的安全威胁主要来自两大类攻击,即 被动攻击 和 主动攻击;从攻击对象来看,又可分为对通信本身的攻击和利用网络对计算机系统的攻击 image.png

  1. 截获(interception):攻击者从网络上窃听他人的通信内容。
  2. 中断(interruption):攻击者有意中断他人在网络上的通信。
  3. 篡改(modification):攻击者故意篡改网络上传送的报文。
  4. 伪造(fabrication):攻击者伪造信息在网络上传送。

被动攻击

在被动攻击中,攻击者只是观察和分析网络中传输的数据流而不干扰数据流本身。通过窃听手段,攻击者可以截获电话、电子邮件和传输的文件中的敏感信息,而不被发现。即使通信的内容被加密,攻击者不能直接从内容中获取秘密,也可以通过观察分组的协议控制信息部分来了解正在通信的协议实体的地址和身份。通过研究分组的长度和传输的频度来了解所交换的数据的性质。这种被动攻击称为流量分析(trafficanalysis)。

主动攻击

主动攻击是指攻击者对传输中的数据流进行各种处理。如有选择地更改、删除、延迟或改变消息的顺序,以获得非授权的效果。攻击者可以动发送伪造的信息或伪装自己的身份与被攻击者通信。除了中断、篡改和伪造外,还有一种重放攻击将截获的报文再次发送以产生非授权的效果。

拒绝服务(Dos)

拒绝服务(Denial of Service,DoS)攻击是一种很难防范的主动攻击。攻击者通过发送巨量恶意报文使目标系统或网络崩溃,阻止系统为合法用户提供正常服务。攻击者甚至还可利用系统漏洞先非法控制因特网上成百上千的主机(这些主机被称为僵尸),然后从这些僵尸主机上同时向某个目标系统发起猛烈攻击。(具体看另一篇专讲这个的博客)

远程入侵

网络在方便人们远程访问计算机系统的同时,也给攻击者远程非法访问计算机系统带来了极大的便利性。攻击者通过破解管理员口令、利用系统漏洞获取管理员权限等手段入侵到计算机系统内部,对信息资源进行非法访问或对信息系统进行恶意破坏。这类攻击被称为远程入侵,所有连接在因特网上的计算机系统都面临被非法入侵的危险。

  1. 计算机病毒(computer virus):一种会“传染”其他程序的程序。“传染”是通过修改其他程序把自身或其变种复制进去完成的。
  2. 计算机蠕虫(computer worm):一种通过网络的通信功能主动将自身从一个结点发送到另一个结点,并启动运行的程序。
  3. 特洛伊木马(Trojan horse):或简称为木马,是一种在表面功能掩护下执行非授权功能的程序。例如,一个伪造成编辑器软件的特洛伊木马程序,在用户编辑一个机密文件时偷偷将该文件内容通过网络发送给攻击者,以窃取机密信息。计算机病毒有时也以特洛伊木马的形式出现。
  4. 逻辑炸弹(logic bomb):一种当运行环境满足某种特定条件时执行其他特殊功能的程序。如一个编辑程序,平时运行得很好,但当 系统时间为13日又为星期五时,它删去系统中所有的文件,这种程序就是一种逻辑炸弹。

机密性和密码学

加密和解密过程可以以一个密钥(key)为参数,并且加密和解密过程可以公开,而只有密钥需要保密。即只有知道密钥的人才能解密密文,而任何人,即使知道加密或解密算法也无法解密密文。

采用该原则的一个原因是 如果你依靠密码算法保密,一旦算法可能失密就必须放弃该算法。这意味着要频繁地修改密码算法,而开发一个新的算法是非常困难的事情。另外,密钥空间可以很大,用密钥将密码算法参数化,同一个算法可以为大量用户提供加密服务。

image.png

请注意:加密密钥和解密密钥可以相同,也可以不同,取决于采用的是 对称加密体制 还是 非对称加密体制

任何加密方法的安全性取决于密钥的长度,以及攻破密文所需的计算量,而不是简单地取决于加密的体制。因此我们不能简单地认为,非对称加密体制和对称加密体制相比,哪一种密码体制的安全性更加优越。

注意:这里只是讲述两种加密方式的流程。还没有讲到截取者自己发送公钥来伪造数据的情况,对于这种伪造公钥的情况下面讲到公钥认证会涉及

对称密钥系统

所谓对称密钥密码体制是一种加密密钥与解密密钥相同的密码体制。在这种加密系统中,两个参与者共享同一个秘密密钥,如果用一个特定的密钥加密一条消息,也必须要使用相同的密钥来解密该消息。该系统又称为对称密钥系统。

加密和解密过程可以以一个密钥(key)为参数,并且加密和解密过程可以公开,而只有密钥需要保密。即只有知道密钥的人才能解密密文,而任何人,即使知道加密或解密算法也无法解密密文。

3DES

DES:数据加密标准(Data Encryption Standard)是对称密钥密码的典型代表

为解决 DES 密钥太短的问题(56位长的密钥),人们提出了三重 DES (Triple DES,3DES) 加密时:用三个密钥,执行三次 DES 算法:即 E 运算→ D 运算→ E 运算。 解密时:按相反顺序使用这三个密钥,执行 D 运算→ E 运算→ D 运算

image.png

AES

由于 IBM 最初设计 DES 时是为了用硬件来实现,DES/3DES 的软件实现较慢。3DES 目前正在被 2001年发布的高级加密标准(AdvancedEncryption Standard,AES)所替代。AES 能够使用128位、192位和256位长的密钥,用硬件和软件都可以快速实现。它不需要太多内存,因此适用于小型移动设备

公钥密码体制

公钥密码体制 又称 “非对称加密”

在对称密钥系统中,两个参与者要共享同一个秘密密钥。但怎样才能做到这一点呢?一种是事先约定,另一种是用信使来传送。在高度自动化的大型计算机网络中,用信使来传送密钥显然是不合适的。如果事先约定密钥,就会给密钥的管理和更换都带来了极大的不便。

所以一般采用的是公钥密码体制。公钥密码体制使用不同的加密密钥与解密密钥。在公钥密码体制中,加密密钥(即公钥)PK 是公开信息,而 解密密钥(即私钥)SK 是需要保密的,因此私钥也叫作秘密密钥。加密算法 E 和解密算法 D 也都是公开的。虽然私钥 SK 是由公钥 PK 决定的,但却不能根据 PK 计算出 SK。

公钥算法有以下主要特性:

(E:加密 D:解密)

  1. 发送方(客户端)用加密密钥 PK 对明文 X 加密后,在接收方(服务端)用解密密钥 SK 解密,即可恢复出明文,或写为: Dsk(Epk)=XD_{sk}(E_{pk})=X

  2. 加密密钥是公钥,而解密密钥是接收方专用的私钥,对其他人都保密。

  3. 此外,加密和解密的运算可以对调,即 Epk(Dsk)=XE_{pk}(D_{sk}) = X

  4. 加密密钥不能用它来解密,即: $D{pk}(E{sk}) \neq X $

  5. 从 PK 到 SK 是 “计算上不可能的”

常用的非对称密码体系

RSA 算法:它是基于数论中大数分解问题的算法。

公钥密码体制有许多很好的特性,使得它不仅可以用于加密,还可以很方便地用于鉴别和数字签名。但不幸的是,目前的公钥密码算法比对称密码算法要慢好几个数量级。因此,对称密码被用于绝大部分加密,而公钥密码则通常用于会话密钥的建立。

例如,参与者 A 要发送大量秘密信息给 B。A 首先选择一个用于加密数据本身(如采用 DES 或 AES 算法)的密钥,由于该密钥仅用于该次会话,被称为会话密钥。因为对称密钥由双方共享,A 必须将该会话密钥通过秘密渠道告知 B。为此,A 用 B 的 RSA 公钥加密该会话密钥后发送给 B。B 收到加密的会话密钥后用自己的私钥解密后得到会话密钥。此后,A 和 B 之间就可以用该会话密钥加密通信的数据。

就是为了解决效率问题(非对称加密很慢),一般只在建立第一次连接时使用,使用非对称加密来传输后面对称加密的密钥

完整性与鉴别

有时,通信双方并不关心通信的内容是否会被人窃听,而只关心通信的 内容是否被人篡改或伪造,这就是报文完整性问题。报文完整性验证又称为报文鉴别,既鉴别报文的真伪。很多情况,通信的双方需要验证通信对端的真实身份。

例如:当客户在因特网上远程登录某银行的网上银行时,银行服务器要验证客户所声称的身份的真实性,而客户也需要验证登录的确实是该银行的网站。这时就需要实体鉴别。实体鉴别(经常简称为鉴别)就是一方验证另一方身份的技术。

报文摘要和报文鉴别码

使用加密通常可达到报文鉴别的目的,因为伪造的报文解密后一般不能得到可理解的内容。但简单采用这种方法,计算机很难自动识别报文是否被篡改。另外,对于不需要保密而只需要报文鉴别的网络应用,对整个报文的加密和解密,会使计算机增加很多不必要的负担(加密和解密要花费相当多的CPU时间)。

报文摘要:就是对报文进行 Hash(例如 MD5),算出一个不可逆的“精简”字符串 报文鉴别码:就是加密后的报文摘要

可以通过 在线 Hash 计算工具 观察到,不管输入的数据多长,每次生成的结果都差不多长

方式一:使用报文摘要(Message Digest,MD)来进行报文鉴别(见图7-4)流程

image.png

发送方 将可变长度的报文 m 经过 报文摘要算法运算 后,得出固定长度的报文摘要 H(m)。然后对 H(m) 进行加密,得出 EK(H(m)),并将其附加在报文 m 后面发送出去。

接收方EK(H(m)) 解密还原为 H(m),再把收到的报文进行报文摘要运算,看结果是否与收到的 H(m) 一样。如不一样,则可断定收到的报文不是发送方产生的。

报文摘要的优点就是:仅对短得多的定长报文摘要 H(m) 进行加密比对整个长报文 m 进行加密要简单得多,但对鉴别报文 m 来说,其效果是一样的。密钥 K 仅在通信双方之间共享,没有第三方能用伪造报文 m' 产生出 EK(H(m'))。附加在报文上用于鉴别报文真伪的码串,如上面的 EK(H(m)),被称为报文鉴别码(Message Authentication Code,MAC)。

要抵御攻击者的恶意篡改,报文摘要算法必须满足以下条件:

  1. 任意给定一个报文摘要值 x,若想找到一个报文 y 使得 H(y)=x,则在计算上是不可行的;
  2. 若想找到任意两个报文 x 和 y,使得 H(x)=H(y),则在计算上是不可行的。

上述的两个条件表明:若 (x, H(x)) 是发送方产生的报文和报文摘要对,则攻击者不可能伪造出另一个报文 y,使得 y 与 x 具有同样的报文摘要。(报文摘要 和 差错检验码 都是多对一的散列函数(hash function))

满足以上条件的散列函数称为密码散列函数或安全散列函数,因为无法把报文摘要还原为原文,可以把密码散列函数运算看成是没有密钥的加密运算。

方式二:直接使用密码散列函数实现报文鉴别码

实际上利用密码散列函数的特殊性质,无需对报文摘要加密就可以实现对报文的鉴别,前提是通信双方共享一个称为鉴别密钥的秘密比特串 s(例如 Token)

注意:JWT 使用的就是这种方式

发送方s 与报文 m 合并为 m+s,并计算散列 H(m+s)。然后将 H(m+s) 作为报文鉴别码 MAC 附加到报文 m 上,一起发送给接收方。

接收方 利用 s 和收到的报文 m 重新计算 MAC,与接收到的 MAC 进行比较,从而实现对报文的鉴别。由于攻击者不知道 s ,也不能从截获的 MAC 中计算出 s(条件1),因此不能为伪造报文 m' 产生 H(m'+s)

直接使用密码散列函数实现报文鉴别码的技术又称为 散列报文鉴别码(Hashed MAC,HMAC)。

图7-5所示的是直接使用密码散列函数实现报文鉴别码进行报文鉴别的示意图。

image.png

数字签名

数字签名还能同时验证数据是否被篡改

在日常生活中,可以根据亲笔签名或印章来证明书信或文件的真实 来源。但在计算机网络中传送的文电又如何盖章呢?这就是数字签名(digital signature)所要解决的问题。

数字签名必须保证以下三点:

  1. 接收方能够核实发送方对报文的数字签名;
  2. 发送方事后不能抵赖对报文的数字签名;
  3. 任何人包括接收方都不能伪造对报文的签名。

数字签名的不可抵赖性

不可抵赖性,又称不可否认性,英文为 Non-repudiation。电子商务交易各方在交易完成时要保证的不可抵赖性,指在传输数据时必须携带含有自身特质、别人无法复制的信息,防止交易发生后对行为的否认。通常可通过对发送的消息进行数字签名来实现信息的不可抵赖性。

在数字签名中,即使攻击者改变消息,也没法达到任何目的,因为攻击者没有 A 的私钥,无法再次用 A 的私钥加密改变后的消息,保证了数据的完整性,因此 A 既不能抵赖没有发送消息,也不能抵赖发送的消息不是 M。

简单来说,除了作为签名者的你自己,谁都不能生成你的签名,反过来说,一旦你的签名验证有效,就可以确信无疑是你签的,你赖不掉

使用非对称加密算法(原理就是 倒过来 使用非对称加密算法)

发送方 A 用其私钥(即解密密钥)SKA 对报文 X 进行运算,将结果 DSKA(X)D_{SKA}(X) 传送给接收方B。

注意:报文 X 还没有加密,怎么能够进行解密呢?其实 “解密” 仅仅是一个数学运算。发送方此时的运算并非想将报文 X 加密而是为了进行数字签名。

B 收到报文 DSKA(X)D_{SKA}(X) 后,用已知的 A 的公钥(即加密密钥)对报文 DSKA(X)D_{SKA}(X) 进行运算,得出 EPKA(DSKA(X))=XE_{PKA}(D_{SKA}(X))=X 。(就是对 “解密” 的报文,再进行 “加密”,就能得到原报文)

因为除 A 外没有别人能具有 A 的解密密钥 SKA,所以除 A 外没有别人能产生密文 DSKA(X)D_{SKA}(X) ,而任何伪造的报文经 EPKAE_{PKA} 运算后都不会得到可理解的内容。这样,B 就核实了报文 X 的确是 A 签名发送的(见图7-6)。

image.png

若 A 要抵赖曾发送报文给 B,B 可把 X 及 DSKA(X)D_{SKA}(X) 出示给具有权威的第三方。第三方很容易用 PKA 去证实 A 确实发送 X 给 B。

反之,若 B 把 X 伪造成 X',则 B 不能在第三方前出示 DSKA(X)D_{SKA}(X') 。这样就证明了 B 伪造了报文。可见 数字签名实现了对报文来源的鉴别

公钥密码算法的计算代价非常大,对整个报文进行数字签名是一件非常耗时的事情。更有效的方法是仅对报文摘要进行数字签名

同时秘密通信和数字签名

上述过程仅对报文进行了签名,对报文 X 本身却未保密。因为截获 DSKA(X)D_{SKA}(X) 并知道发送方身份的任何人,通过查阅手册即可获得发送方的公钥 PKA,因而能得知电文内容。

若采用如图7-7所示的方法,则可同时实现秘密通信和数字签名。图中 SKA 和 SKB 分别为 A 和 B 的私钥,而 PKA 和 PKB 分别为 A 和 B 的公钥。

image.png

实体鉴别

实体鉴别(经常简称为鉴别)就是一方 验证另一方身份 的技术。一个实体可以是人、客户/服务器进程等。

这里仅讨论如何鉴别通信对端实体的身份,即验证正在通信的对方确实是所认为的通信实体,而不是其他的假冒者。

进行通信实体鉴别需要使用鉴别协议。鉴别协议通常在两个通信实体之间传输实际数据或者进行访问控制之前运行,是很多安全协议的重要组成部分或前奏。

一种最简单的实体鉴别方法就是,利用用户名/口令。但直接在网络中传输用户名/口令是不安全的,因为攻击者可以在网络上截获该用户名/口令,因此在实体鉴别过程中需要使用加密技术。

image.png

如图7-8所示,参与者 A 向 B 发送有自己身份信息(例如,用户名和口令)的报文,并且使用双方共享的对称密钥 KABK_{AB} 进行加密。为简洁起见,这里用 K(m) 表示通过密钥 K 对信息 m 加密。B 收到此报文后,用 KABK_{AB} 解密即可验证 A 的身份。但不幸的是,这种简单的鉴别方法具有明显的漏洞。因为攻击者 C 从网络上截获该报文后,完全不用破译该报文而仅仅直接将该报文发送给 B,就可以使 B 误认为 C 就是 A。这就是重放攻击(replay attack)。

为了对付重放攻击,可以使用不重数(nonce),即一个不重复使用的大随机数,也称为 “一次一数”。图7-9给出了使用不重数进行鉴别的过程。

image.png

在图7-9中,A 首先用明文发送其身份和一个不重数 RAR_A 给 B。接着,B 在响应 A 的报文中用共享的密钥 KABK_{AB} 加密 RAR_A ,并同时也给出了自己的不重数 RBR_B 。最后,A 再用加密的 RBR_B 响应 B。A 和 B 分别通过验证对方返回的加密的不重数实现双向的身份鉴别。由于不重数不能重复使用,攻击者 C 无法利用重放攻击来冒用 A 或 B 的身份。这种使用不重数进行实体鉴别的协议又称为挑战-响应(Challenge-Response)协议。同样,使用公钥加密算法也能实现实体鉴别。

这时,通信双方可以利用自己的私钥对不重数进行签名,而用对方的公钥来鉴别对方签名的不重数,从而实现通信双方身份的鉴别。

密钥分发与公钥认证

由于密码算法是公开的,密钥系统的安全性依赖于密钥的安全保护。在对称密钥密码体制中,通信双方要共享同一个秘密的密钥,如何将密钥分发到通信的双方是一个需要解决的问题。

显然密钥必须通过安全的通路进行分发。

例如,可以派非常可靠的信使携带密钥分发给互相通信的各用户。这种方法称为网外分发。但随着用户的增多和通信量的增大,密钥更换频繁(密钥必须定期更换才能做到可靠),派信使的办法将不再适用。因此必须解决网内密钥自动分发的问题。对于公钥密码体制,虽然不需要共享密钥,公钥可以发布在报纸或网站上,但如何验证该公钥确实是某实体真正的公钥仍然是一个问题。

这些问题的解决都可以通过使用一个可信的中介机构得到解决。

  • 对于对称密钥密码体制,这个可信的中介机构就是密钥分发中心(Key Distribution Center,KDC)。

  • 而对于公钥密码体制,则通过认证中心(CertificationAuthority,CA)来实现公钥的签发和认证。

对称密钥的分发

对称密钥的分发问题在于如何在通信双方之间共享密钥。目前常用的对称密钥分发方式是设立密钥分发中心(Key Distribution Center,KDC)。

KDC 是一个大家都信任的机构,其任务就是给需要进行秘密通信的用户临时分发一个会话密钥。图7-10是KDC进行密钥分发的基本过程。我们假定用户 A 和 B 都是 KDC 的登记用户,他们分别拥有与 KDC 通信的主密钥 KA 和 KB。

密钥分发需要三个步骤(如图中带箭头直线上的①, ②和③所示)。

image.png

① 首先,用户 A 向 KDC 发送用自己私有的主密钥 KA 加密的报文 EKA(A,B)E_{KA}(A, B) ,说明想和用户 B 通信。

② KDC 用随机数产生一个 “一次一密” 密钥 R1 供 A 和 B 这次的通信使用,然后向 A 发送回答报文,这个回答报文用 A 的主密钥 KA 加密,报文中有密钥 R1 和请 A 转发给 B 的报文 EKB(A,R1)E_{KB}(A, R1) ,但报文 EKB(A,R1)E_{KB}(A,R1) 是用 B 的私有主密钥 KB 加密的,因此 A 无法知道报文 EKB(A,R1)E_{KB}(A,R1) 的内容(A 没有 B 的主密钥 KB,也不需要知道此报文的内容)。

③ 当 B 收到 A 转发的报文 EKB(A,R1)E_{KB}(A, R1) ,并使用自己的私有主密钥 KB 解密后,就知道 A 要和他通信,同时也知道和 A 通信时所使用的密钥 R1。

此后,A 和 B 就可使用这个一次一密的密钥 R1 进行本次通信了。 KDC 还可在报文中加入时间戳,以防止报文的截取者利用以前已记录下的报文进行重放攻击。密钥 R1 是一次性的,因此保密性较高。而 KDC 分配给用户的主密钥,如 KA 和 KB,都应定期更换以减少攻击者破译密钥的机会。

公钥的签发与认证

在公钥体制中,如果每个用户都具有其他用户的公钥,就可实现安全通信。看来好像可以随意公布用户的公钥。

其实不然。设想用户 A 要欺骗用户 B。A 可以向 B 发送一份伪造是 C 发送的报文。A 用自己的私钥进行数字签名,并附上 A 自己的公钥,谎称这公钥是 C 的。B 如何知道这个公钥不是 C 的呢?

显然,这需要有一个值得信赖的机构 将公钥与其对应的实体(人或机器)进行绑定(binding)。这样的机构就叫作认证中心(Certification Authority,CA)

需要发布公钥的用户可以让 CA 为自己的公钥签发一个证书(certificate),里面有公钥及其拥有者的身份标识信息(人名、公司名或 IP 地址等)。CA 首先通过检查身份证等方式核实用户真实身份,然后为用户产生私钥公钥对并生成证书,最后用 CA 的私钥对证书进行数字签名。

该证书即可以通过网络发送给任何希望与之通信的实体或存放在服务器由用户自由下载,当然私钥需要用户自己秘密保存。任何用户都可从可信的地方(如代表政府的报纸)获得认证中心 CA 的公钥,并用这个公钥验证某个证书的真伪。

一旦证书被鉴别是真实的,则可以相信证书中的公钥确实属于证书中声称的用户。

由一个CA来签发全世界所有的证书显然是不切实际的,这会带来负载过重和单点故障问题。一种解决方案就是将许多 CA 组成一个层次结构的基础设施,即公钥基础设施(Public Key Infrastructure,PKI),在全球范围内为所有因特网用户提供证书的签发与认证服务。

图7-11是这种层次结构的一个例子。

image.png

下级 CA 的证书由其上级 CA 签发和认证。最顶级的根 CA 能验证所有 1级 CA 的证书,各个1级 CA 可以在一个很大的地理区域或逻辑区域内运作,而 2级 CA 可以在一个相对较小的区域内运作。

所有用户都信任该层次结构中最顶级的 CA,但可以信任也可以不信任中间的 CA。用户可以在自己信任的 CA 获取个人证书,当要验证来自不信任 CA 签发的证书时,需要到上一级验证该 CA 的证书的真伪,如果上一级 CA 也不可信任则需要到更上一级进行验证,一直追溯到可信任的一级 CA。这一过程最终有可能一直追溯到根 CA。

References

参考资料 计算机网络教程-第四版