这些安全知识点,架构师必须要懂!

1 信息安全的概念

提起信息安全,我们通常会想到,数据的传输安全、接口传输安全、登录认证、授权这些类型安全知识,同时也会想到,加密、解密、认证、加签、验签、安全证书等这些小而繁琐的复杂概念。一说起这些概念,大家心理可能会有这么个印象,但是概念会比较模糊,如果您没有认真学习过或考过高级系统架构师、或者没有相关项目的经验,那么您肯定会对这个概念不清楚,并且也能真正的会用它。

为了弄清楚里面的概念,本篇文章借助于项目的实战过程来详细说明每个概念的具体含义、每个概念的详细使用场景,以及整个信息安全的所有知识点。

1.1信息安全包括 5 个基本要素

(1) 机密性:确保信息不暴露给未授权的实体或进程。
(2) 完整性:只有得到允许的人才能修改数据,并且能够判别出数据是否已被算改。
(3) 可用性:得到授权的实体在需要时可访问数据,即攻击者不能占用所有的资源而阻碍授权者的工作。
(4) 可控性:可以控制授权范围内的信息流向及行为方式。
(5) 可审查性:对出现的信息安全问题提供调查的依据和手段。
信息安全的范围包括:设备安全、数据安全、内容安全和行为安全。

根据上面的5个要素我们得知,我们最终的目的就是保护数据的安全性,不被篡改,不被非法访问。总结起来有如下几点:

(1) 访问控制。确保会话对方 (人或计算机) 有权做它所声称的事情。
(2)认证。确保会话对方的资源 (人或计算机)与它声称的一致。
(3) 完整性。确保接收到的信息与发送的一致。
(4)审计。确保任何发生的交易在事后可以被证实,发信者和收信者都认为交换发生过即所谓的不可抵赖性。
(5) 保密。确保敏感信息不被窃听。

1.2 信息安全的技术体系

为了达到安全措施的目的,在系统架构师安全一章节中提供了完整的技术体系,如下:从实现技术上来看,信息安全系统涉及基础安全设备、计算机网络安全、操作系统安全、数据库安全、终端设备安全等多方面技术。
(1) 基础安全设备包括密码芯片、加密卡、身份识别卡等,此外还涵盖运用到物理安全的物理环境保障技术,建筑物、机房条件及硬件设备条件满足信息系统的机械防护安全,通过对电力供应设备以及信息系统组件的抗电磁干扰和电磁泄漏性能的选择性措施达到相应的安全目的。
(2)计算机网络安全指信息在网络传输过程中的安全防范,用于防止和监控未经授权破坏更改和盗取数据的行为。通常涉及物理隔离,防火墙及访问控制,加密传输、认证、数字签名、摘要,隧道及 VPN 技术,病毒防范及上网行为管理,安全审计等实现技术。
(3)操作系统安全是指操作系统的无错误配置、无漏洞、无后门、无特洛伊木马等,能防止非法用户对计算机资源的非法存取,一般用来表达对操作系统的安全需求。操作系统的安全机制包括标识与鉴别机制、访问控制机制、最小特权管理、可信通路机制、运行保障机制、存储保护机制、文件保护机制、安全审计机制,等等。
(4)数据库安全可粗略划分为数据库管理系统安全和数据库应用系统安全两个部分,主要涉及物理数据库的完整性、逻辑数据库的完整性、元素安全性、可审计性、访问控制、身份认证、可用性、推理控制、多级保护以及消除隐通道等相关技术。
(5)终端安全设备从电信网终端设备的角度分为电话密码机、传真密码机、异步数据密码机等。

上述体系中 ,在纯代码上我们关注更多的是第 (2)和第(4)点。

2加密与解密与数字证书

加密技术源远流长,自从古代有了信息的传递和存储,就有了加密技术的运用。此后,很长一段时间里,加密及解密技术在军事、政治、外交、金融等特殊领域里被普遍采用,并经过长时间的研究和发展,形成了比较完备的一门学科——密码学。

密码学是研究加密方法、秘密通信的原理,以及解密方法、破译密码的方法的一门科学。
加密和解密的过程大致如下:首先,信息的发送方准备好要发送信息的原始形式,叫作明文。然后对明文经过一系列变换后形成信息的另一种不能直接体现明文含义的形式,叫作密文。由明文转换为密文的过程叫作加密。在加密时所采用的一组规则或方法称为加密算法。接收者在收到密文后,再把密文还原成明文,以获得信息的具体内容,这个过程叫作解密。解密时也要运用一系列与加密算法相对应的方法或规则,这种方法或规则叫作解密算法。在加密、解密过程中,由通信双方掌握的参数信息控制具体的加密和解密过程,这个参数叫作密钥。密钥分为加密密钥和解密密钥,分别用于加密过程和解密过程。

在加密和解密的过程中,如果采用的加密密钥与解密密钥相同,或者从一个很容易计算出另一个,则这种方法叫作对称密钥密码体制,也叫作单钥密码体制。反之,如果加密和解密的密钥并不相同,或者从一个很难计算出另外一个,就叫作不对称密钥密码系统或者公开密钥密码体制,也叫作双钥密码体制。

2.1对称加密

对称密钥密码体制中,加密和解密过程中所使用的是同一个密钥,或者即使加密密钥和解密密钥不同,但是很容易地由一个计算出另外一个。显然,在这种密码体制中,密钥成为整个秘密通信的核心,整个加密系统的安全性完全以密钥的保密为基础。如果密钥暴露,则整个密码体制就完全失去了保密的效果。所以说,密钥的保密是对称密钥加密体制安全保密的关键,必须妥善保存并经由可靠的渠道传递。

常用的对称加密算法为:DES 和 IDEA

2.2非对称加密算法

对称密钥加密方法是加密、解密使用同样的密钥,由发送者和接收者同时保存,在加密和解密时使用相同的密钥。采用这种方法的主要问题是密钥的生成、导入、存储、管理、分发等过程比较复杂,特别是随着用户的增加,密钥的需求量成倍增加。而在较大规模的信息系统中,大量密钥的分配与管理是一个难以解决的问题。

例如,系统中有n 个用户,其中每两个用户之间需要建立密码通信,则系统中每个用户须掌握(n-1)/2 个密钥,而系统中所需的密钥总数为n*(n-1)/2 个。对10 个用户的情况,每个用户必须有9 个密钥,系统中密钥的总数为45 个。对100 个用户来说,每个用户必须有99 个密钥,系统中密钥的总数为4950 个。这还仅仅考虑用户之间的通信只使用一种会话密钥的情况,如果不同的会话需要变换不同的密钥,则密钥总数就更多了。如此庞大数量的密钥生成、管理、分发是一个难以处理的问题。

与对称密钥加密方法不同,不对称密钥加密技术在对信息进行加密和解密时,需要分别采用两个不同的密钥,因此也称为双钥加密方法。它在运算中,先产生一对密钥,其中之一是保密密钥,由用户自己保存,不能向外界泄漏,简称私钥;另一个为公开密钥,可对外公开,甚至可在公共目录中列示,简称公钥,因此也称公开密钥加密方法。

只有使用私钥才能解密用公钥加密的数据,同时使用私钥加密的数据只能用公钥解密。在通信过程中,如果发送者要向接收者发送保密信息,则需要先用接收者的公开密钥对信息进行加密,然后发送给该接收者,接收方用其私钥能够顺利解密。而其他人即使收到加密的密文也无法正确解读,从而达到保密通信的目的。

公开密钥加密方法中,要想达到良好的加密效果,算法上必须做到:在计算上产生密钥非常容易;已知公钥的情况下对明文加密在计算上很容易实现;已知私钥的情况下对密文解密在计算上很容易实现;尽管用于加密和解密的两个密钥在数学上是相关的,但是在已知公钥的情况下,要想求得私钥在计算上不可行;已知公钥和密文的情况下,要想求得明文在计算上不可行。只有做到以上几点,才能有效地防止攻击者对算法的破译。

不对称密钥加密算法有多种,例如,RSA、背包密码、McEliece、Diffe Hellman、Rabin、Ong Fiat Shamir、零知识证明的算法、椭圆曲线、EIGamal等。最常用的非对称加密算法为RSA 。

非对称加密算法中使用的加密密钥和解密密钥是不同的,称为不共享密钥算法或非对称密钥算法。1976 年,斯坦福大学的 Dime 和 Hellman 提出了使用不同的密钥进行加密和解密的公钥加密算法。设P为明文,C 为密文,E 为公控制的加密算法,D 为私钥控制的解密算法这些参数满足下列3 个条件:
(1) D (E (P)) =P。
(2) 不能由 E 导出 D
(3) 选择明文攻击(选择任意明文 – 密文对以确定未知的密)不能破解 E。加密时计算 C=E (P),解密时计算 P=D (C)。加密和解密是互逆的。用公加密,私钥解密,可实现保密通信;用私钥加密,公钥解密,可实现数字签名。

2.3密钥的管理

过去,人们总是依赖于对于加密算法和密钥的保密来增加保密的强度和效果。随着现代密码学的发展,大部分的加密算法都已经公开了。一些典型的算法(例如,DES、IDEA、RSA 等)更是成了国际标准,被广泛接纳。人们可以从多种途径来获取算法的细节,也已经有很多采用这些算法的软件、硬件设备可以利用。

因此,在现代密码系统中,算法本身的保密已经不重要了,对于数据的保密在很大程度上,甚至完全依赖于对密钥的保密。只要密钥能够保密,即使加密算法公开,甚至加密设备丢失,也不会对加密系统的坚固性和正常使用产生多大影响。相反,如果密钥丢失,则非法用户可以窃取机密数据,而合法用户却面对密文如读天书,无法提取有效的信息。与其如此,还不如不加密呢!因此,在密码系统中,如何高效地分配密钥、安全地管理密钥对于保证数据安全至关重要。

2.4对称密钥的分配与管理

密钥分配一般要解决两个问题:一是引进自动分配密钥机制,以提高系统的效率;二是尽可能减少系统中驻留的密钥量。这两个问题也可以同步解决。那么密钥如何合理的进行分配呢?两个用户 A和B在获得共享密钥时可以有 4 种方式:
(1)经过 A 选取的密通过物理手段发送给另一方 B。
(2)由第 3方选取密,在通过物理手段分别发送给 A 和B。
(3)A、B 事先已有一个密,其中一方选取新密后,用已有密钥加密该新密钥后发送给
另一方。
(4)三方A、B、C 各有一保密信道,C 选取密后,分别通过 A、B 各自的保密信道发送前两种方法称为人工发送。若网络中 N个用户都要求支持加密服务,则任意一对希望通信的用户各需要一个共享密钥,这导致密钥数目多达 N (N-1) 2。第 3 种方法攻击者一旦获得一个密钥就可获取以后所有的密钥,这就给安全性带来隐患。这 3 种方法的公共弱点在于当N很大时,密钥的分配代价也变得非常大。但是,这种无中心的密钥控制技术在整个网络的局部范围内却显得非常有用。如图 4-3 所示,其中 N表示随机数。
这些安全知识点,架构师必须要懂!

第4 种方法是较常用的。第3方C 是为用户分配密的 KDC,每个用户和 KDC 有一个共享密钥,即主密钥。主密钥再分配给每对用户会话密钥,用于用户间的保密通信。会话密钥在通信结束后立即销毁。虽然此种方法的会话密钥数目是 N(N-1) /2,但是主密的数目却只需要 个,可以通过物理手段进行发送。如图 4-4 所示,其中 N表示随机数,Ks 表示会话密钥。
这些安全知识点,架构师必须要懂!
那么,什么是KDC呢?其全称为 (Key Distribution Center,密匙分配中心),它一种非常有效的密钥自动分配方案。在KDC 方案中,每一个用户都只保存自己的私钥SK 和KDC 的公钥PKKDC,而在通信时再经由KDC 获得其他用户的公钥PK 或者仅仅在某一次通信中可以使用的对称密钥加密算法的临时密钥K。假设有两个用户A、B 都是KDC 的注册用户,他们分别拥有私钥SKA 和SKB,相应的公钥分别是PKA 和PKB。现在A 想要与B 进行会话,假如采用对称密钥加密算法来加密这次会话,那么密钥的分配过程如图16-2 所示。
这些安全知识点,架构师必须要懂!
首先用户A 向KDC 发送用自己的私钥SKA 加密的请求SKA(A,B),说明自己想要与B 进行会话。

KDC 收到这个请求后,根据某种算法生成一个可以供A、B 双方进行秘密会话的对称密码算法的密钥K,然后向A 返回一个应答PK(K, PKB(A, K))。这个应答信息是用A 的公钥PKA 加密的,当然只有用户A 自己才能够正确解读,可以从中提取与B 会话的密钥K。

同时,该信息中还有一部分内容PKB(A,K),表明用户A 欲与B 进行会话,并且密钥是K,这是用B 的公钥PKB 加密的。用户A 把这一部分信息发送给B,B 收到后从中解密出会话密钥。

至此,完成一次密钥的自动分配过程。此后,A、B 双方就可以利用密钥K 进行加密通信了。

2.5公钥加密体制的密钥管理

密钥管理方式包括以下4种形式:

1. 公开发布
公开发布是指用户将自己的公钥发给每一其他用户,或向某一团体广播。例如: PGP(PrettyGood Privacy)中采用RSA 算法,很多用户就可将自己的公钥附加到消息上,发送到公开区域这种方法虽然简单,但有一个非常大的缺点: 任何人都可以伪造密钥公开发布。如果某个用户假装是用户 A,并以 A 的名义向另一用户发送或广播自己的公开钥,则在 A 发现假冒者以前这一假冒者可解读所有发向 A 的加密消息,甚至还能用伪造的密钥获得认证.

2. 公用目录表
公用目录表指一个公用的公钥动态目录表,由某个可信的实体或组织(公用目录的管理员)承担该共用目录表的建立、维护以及公钥的分布等。管理员为每个用户在目录表中建立一个目录,其中包括用户名和用户的公开钥两个数据项,并且定期公布和更新目录表。每个用户都亲自或以某种安全的认证通信在管理者那里注册自己的公开钥,可通过电子手段访问目录表,还可随时替换新密钥。但是,这种公用目录表的管理员秘密钥一旦被攻击者获取,同样面临被假冒的危险。

3. 公钥管理机构
与公用目录表类似的,不过用公钥管理机构来为各用户建立、维护动态的公钥目录,这种对公钥分配更加严密的控制措施可以增强其安全性。特别注意的是,每个用户都可靠地知道管理机构的公开钥,但是只有管理机构自己知道相应的秘密钥。例如:当用户 A 向公管理机构发送一个请求时,该机构对请求作出应答,并用自己的秘密钥 SKar 加密后发送给 A,A 再用机构的公开解密。
它的缺点在于因为每一用户要想和他人联系都须求助于管理机构,所以容易使管理机构成为系统的瓶颈,并且管理机构维护的公钥目录表也容易被敌手窜扰。

4.公钥证书
公钥证书可以从一定程度上解决以上策略存在的一些不足之处。公钥证书是由证书管理机构CA (Certifcate Authority)为用户建立的,其中的数据项有与该用户的秘密相匹配的公开钥及用户的身份和时戳等,所有的数据项经 CA 用自己的秘密钥签字后就形成证书,即证书的形式为CA-ESKcA[T,IDA,PKA]。T是当前的时戳,IDA是用户A 的身份,PKA是A的公SKca是 CA 的秘密钥,CA 则是用户A 产生的证书。用户将自己的公开钥通过公钥证书发给另一用户,而接受方则可用 CA 的公 PKa对证书加以验证。这样通过证书交换用户之间的公钥而无须再与公钥管理机构联系,从而避免了由统一机构管理所带来的不便和安全隐患。

从上述4种形式来看,第4种方式为最优的,那么什么是数字证书呢?

2.6何为数字证书?

数字证书提供了一个在公钥和拥有相应私钥的实体之间建立关系的机制。目前最常用的数字证书格式是由国际标准ITU-T X.509 v3 版本定义的。
数字证书中采用公钥体制,即利用一对互相匹配的密钥进行加密、解密。每个用户自己保存私钥,用它进行解密和签名;同时设定一个公钥,并由本人公开,为一组用户所共享,用于加密和验证签名。

数字证书是用户在系统中作为确认身份的证据。在通信的各个环节中,参与通信的各方通过验证对方数字证书,从而确认对方身份的真实性和有效性,从而解决相互间的信任问题。

数字证书的内容一般包括:唯一标识证书所有者的名称、唯一标识证书签发者的名称、证书所有者的公开密钥、证书签发者的数字签名、证书的有效期及证书的序列号等。

公开密钥基础设施

PKI即为公开密钥基础设施。在信息系统中的作用就相当于作为公共设施在社会生活中的作用,其目标是向广大的信息系统用户和应用程序提供公开密钥的管理服务。PKI 是指由数字证书、证书颁发机构(Certificate Authority,CA),以及对电子交易、通信等所涉及的各方的合法性进行检查和验证的其他注册机构组成的一套系统。为了使用户在不可靠的网络环境中获得真实可靠的公开密钥,PKI 引入公认可信的第三方;

PKI 中有三类实体:管理实体、端实体和证书库。管理实体是PKI 的核心,是PKI 服务的提供者;端实体是PKI 的用户,是PKI 服务的使用者;证书库是一个分布式数据库,用于证书和CRL 的存放和检索。

CA 和注册机构(RegisteAuthority,RA)是两种管理实体。CA 是PKI 框架中唯一能够发布和撤销证书的实体,维护证书的生命周期;RA 负责处理用户请求,在验证了请求的有效性后,代替用户向CA 提交。RA 可以单独实现,也可以合并在CA 中实现。作为管理实体,CA 和RA 以证书方式向端实体提供公开密钥的分发服务。

持有者和验证者是两种端实体。持有者是证书的拥有者,是证书所声明的事实上的主体。持有者向管理实体申请并获得证书,也可以在需要时请求撤销或更新证书。持有者使用证书声明自己的身份,从而获得相应的权力。验证者确认持有者所提供的证书的有效性和对方是否为该证书的真正拥有者,只有在成功鉴别之后才可与对方进行更进一步的交互。

证书库可以用Web、文件服务器存储(FTP、FSTDFS、minIO等) 或目录等来实现。由于证书库中存取的对象是证书和CRL,其完整性由数字签名保证,因此对证书库的操作可在无特殊安全保护的通道上传输。

PKI 框架可以分为三个层次。最低层是传输层,向上提供PKI 报文的可靠传输,它可以是传输层协议或应用层协议。中间层是密码学服务层,向上提供加密、解密、数字签名、消息摘要等基本密码学服务,可由RSA、MD5 等方法实现。最高层是证书服务层,使用前面两层提供的加密和传输服务,向用户提供证书的请求、签发、发布、撤销和更新等服务。

X.509 数字证书: ISO/ITU、ANSI、IETF 等组织制定的X.509 标准,对数字证书的格式进行了专门定义,该标准是为了保证使用数字证书的系统间的互操作性而制定的。理论上为一种应用创建的X.509 证书可以用于其他任何符合X.509 标准的应用。其包含的数据项有:
①版本号。用来区分X.509 的不同版本号。
②序列号。由CA 给每一个证书分配唯一的数字型编号,由同一CA 发放的每个证书的序列号是唯一的。
③签名算法识别符。用来指定CA 签发证书时所使用的公开密钥算法和HASH 算法,须向国际标准组织注册。
④发行者名称。建立和签署证书的CA 名称。
⑤有效期。证书有效的时间包括两个日期:证书开始生效的日期、证书失效的日期和时间。在所指定的这两个时间之间有效。
⑥主体名称。证书持有人的姓名、服务处所等信息。
⑦主体的公开密钥信息。包括主体的公开密钥、使用这一公开密钥的算法的标识符及相应的参数。
⑧发行者唯一识别符。这一数据项是可选的,当CA名称重新用于其他实体时,则用这一识别符来唯一标识发行者。
⑨主体唯一标识符。这一数据项也是可选的,当主体的名称重新用于其他实体时,则用这一识别符来唯一识别主体。
⑩扩充域。其中包括一个或多个扩充的数据项。
⑪签名。CA 用自己的私钥对上述各数据项的散列值进行数字签名的结果。

2.7公钥加密分配单钥密码体制的密钥

公开钥分配完之后,用户可用公钥加密体制进行保密通信。但是,这种加密体制的加密速度比较慢,因此比较适合于单钥密码体制的密钥分配,如图 4-5 所示。

假定 A、B 双方用户已完成公交换,则可利用公钥加密体制按照如下步骤建立共享会话密钥.
(1)A 将用 B 的公加得到的身份IDA 和一个用于唯一标志这个业务的一次性随机数 N发往 B。
(2)预使A 确定对方是 B,则B用A的公加密 N 和另一新产生的随机数 N,因为只有B 能解读D中的加密。
(3)A用B的公PKB对N加密后返回给B,以使 B 相信对方确是 A。
(4)A将 M=EpxB[ESKA[K]] 发送给 B,其中K为会话密,用B 的公开加密是为保证只有 B 能解读加密结果,用A 的秘密加密是保证该加密结果只有 A 能发送。
(5) B以 DpxA[DsKR[M] 恢复会话密钥。
这种分配过程的保密性和认证性均非常强,既可防止被动攻击,又可防止主动攻击。

这段话如果用大白话解释一下,公钥加密分配单钥密码体制的密钥 是啥意思呢?下面给个案例来说明一下。

公钥加密分配单钥密码体制的密钥是一种利用公钥加密技术来实现对称加密密钥的安全传输的方法。简单地说,就是用公钥加密来保护对称加密的密钥,这样就可以避免密钥配送问题,同时也可以提高加密效率。我用一个通信的案例来解释一下:

假设小明和小红想要用对称加密来保密通信,但是他们没有共享的对称密钥,也没有安全的密钥分配中心。他们可以采用如下步骤:

  1. 小明和小红各自生成一对公钥和私钥,比如使用 RSA 算法。公钥是公开的,可以给任何人,私钥是保密的,只能自己使用。

  2. 小明把自己的公钥发给小红,小红把自己的公钥发给小明。这样他们就可以互相用对方的公钥来加密信息。

  3. 小明随机生成一个对称密钥,比如使用 AES 算法。这个对称密钥就是他们通信的会话密钥,用来加密和解密他们的消息。

  4. 小明用小红的公钥来加密这个对称密钥,然后把加密后的结果发给小红。这样只有小红能用自己的私钥来解密,得到对称密钥。

  5. 小红用自己的私钥来解密小明发来的信息,得到对称密钥。然后她用这个对称密钥来加密自己的消息,比如“收到,不要迟到”,然后发给小明。

  6. 小明用对称密钥来解密小红发来的消息,得到明文。然后他也用对称密钥来加密自己的回复,比如“好的,我会准时到”,然后发给小红。

  7. 小红用对称密钥来解密小明发来的回复,得到明文。然后他们就可以继续用对称密钥来加密和解密他们的通信内容。

这个案例就是公钥加密分配单钥密码体制的密钥的一个示例。它的优点是可以保证对称密钥的安全传输,也可以提高通信的效率,因为对称加密的速度比公钥加密的速度快得多。它的缺点是需要双方各自生成和管理公钥和私钥,也需要注意公钥的真实性和有效性,防止中间人攻击或者公钥被篡改。

3数字签名

对于计算机系统中传送、存储的重要文件、数据、信息等,一般需要有某种方式来确认其真实性,即接收者能够确认自己得到的信息确实是由该信息所声称的发送者发出的,而不是由非法入侵者伪造、冒充发出的,并且还要能够保证信息在传送、存储中没有被恶意篡改,这样这份信息才能真实地反映发送方的意图。另外,对于发送方来说,如果发出一份信息,还必须有一定的措施阻止其否认自己发出信息的行为,即不可否认性。

只有做到以上几点,一个信息传送、存储系统才能够安全、可靠,其上所传送、存储的信息才是真实的、值得相信的。

举例来说,互有贸易往来的买卖双方之间通过计算机系统进行贸易,卖方通过计算机系统给买方发出一张电子报价单,买方收到后,擅自更改了收到的单价,并声称是卖方发出的,而且据此下订单,这就是篡改信息。显然安全的系统应该能够阻止这种行为。要实现上述安全的系统,就离不开数字签名技术。

数字签名主要由两个算法组成:签名算法和验证算法。通过使用签名算法签名一个消息,所得到的签名能够通过一个验证算法来验证签名的真实性和有效性。

所以数字签名技术的大致过程就是:信息的发送方对信息利用自己的私钥进行签名,接着发送方把这个签名和信息一起发送给接收方。接收方收到信息后利用发送方的公钥来对其中的数字签名进行验证,确认其合法性。

目前已经有大量的数字签名算法,例如,RSA 数字签名算法、EI Gamal、Fiat-Shamir、Guillon-Oucsquerrter、DSS(Digital Signature Standard,数字签名标准)、DSA(Digital Signature Algorithm,数字签名算法)、椭圆曲线等。

3.1数字签名的条件

与人们手写签名的作用一样,数字签名系统向通信双方提供服务,使得 A 向 B 发送签名的消息 P,以便达到以下几点:
(1) B可以验证消息 P 确实来源于 A。
(2) A 以后不能否认发送过 P。
(3)B 不能编造或改变消息 P。

可用的数字签名应保证以下几个条件:

(1) 签名是可信的。签名使文件的接收者相信签名者是慎重地在文件上签字的
(2) 
签名不可伪造。签名证明是签字者而不是其他人慎重地在文件上签字。
(3) 
签名不可重用。签名是文件的一部分,不法之徒不可能将签名移到不同的文件上
(4) 
签名的文件是不可改变的。在文件签名后,文件不能改变。(5)签名是不可抵赖的。签名和文件是物理的东西。签名者事后不能声称他没有签过名。在现实生活中,关于签名的这些特性没有一个是完全真实的。签名能够被伪造,签名能够从文章中盗用移到另一篇文章中,文件在签名后能够被改变。在计算机上做这种事情,同样存在一些问题。首先计算机文件易于复制。即使某人的签名难以伪造(例如,手写签名的图形).但是从一个文件到另一个文件剪切和粘贴有效的签名都是很容易的。这种签名并没有什么意义:其次文件在签名后也易于修改,并且不会留下任何修改的痕迹。为解决这些问题,数字签名技术就应运而生。

3.2对称密钥签名

基于对称密钥的签名如图4-6 所示。设 BB是A和B共同信赖的仲裁人。KA和KB分别是A和B与BB之间的密钥,而KBB 是只有 BB 掌握的密,P是A发给B 的消息,t是时间戳。BB解读了A的报文{A,K。(B,RA,t,P)}以后产生了一个签名的消息 Ke (A,t,P),并装配成发给 B的报文K。(A,R,t,P,Ke (A,t,P))了。B 可以解密该报文,阅读消息 P,并保留证据 Kee (A,t,P)。由于 A和B之间的通信是通过中间人 BB 的,所以不必怀疑对方的身份。又由于证据 KB (A,t,P)的存在,A 不能否认发送过消息 P,B 也不能改变得到的消息 P,因为 BB 仲裁时可能会当场解密 Kbb(A,t,P),得到发送人、发送时间和原来的消息 P 。这些安全知识点,架构师必须要懂!

对称密钥签名是一种利用对称密钥加密技术来实现消息的认证和不可否认性的方法。简单地说,就是用双方共享的密钥来加密和验证消息的内容和来源。对称密钥签名的缺点是需要一个可信的第三方来协助分配和管理密钥,而且密钥的安全性依赖于第三方的可靠性。用一个案例来解释一下:

假设小明和小红想要用对称密钥签名来保证他们的通信的真实性和完整性,但是他们没有共享的密钥,也没有安全的密钥分配中心。他们可以采用如下步骤:

  1. 小明和小红各自和一个可信的第三方小白建立对称密钥加密的通道,比如使用 AES 算法。小明和小白共享一个密钥 Ka,小红和小白共享一个密钥 Kha,小白还有一个自己的密钥 Kee。这些密钥都是事先通过安全的方式分配好的。

  2. 小明想要给小红发送一个消息 P,比如“我爱你”。他先用小白的公钥加密一下,得到一个密文 C。他还生成一个随机数 Ra,和一个时间戳 t,表示发送的时间。他把这些信息都打包成一个报文,用自己和小白的共享密钥加密,然后发给小白。

  3. 小白收到小明的报文后,用自己和小明的共享密钥解密ka,得到小明的身份,小红的身份,随机数 Ra,时间戳 t,和密文 C。小白用自己的私钥解密密文 C,得到消息 P。小白用自己的密钥 Kbb 加密小明的身份,时间戳,和消息,得到一个签名 S。小白再用小孩的公钥将P加密成密文C ,小白把小明的身份,随机数,时间戳,明文,和签名都打包成一个报文,用和小红共享的对称密钥加密,然后发给小红。

  4. 小红收到小白的报文后,用自己和小白的共享密钥解密,得到小明的身份,随机数,时间戳,密文,和签名。小红用自己的私钥 解密密文,得到消息 P。小红用小白的公钥解密签名,得到小明的身份,时间戳,和消息。小红比较解密后的消息和签名中的消息是否一致,如果一致,就说明消息没有被篡改,而且是小明发送的。小红还可以检查时间戳,看看消息是否是最新的,防止重放攻击。

这个案例就是对称密钥签名的一个示例。它的优点是可以保证消息的真实性和完整性,也可以防止发送方和接收方的否认。它的缺点是需要一个可信的第三方来协助密钥的分配和管理,而且密钥的安全性依赖于第三方的可靠性。

那么上述案例一共有多少个密钥呢?我们再来分析一下:上述一共提到了六个密钥,下面按照功能的特点来分分类

加密与解密

  • Ka,小明和小白的对称密钥,用来加密和解密他们之间的通信,只有他们两个知道。

  • Kb,小红和小白的对称密钥,用来加密和解密他们之间的通信,只有他们两个知道。

  • 小红的私钥,用来加密和解密小白的报文,只有他自己知道。

  • 小红的公钥,用来加密和解密小红的报文,任何人都可以知道。

签名使用

  • Kbb,小白的私钥,用来加密和解密他自己的签名,只有他自己知道。

  • 小白的公钥,用来加密和解密小白的签名,任何人都可以知道。

由上面可看出,公钥和私钥都是成对出现的,这些密钥都是用来保证消息的保密性,完整性,真实性,和不可否认性的。对称密钥是指加密和解密使用同一个密钥的加密技术,比如 Ka 和 Kb。非对称密钥是指加密和解密使用不同的密钥的加密技术,比如小白的公钥和私钥。公钥是指可以公开给任何人的密钥,私钥是指只能自己保管的密钥。

3.3对称密钥签名方式是如何做到数据的安全传输的

这是一种双重加密的方法,可以提高消息的安全性。下面我们再一步一步剖析一下

小明

(1)先用小白的公钥加密 (原始消息P) 得到密文C
(2)再用他自己和小白的共享密钥Ka(对称密钥) 
加密M(小红身份信息、密文C、随机数N、时间戳 t) 得到密文 M1
(3)将 (小明自己的身份、M) 发送给小白

小白

(1)小白收到密文M1,用Ka 解密得到 M(小红身份信息、密文C、随机数N、时间戳 t)
(2)用小白的私钥kbb
解密C 得到原始明文 P
(3)用小白的私钥kbb 
加密(加签) (小明的身份、时间戳、P) 得到签名信息 S
(4)用小红的公钥
加密明文P得到密文C
(4)用Kb
加密(小明的身份、时间戳、随机数、签名、密文) 打包发送给小红。

小红

(1)小红收到后用 Kb 解密 得到 (小明的身份、时间戳、随机数、签名、密文)
(2)根据得到信息用小白的公钥
验证签名的有效性

首先来分析一下 小明和小白的交互,我们可以看到使用双层加密模式,小明先用小白的公钥加密这个消息,是为了保证只有小白能解密,防止其他人截取或者篡改消息。然后再用自己和小白的共享密钥 Ka 加密一下,是为了保证小白能识别出这个消息是来自小明的,防止其他人伪造或者冒充消息。这样,小明就可以把这个双重加密后的密文 C 发给小白,让小白帮他转发给小红。小白收到密文 C 后,就可以先用自己和小明的共享密钥 Ka 解密一下,得到小白的公钥加密后的消息,然后再用自己的私钥解密,得到原始的消息 P。这样,小白就可以验证这个消息是来自小明的,而且没有被修改过。

然后,小白就可以用自己的密钥 Kbb 给这个消息签名,然后用小红的公钥加密,再用自己和小红的共享密钥 Kb 加密,得到一个新的密文 D,发给小红。小红收到密文 D 后,就可以先用自己和小白的共享密钥 Kb 解密一下,得到小红的公钥加密后的消息和签名,然后再用自己的私钥解密,得到消息 P 和签名 S。然后,小红就可以用小白的公钥解密签名 S,得到小明的身份,时间戳,和消息。这样,小红就可以确认这个消息是来自小明的,而且没有被篡改过,而且是最新的。

小红收到消息后是如何验证小明的身份的,又是如何验证签名的

小红收到消息后是如何验证小明的身份的,又是如何验证签名的,我来给您解释一下:

  • 验证小明的身份:小红收到的消息中,有一个随机数 Ra,这个随机数是小明生成的,只有小明和小白知道。小红可以用小白的公钥解密签名 S,得到小明的身份,时间戳,和消息。小红可以比较解密后的消息和签名中的消息是否一致,如果一致,就说明消息没有被篡改,而且是小明发送的。小红还可以检查时间戳,看看消息是否是最新的,防止重放攻击。小红还可以用小白的公钥加密 Ra,然后发给小白,让小白用自己的私钥解密,得到 Ra。小白可以用 Ra 和小明之前发来的 Ra 比较,如果一致,就说明小红确实收到了小明的消息,而且是最新的。这样,小白就可以作为一个可信的第三方,来证明小明的身份和消息的真实性。

  • 验证签名:小红收到的消息中,有一个签名 S,这个签名是小白用自己的密钥 Kee 加密小明的身份,时间戳,和消息得到的。小红可以用小白的公钥解密签名 S,得到小明的身份,时间戳,和消息。小红可以比较解密后的消息和签名中的消息是否一致,如果一致,就说明签名是有效的,而且是小白生成的。小红还可以检查时间戳,看看消息是否是最新的,防止重放攻击。这样,小红就可以验证签名的正确性和完整性,而且可以防止小明或者小白的否认。

3.4这些密钥是如何分配的

这些密钥是由密钥分配中心(KDC)或者证书颁发机构(CA)分配的。密钥分配中心是一个可信的第三方,它可以为通信双方生成和分发对称密钥,也可以为通信双方提供票据和签名来验证对方的身份。证书颁发机构是一个专门负责颁发和管理公钥证书的机构,它可以为通信双方提供公钥和证书,也可以为公钥和证书提供签名和验证。

  • Ka,小明和小白的对称密钥,是由密钥分配中心(KDC)分配的。KDC是一个可信的第三方,它可以为通信双方生成和分发对称密钥,也可以为通信双方提供票据和签名来验证对方的身份。

  • Kb,小红和小白的对称密钥,也是由KDC分配的,同上。

  • Kbb,小白的私钥,是由小白自己生成的。小白的私钥是用来加密和解密他自己的签名的,只有他自己知道,不能泄露给任何人。

  • 小白的公钥,是由小白自己生成的,与小白的私钥匹配。小白的公钥是用来加密和解密小白的签名的,任何人都可以知道,可以公开发布或者注册到证书颁发机构(CA)。

  • 小白的私钥,是由小白自己生成的,与小白的公钥匹配。小白的私钥是用来加密和解密小白的报文的,只有他自己知道,不能泄露给任何人。

  • 小红的公钥,是由小红自己生成的,与小红的私钥匹配。小红的公钥是用来加密和解密小红的报文的,任何人都可以知道,可以公开发布或者注册到CA。

随机数和时间戳是如何起到作用的呢?比如它是如何验证小明的身份和消息的真实性的?或者如何来防止重放攻击或时效性的?

  • 验证小明的身份:小明发给小白消息时,会生成一个随机数 Ra,这个随机数是小明自己生成的,只有小明和小白知道。小白收到小明的消息后,会用小白的公钥加密 Ra,然后发给小红,让小红转发给小明。小明收到小白的回复后,会用小白的私钥解密,得到 Ra。小明可以用 Ra 和自己之前生成的 Ra 比较,如果一致,就说明小白确实收到了小明的消息,而且是最新的。这样,小明就可以验证小白的身份和消息的真实性。

  • 验证消息的真实性:小明发给小白消息时,会生成一个时间戳 t,表示发送的时间。小白收到小明的消息后,会用自己的密钥 Kee 加密小明的身份,时间戳,和消息,得到一个签名 S。小白把签名 S 发给小红,让小红转发给小明。小明收到小白的回复后,会用小白的公钥解密签名 S,得到小明的身份,时间戳,和消息。小明可以比较解密后的消息和自己之前发送的消息是否一致,如果一致,就说明消息没有被篡改,而且是小白签名的。小明还可以检查时间戳,看看消息是否是最新的,防止重放攻击。这样,小明就可以验证消息的真实性和完整性。

  • 防止重放攻击:重放攻击是指其他人利用之前截取或者记录的消息来冒充小明或者小白。如果没有随机数和时间戳,那么其他人就可以用之前的消息来欺骗小明或者小白,让他们以为是最新的消息。但是如果有了随机数和时间戳,那么其他人就无法重放消息,因为随机数和时间戳都是一次性的,每次发送的消息都不一样,而且都有有效期限。如果随机数或者时间戳不匹配或者过期,那么小明或者小白就可以识别出重放攻击,拒绝接受消息。

3.5公开密钥签名

在对称密码体制中由于加密密钥和解密密钥是可以相万推导的。密钥暴露会使系统变得不安全。而公钥密码体制可以很容易地解决密钥交换问题。在公钥密码系统中,解密密钥和加密密钥是不同的,并且很难从一个推导出另外一个。
利用公钥加密算法的数字签名系统如图 4-7 所示。如果 A 方否认,B 可以拿出 D。(P),并用A的公钥E 解密得到P,从而证明P是A发送的。如果B 篡改消息P,当A要求B 出示原来的D。(P)时,B 拿不出来。
这些安全知识点,架构师必须要懂!
其实上述流程非常简单:

1、假如 A要给B发消息,A B首先需要交换公钥,假如A的公钥和私钥对为 Pa和Ka,B的公钥和私钥对为Pb和Kb。
2、A将消息用Ka进行签名 形成Da(P)
3、A将Da(P)用B的公钥Pb进行加密形成Pb(Data(P))
4、B接收到之后先用自己的私钥Kb解密出Da(P)
5、B用A的公钥Pa解密密文拿到明文P。

但是这样的签名机制会有个性能问题,在实践中,对长文件签名采用公钥密码算法效率太低。为了节约时间,数字签名协议经常和单向 Hash 函数一起使用,即并不对整个文件签名,只对文件的 Hash 值签名。基于消息摘要大大地提高了数字签名的计算速度。此外该协议还有其他优点: 首先,签名和文件可以分开保存。其次,接收者对文件和签名的存储量要求大大降低。档案系统可用这类协议来验证文件的存在而不需保存它们的内容。用户将文件的 Hash 值传给数据库,数据库加上时间标记并保存如果对某文件的存在发生争执,数据库可通过找到文件的 Hash 值来解决争端。

3.6 RSA 结合MD5 数字签名

前面讲过,RSA 公钥加密技术本身就可以用来实现数字签名。但是仅仅使用公钥加密算法进行数字签名的运算量比较大,尤其是要传送的信息量比较大时,速度会更加慢。显然,直接用这种方法进行数字签名并不是很好的选择。

而散列算法(例如,MD5 算法)就有很好的特性,它能对每一个不同长度的信息产生相互不同的、独特的、简短的消息摘要。这个消息摘要可以看作这个信息特有的“指纹”,因而非常适合用作数字签名。

通过散列算法对原始数据进行散列,再对散列码进行公钥加密就可以很好地实现数字签名。它的特点是:它代表了文件的特征,具有唯一性。只要文件发生哪怕一位数据的改变,或者签名者有任何差别,数字签名的值也将随之而发生改变;不同的文件和签名者得到的是不同的数字签名。

RSA 结合MD5 数字签名的主要过程是:信息的发送方通过对信息进行散列运算生成一个消息摘要,接着发送方用自己的私钥对这个消息摘要进行加密,就形成发送方的数字签名。然后,把这个数字签名作为信息的附件和信息一起发送给信息的接收方。接收方收到信息后,首先对收到的信息进行与发送者相同的散列运算得到一个消息摘要,接着再用发送方的公钥来对信息中附加的数字签名进行解密得到发送方计算出的散列码。如果两个散列码相同,那么接收方就能确认该信息和数字签名是由发送方发出的。通过数字签名能够实现对原始信息完整性的鉴别和发送方发送信息的不可抵赖性。

下面结合一个例子,看一看RSA 结合MD5 数字签名的具体步骤:
(1)信息发送者A要向B 发送一份信息,A 先按双方约定的散列算法对该信息进行散列运算,得到一个该信息特有的消息摘要H,从前面所述可以知道,只要改动信息中任何一位,重新计算出的消息摘要值就会与原先的值不相符。这样就保证了信息的不可更改性。
(2)接着把该消息摘要用A 自己的私钥加密,得到A 对该信息的数字签名S。
(3)然后A 把信息原文与数字签名S 一起发送给B。
(4)当B 收到后,先用A 的公钥对数字签名S 解密得到A 的消息摘要H。
(5)再用同样的散列算法对收到的信息进行散列运算,得到消息摘要H’。
(6)比较H 与H’,如相等则说明信息确实来自它所声称的发送者A。
在传输过程中,如有攻击者对文件进行了篡改,但他并不知道发送方的私人密钥,因此,接收方解密得到的数字签名H 与经过计算后的数字签名H’必然不同。这就提供了一个安全的确认发送方身份的办法。

当然,以上例子中,对传送的信息是以明文出现的,不具有保密意义。实际应用中,还需要对信息本身运用适当的保密措施。

所以我们还要讲加密和解密的流程加进去,完整的流程如下:
假设一个用户A 想要发送一个加密的邮件给另一个用户B。那么加密的过原理如下图所示:
这些安全知识点,架构师必须要懂!
这个流程图是参考PGP加密的原理,下面描述一下这个过程:

(1)首先,用户A 对要发送的邮件P 运用MD5 散列算法进行计算,生成一个128 位的消息摘要,有了这个消息摘要就可以检验邮件信息是否完整、有没有被篡改。
(2)然后再通过RSA 算法,运用A 的私钥SKA 对消息摘要进行加密,生成消息摘要的密文H。邮件P 与经过加密的邮件消息摘要H 共同构成新的报文P1,接着对P1 进行ZIP 压缩,成为压缩
的报文P1.Z。
(3)再对P1.Z 采用IDEA 算法加密,这次加密使用一个一次性的密钥K,并且K 必须经过RSA 算法使用通信的另一方B 的公开密钥PKB 加密,与加密后的报文P2 一起,再经过BASE64 编码,得到一系列ASCII 码,作为邮件内容发送到网络上。

用户B 接收到A 发来的加密的邮件后,执行解密过程:与加密过程相反,首先对邮件内容进行BASE64 解码,再利用自己的秘密密钥SKB,通过RSA 算法解出IDEA 的密钥K。再用此密钥恢复出P1.Z,对P1.Z 进行解压缩后还原出P1。接着把明文P 和邮件信息摘要的密文H 分离开来,并用A 的公开密钥PKA 解密H 得到真正的邮件消息摘要。然后B 自己也运用MD5 算法对邮件明文P 进行运算,生成一个128 位的消息摘要。比较这两个摘要是否一致,如果一致,则表明P 是A 发来的邮件。通过上述通信过程可以看出,PGP 既可以保证邮件不被第三方窃取,又可以防止发信人抵赖和信件被途中篡改。

总结一下这个流程就是:发送方经过MD5生成摘要-》将摘要用私钥生成签名-〉将签名进行加密。 这也是微信支付过程中用户与商户之前的加密方案

3.7PGP的解释

这里需要注意的是PGP(Pretty Good Privacy)是美国人PhilZimmermann 于1995 年提出的一套电子邮件加密方案。它可以用来对邮件加密以防止非授权者阅读,还能对邮件加上数字签名而使收信人可以确认邮件确实是由发送方发出的。PGP 并不是新的加密算法或协议,它综合采用了多种加密算法,例如,对邮件内容加密采用IDEA 算法、对于加密信息采用RSA 公钥加密算法,还采用了用于数字签名的消息摘要算法,加密前进行压缩处理等技术手段进行邮件加密的一套软件。通过组合使用这些加密方法,把RSA 公钥加密体系的良好加密效果和对称密钥加密体系的高速度结合起来,并且通过在数字签名和密钥认证管理机制中的巧妙设计,使得PGP 成为一个优秀的强有力的数据加密程序。

密钥的管理体制

我们可参考PGP的密钥管理体制来说明,PGP的密钥管理体制是如何的呢?
在PGP 加密通信过程中,密钥无疑起着最为关键的作用。一个成熟的加密体系必然要有一个成熟的密钥管理机制与之相配套。PGP 对于密钥管理也提出了一套分配、使用、管理的方案。

公钥加密体制本身就是为了解决对称密钥加密体制中的密钥分配难以保密的问题而提出的。例如,攻击者常用的手段之一就是“监听”,如果密钥是通过网络传送就很容易被拦截。PGP 中采用公钥来加密,而公钥本来就要公开,所以不存在被监听的问题。但是公钥在发布过程中仍然存在安全隐患。例如,公钥被非法篡改,这就是公钥密码体系中的一大安全隐患,因为这很难被普通用户发现。

举例来说,假如用户A 要向用户B 发一封加密的邮件,那么A 必须拥有B 的公钥。于是A 从公共目录中查到了B 的公钥,并用它加密了邮件然后发给了B。这是一个正常的过程。

但是,在这个过程中可能出现攻击:A 和B 都不知道,另一个用户C 用他自己假冒B 的名字生成的密钥当中的公钥替换了B 的公钥!

那么A 用来发信的公钥就不是B 的而是C 的公钥。然而一切看来都很正常,因为A 拿到的公钥的用户名是B。于是C 就可以用他手中的私钥来解密A 发给B 的邮件,甚至他还可以用B 真正的公钥来转发A 发给B 的信,这样A 和B 都不会发现什么异常,而他们的通信却全部泄漏了。甚至C 如果想改动A 发给B 的邮件也毫无问题。

而且,C 还可以伪造B 的签名给A 或其他人发送信息,因为A 和其他人手中的公钥是C 伪造的,A 和其他人可以正常解密这份伪造的签名,因而以为真是来自B 的信息。

要防止这种情况,必须防止任何人伪造其他人的公钥。例如,通信双方直接见面并交换密钥,就可以避免得到伪造的公钥。然而当双方相隔遥远或不方便直接见面时,就难以直接交换密钥。这种情况下,PGP 是通过一种公钥介绍机制来解决这个问题的。

继续上面的例子:如果A 和B 有一个共同的朋友D,而D 知道他手中B 的公钥是正确的(这里假设D 已经认证过B 的公钥)。这样D 就可以用他自己的私钥在B 的公钥上签名,表示他担保这个公钥是B 的真正的公钥,并把它发送给A。然后A 用D 的公钥来验证D 发给A 的B 的公钥,同样D 也可以向B 担保A 的公钥。这样D 就成为了A 和B 之间的公钥介绍人。

这样B 或D 就可以放心地把D 签过名的B 的公钥列示到公共目录中,供A 读取,没有人能够伪造B 的公钥而不被A 发现。这就是PGP 从不安全的Internet 上传递公钥的安全手段。

不过,如何确认D 的公钥的安全可靠性呢?对这种情况PGP 建议通过一个大家普遍
信任的人或权威部门担当认证机构角色。每个由权威认证机构签字的公钥都被认为是真实的,这样大家只要有一份认证机构的公钥就行了。由于认证机构广泛提供公钥服务,因而其公钥流传广泛,假冒其公钥是很困难的,所以认证其公钥也非常方便。

在PGP 中使用密钥,要注意在使用任何一个公钥之前,一定要首先认证它。无论什么情况下,都不要直接信任一个从公共渠道得来的公钥。而要使用可信的人介绍的公钥,或者自己与对方亲自认证。

所以总结起来就是:需要证书颁发机构来颁发证书,比如CA证书颁发机构。

3.8总结

到此,整个信息安全技术、密钥管理、签名、认证等概念都解释的非常清楚了。如果您理解了本篇文章,那么整个信息系统的安全认证过程就比较好理解了。

参考资料:系统架构师教程第1版、第2版

原文始发于微信公众号(小核桃编程):这些安全知识点,架构师必须要懂!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/215990.html

(0)
李, 若俞的头像李, 若俞

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!