本文介绍了现代网络通信的基本过程以及常见的安全机制,如密码学基础,常见加密算法,秘钥交换协议,通信加密解密过程,CA及其搭建,以及Open SSL与Open SSH等
此前有文章介绍了网络相关内容,我们知道在网络设计之初,并没有过多考虑到安全性,而重点关注了其可靠性,毕竟在当时,有能力或需要接入网络的主机并不多
而时至今日,情况已大不相同,几乎每个人都至少有一个设备接入网络,而此时的通信安全就显得至关重要,这里的通信安全与传统意义上的信息安全不同,其主要关注通信双方(多方通信与双方通信模型相同)在数据传输时的安全
鉴于此,在保证现代网络模型大体不变的情况下,安全方面的增强多数在应用层实现,也有一些在分层模型中添加了逻辑子层,该逻辑子层主要负责数据的加密工作
首先普及几个密码学基本概念:
而数据加密(Data Encryption)是将原始信息,即明文(Plaintext)信息改变为难以读取的密文(Ciphertext或Cyphertext)内容,使之不可读的过程。只有拥有解密方法的对象,经由解密过程,才能将密文还原为正常可读的内容
早期,较为传统的加密与解密是通过替代或置换的方式进行的,如凯撒密码、棋盘密码等。抗战影视剧中的密码本就是此种方式用到的工具
而更新一点的加密方式我们将其称为块加密,所谓块加密就是每次加密一块明文,常见的加密算法有IDEA,DES,AES等
也可以把块加密理解一种特殊的替代密码,但是其每次替代的是一大块。而正是由于一大块,明文空间巨大,而且对于不同的密钥,我们无法做一个表进行对应相应的密文,因此必须得有复杂的加解密算法来加解密明密文
说起加密,不得不提现代密码学,现代密码学主要包含以下几个方面:
对称加密(Symmetric Cryptography),以 DES,AES,RC4 为代表
非对称加密(Asymmetric Cryptography),以 RSA,ElGamal,椭圆曲线加密为代表
哈希函数(Hash Function),以 MD5,SHA-1,SHA-512 等为代表
数字签名(Digital Signature),以 RSA 签名,ElGamal 签名,DSA 签名为代表
一般,加密需要保障数据或信息系统的
机密性(Confidentiality)
完整性(Integrity)
可用性(Availability)
认证性(Authentication)
不可否认性(Non-repudiation)
其中,前三者被称为信息安全的CIA三要素
对称加密(Symmetric Encryption)在加密与解密的过程中都使用同样的密钥,其加密与解密的大致过程如下图
比较常见的对称加密算法有: DES,Triple-DES,IDEA,BLOWFISH等
解决了机密性问题, 但是无法解决秘钥有效管理问题。即在密钥的产生阶段,由于加解密的过程使用相同的密钥,因此双方需要事先对产生密钥的机制达成共识;此外,双方都要确保密钥只有发送者以及接收者知道,没有泄漏。一旦有第三方知道了密钥,数据的安全性就失效了
对称加密算法在加密和解密时使用的是同一个秘钥;而非对称加密算法需要两个密钥来进行加密和解密,这两个密钥是公开密钥(Public Key,简称公钥)和私有密钥(Private Key,简称私钥)
顾名思义,公钥是可以公开的,而私钥只能由自己保管;同时,私钥加密的数据,只能由公钥解密,反之亦然,并且公钥可以通过算法从私钥中提取
此外他还可实现密码学中的多种要素,如发送方使用自己的私钥加密数据, 可以实现身份验证;而发送方使用自己的公钥加密数据, 可以保证数据机密性……
在非对称加密中使用的主要算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC等
不过,此种加密方式很少用作加密数据本身,因为相较于对称加密,非对称加密速度极慢,故其常用作身份认证
严格来讲,单向加密并不完全算作一种加密类型,其主要用作提取数据指纹信息
理论上讲,单向加密是不可逆的,故单向加密又称为不可逆加密算法,在加密过程中不使用密钥,明文由算法加密处理成密文,密文无法解密。一般适合于信息验证,在验证过程中,重新输入明文,并经过同样的加密算法处理,得到相同的密文并被系统重新认证。广泛使用于口令加密
单向加密由以下特点
输入相同, 输出必然相同
雪崩效应: 输入的微小改变, 将会引起结果的巨大改变
定长输出: 无论原始数据多大, 结果大小都是相同的
不可逆: 无法根据特征码还原原来的数据
关于单向加密,在介绍用户管理时已有提及
此处将重点从通信安全的角度考虑,在TCP/IP中,是几乎没有安全性可言的,如ftp、http、telnet、smtp等协议在网络中都是明文传输的,仅机密性就无从得到保障
以下将简要介绍常见加密方式及其特点
MD4: Message-Digest Algorithm,消息摘要算法
MD5:消息摘要算法第5版
SHA1: Secure Hash Algorithm,安全哈希算法
CRC-32: Cyclic Redundancy Check,循环冗余校验码,事实上他不是加密算法, 提供校验功能
想象这样一种场景,互联网上的两台主机在进行通信时欲使用对称加密来保护传输数据,而加密解密使用的密钥要如何让对端知晓?若将密钥加密传输,而解密此密钥的Key如何传输……
IKE(Internet Key Exchange,互联网密钥交换)协议主要为了解决密钥交换(Key Exchange)问题,用于在通信双方构建SA(Security Association,安全相关),是IPSec的成员。IKE是一种混合型协议,由RFC2409定义,包含了3个不同协议的有关部分:ISAKMP、Oakley和SKEME
IKE和ISAKMP的不同之处在于:IKE真正定义了一个密钥交换的过程,而ISAKMP只是定义了一个通用的可以被任何密钥交换协议使用的框架
Oakley:定义IKE提供了一个多样化,多模式的应用,让IKE可以用在很多场合
SKEME:提供了IKE交换密钥的算法,方式;即,通过DH进行密钥交换和管理的方式
ISAKMP:它是一个框架,在该框架以内,它定义了每一次交换的包结构,每次需要几个包交换,主模式6个包交换和主动模式3个包交换
此处简要介IKE中的SKEME,即密钥交换算法
DH(Diffie–Hellman)即Diffie–Hellman key Exchange,可以让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥,其交换过程如下
通信双方A和B商定选择一个大素数p
,一个生成系数g
,g
是p
的一个模p
本原单位根,以明文方式传送
A在本机选择随机数x
,B在本机选择随机数y
g
,
p
,
(g^x)%p
,
(g^y)%p
x
和
y
的值
下图可能更好理解一些:
此外,还有ECDH(Elliptic-curve Diffie–Hellman,椭圆曲线DH),ECDH是基于ECC(Elliptic Curve Cryptosystems,椭圆曲线密码体制)的DH1
在以上介绍的加密方式中,无论是对称加密,单向加密,还是公钥加密,都无法完全满足密码学安全要素,而在现代网络通信中,通常使用非对称加密 + 单向加密的方式确保通信安全,过程如下2:
签名者在发送数据前, 计算数据的特征码, 并使用自己的私钥将特征码加密, 再发送给验证者;
验证者在接受到信息后, 使用签名者的公钥解密, 得到特征码, 再对数据提取特征码, 与解密得到的特征码比对, 若相同, 则认为是签名者发送的信息,且数据完整
该方式实现了身份验证, 并且保证了数据的完整性
在上述非对称加密 + 单向加密的方式中,对方公钥的获取是一个重要环节,而通信双方在公钥传输的过程中,无论如何加密,都有可能受到第三者的中间人攻击(Man-In-The-Middle attack,MITM)3
为防止在请求公钥过程中的中间人攻击, 需要借助于一个权威的第三方机构
而此时的过程又多了一步:
A
将自己的名字, 地址等信息, 连同自己的公钥给发证机构
- 发证机构计算以上信息的特征码, 并将得到的特征码使用发证机构自己的私钥加密, 加密后的数据(即数字签名, 或称为戳)附加在证书后
- 若
B
请求A
的公钥,A
将自己的证书发送给B
,B
使用发证机构的公钥解密, 得到特征码, 并与收到的数据进行计算而得到的特征码进行比对, 无误后, 身份验证通过, 得到的公钥可以认为是A
的公钥
而此时,我们要获得签证机构的公钥,为确保安全,则只能通过线下渠道获取,如签证机构将其公钥保存在移动存储设备中,人工交给用户
我们可以看到,上述方式并没有加密传输内容本身,这就无法保证信息的机密性,我们可使用对称加密将数据本身加密,大致过程如下
A
和B
在通信前, 使用上述方式得到对方的公钥, 再使用IKE(Internet Key Exchange)协议, 生成一个对称秘钥
A
对要发送的信息提取特征码, 并使用自己的私钥去加密提取出来的特征码
至此, 和上述方式相同, 可以保证了数据的完整性和身份认证
- 而后
A
使用对称秘钥将信息和加密后的特征码整个进行加密后发送给B
在不使用 IKE 的方式中,对称加密的秘钥则需要在网络上传输,其实现过程为
A
在给B
发送信息前,使用单向加密计算待发送信息的指纹,并使用自己的私钥将该指纹加密,将加密后的指纹附加在信息之后
A
生成一个随机密码,将步骤1
生成的数据(即待发送信息与使用A
的私钥加密的该信息的指纹)整体使用该随机密码通过对称加密算法进行加密
A
使用B
的公钥将步骤2
中的随机密码进行加密,将加密后的秘钥附加在步骤2
加密的内容后,一并发送给B
该方式亦可保证数据安全
在 步骤1
中,单向加密保证了数据的完整性,使用A
自己的私钥加密可保证身份认证(若使用A
的公钥可解密,即可保证是A
发送的)
在 步骤2
中,使用对称加密来加密信息,可保证数据机密性
使用B
的公钥加密对称秘钥,可保证只有B
可解密该对称秘钥
B
收到A
发来的信息后,使用相反的过程将之解密:
B
收到数据后, 使用自己的私钥解密使用自己公钥加密的对称秘钥,使用该秘钥解密这段数据
B
再使用A
的公钥解密加密后的特征码,再使用单向加密算法,重新计算信息的特征码, 与解密得到的进行比对
- 若结果相同,则可认为是
A
发送的正确信息
A
与B
双方需要进行第一次通信,在A
请求B
的公钥时,C
跳出来将自己的公钥发送给A
,并声称“我就是B
,这是我的公钥”,由于A
与B
是第一次通信,A
根本无法验证收到的内容是不是真正的 B
所发的内容(对比一下ARP欺骗)C
以A
的身份询问并索要B
的公钥,声称“我是A
,请B
给我一下你的公钥”……与A
通信时,C
伪装成B
,与B
通信时,C
伪装成A
,如此,A
与B
的通信将全程在C
的监视之下!即上文提到的MITM(Man-In-The-Middle attack)3上文已有提到,为确保安全,我们在请求他人公钥时需要借助于第三方机构,而本节标题PKI则可理解为这个机构
PKI(Public Key Infrastructure),公钥基础设施,PKI是一种遵循标准的利用公钥加密技术为网络通信提供一套安全基础平台的技术和规范, Wikipedia对其的解释如下4:
A public key infrastructure (PKI) is a set of roles, policies, and procedures needed to create, manage, distribute, use, store & revoke digital certificates and manage public-key encryption. The purpose of a PKI is to facilitate the secure electronic transfer of information for a range of network activities such as e-commerce, internet banking and confidential email. It is required for activities where simple passwords are an inadequate authentication method and more rigorous proof is required to confirm the identity of the parties involved in the communication and to validate the information being transferred.
In cryptography, a PKI is an arrangement that binds public keys with respective identities of entities (like people and organizations). The binding is established through a process of registration and issuance of certificates at and by a certificate authority (CA). Depending on the assurance level of the binding, this may be carried out by an automated process or under human supervision.
The PKI role that assures valid and correct registration is called a registration authority (RA). An RA is responsible for accepting requests for digital certificates and authenticating the entity making the request. In a Microsoft PKI, a registration authority is usually called a subordinate CA.
An entity must be uniquely identifiable within each CA domain on the basis of information about that entity. A third-party validation authority (VA) can provide this entity information on behalf of the CA.
PKI是提供公钥加密和数字签名服务的系统或平台,目的是为了管理密钥和证书。一个机构通过采用PKI框架管理密钥和证书可以建立一个安全的网络环境。PKI 主要包括四个部分:X.509格式的证书(X.509 V3)和CRL(Certificate Revoke List,证书吊销列表)(X.509 V2);CA操作协议;CA 管理协议;CA 政策制定。一个典型、完整、有效的PKI 应用系统至少应具有以下五个部分:
认证中心(CA)CA 是PKI 的核心,CA 负责管理PKI 结构下的所有用户(包括各种应用程序)的证书,把用户的公钥和用户的其他信息捆绑在一起,在网上验证用户的身份,CA 还要负责用户证书的黑名单登记和黑名单发布,后面有CA 的详细描述
X.500 目录服务器 X.500 目录服务器用于发布用户的证书和黑名单信息,用户可通过标准的LDAP协议查询自己或其他人的证书和下载黑名单信息
具有高强度密码算法(SSL)的安全WWW服务器,Secure Socket ayer(SSL)协议最初由Netscape 企业发展,现已成为网络用来鉴别网站和网页浏览者身份,以及在浏览器使用者及网页服务器之间进行加密通讯的全球化标准
Web(安全通信平台) Web 有Web Client 端和Web Server 端两部分,分别安装在客户端和服务器端,通过具有高强度密码算法的SSL 协议保证客户端和服务器端数据的机密性、完整性、身份验证
自开发安全应用系统 自开发安全应用系统是指各行业自开发的各种具体应用系统,例如银行、证券的应用系统等。完整的PKI 包括认证政策的制定(包括遵循的技术标准、各CA 之间的上下级或同级关系、安全策略、安全程度、服务对象、管理原则和框架等)、认证规则、运作制度的制定、所涉及的各方法律关系内容以及技术的实现等
CA(Certificate Authority or Certification Authority),中文一般将之称为证书颁发机构,CA是PKI系统中通信双方信任的实体,亦被称为TTP(Trusted Third Party,可信第三方)
CA保证公钥可靠性的方式,简单来讲就是对公钥做一些防伪措施而已,CA用自己的权威来保证我们可获取到正确完整的公钥,并且CA建立自上而下的信任链,下级CA信任上级CA,下级CA由上级CA颁发证书并认证
此外,信任关系的传递也适用于用户,即若用户信任CA甲,而CA甲信任CA乙,则用户亦信任CA乙
用户申请证书的过程如下图:
用户A
将自己的公钥与相关信息提交给CA,CA验证信息无误后,使用CA自己的私钥,将用户A
提交信息的校验码进行加密后,附加在其之后,这就是所谓的数字证书
而另一用户B
在需要获取用户A
的公钥时,用户A
发送自己的证书,用户B
收到后,若其也信任给A
签署证书的机构,则使用该机构的公钥将证书后的信息解密,若能解密,则证明证书确实的该CA所签署的,而后计算证书主体信息的特征码并与解密出的特征码比对,若依然无误,则证明证书的完整性没有问题
以上操作完成后,查看证书内容信息与通信对象是否匹配,如名称、地址,证书是否在有效期内等,校验通过后,则可以认为正确地获取到用户A
的公钥
过程似乎还是很完美,但是这里依然有两个重要环节:
CA的公钥是验证信息的基础,我们如何可靠获得?
若用户私钥丢失,如何保证他人无法冒充?
第一个问题似乎又回到了如何可靠获取对方公钥上!看来基于这种架构,这是绕不过的一道坎!但是在引入了CA的概念之后,我们只需要保证可以可靠获得CA公钥即可。而为了整套机制的完整,CA会给自己签发一个自签署证书,即该证书的主体为CA,而关于CA证书的获取,我们可以通过线下方式得到CA的证书,而微软公司在其操作系统Windows中内置了全球较为权威的CA证书
我们可以通过 Internet选项 --> 内容 选项卡 --> 证书 查看:
较之于CA证书的获取,私钥丢失的问题就好解决多了。生活中我们的各种证件或卡丢失后,可以挂失5,公章丢失后,可以声明作废。同理,当我们的私钥泄露后,若对应的证书没有过期,这意味着拿到我们私钥的人可以以我们的身份,通过已有的可用证书与他人通信
故我们可以向CA申请,将证书作废,CA将所有声明作废的证书维护进一个专门的数据库中,故在以上介绍的用户B
校验证书时,还应该再加一个重要步骤,即查询该数据库,若此证书已被吊销,则将之丢弃,如此,他人即使得到了私钥,通信依然无法进行
这个数据库我们称之为CA的CRL(Certificate Revoke List),即证书吊销列表
目前证书使用的格式为X.509-v3,其大致信息上文已有说明,此处再做额外补充
X.509由国际电信联盟的标准化部门(ITU-T)定义,并基于另一个ITU-T标准ASN.1。X.509最初于1988年7月3日发布,并与X.500标准一起开始。它采用严格的证书颁发机构(CA)分层系统来颁发证书,其第3版包括支持诸如桥状拓扑(Bridge Topology)和网状拓扑(Mesh Topology)等的灵活拓扑结构
在X.509系统中,欲签名其证书的组织通过证书签署请求(CSR: Certificate Signing Request)请求证书
为此,它首先生成密钥对,保密私钥并使用它来签署CSR。其中包含标识申请人的信息以及用于验证CSR签名的申请人公钥以及证书所用的DN(Distinguished Name)。CSR可以附带证书颁发机构要求的其他凭证或身份证明
该证书颁发机构颁发证书绑定公钥到特定专有名称
可以将组织的受信任根证书分发给所有员工,以便他们可以使用公司的PKI系统。常见的浏览器配备了一组预定根证书的预装,所以SSL各大证书颁发机构的证书可以直接开始工作
X.509和RFC 52806还包括证书撤销列表(CRL)实现的标准。另一种IETF批准的检查证书有效性的方法是在线证书状态协议(OCSP)
标准预见的结构用正式语言Abstract Syntax Notation One(ASN.1)表示
X.509 v3 数字证书的结构如下:
证书
版本号
序列号
签名算法ID
发行人名称
有效期
主体(Subject)名称
主体(Subject)公钥信息
公钥算法
主体(Subject)公钥
发行人唯一标识符(可选)
主题唯一标识符(可选)
扩展信息(可选)
证书签名算法
证书签名
在网络内容介绍时已有提到,最初在设计网络协议时,并没有过多考虑到安全部分,而随着网络发展,完了管理通信面临的安全威胁已不容忽视,以上文介绍的安全目标为例:
威胁保密性(Confidentiality)的攻击:窃听、通信分析
威胁完整性(Integrity)的攻击:更改、伪装、重放,否认
威胁可用性(Availability)的攻击:拒绝服务(DoS)、分布式拒绝服务(DDoS)
我们已不得不加入一些安全保障机制,故在网络分层模型大体不变的前提下,加了一个逻辑层,即SSL
主机直间的通信实质上是主机上各进程间的通信,相信这句话不难理解,而对于同一主机上的各进程通信,可通过IPC,如Message Queue、Semaphore 等7
对于不同主机的通信,使用IP:Port
的形式来标识主机与进程,即Socket(套接字),Server端只需监听在某Socket上,Client发送到该Socket的数据即可被响应(Linux网络与进程管理一文中已有介绍,此处不再赘述)
SSL(Secure Sockets Layer,安全套接字层)是由Netscape(网景)于1994年在其浏览器Netscape Navigator上应用,其做法是在应用层和主机到主机层(传输层)之间加了半个层, 当应用层协议要将数据传输到下层时, 调用该层, 实现加密,如
http —> https
ldap —> ldaps
ftp —> ftps
smtp —> smtps
pop3 —> pop3s
imap —> imaps
SSL包含记录协议层(Record Protocol Layer)和SSL握手协议层(SSL HandShake Protocol Layer)(亦称为传输层),记录层协议确定传输层数据的封装格式。SSL协议使用X.509认证,而后利用非对称加密来对通信方做身份认证,之后交换对称密钥作为会话密钥(Session key)。该会话密钥是用来将通信两方交换的数据做加密,保证两个应用间通信的保密性和可靠性,使客户端与服务器应用之间的通信不被攻击者窃听
需要说明的是,SSL只是一个库,故只需提供SSL相关的库文件,就可以实现SSL的功能
目前,在SSL-v3中因发现安全漏洞,先已被弃用。而TLS(Transport Layer Security,传输层安全)是SSL的标准化版本,其第一版由IETF(Internet Engineering Task Force)于1999年制定,TLS-v1.0与SSL-v3差异很小,且由于SSL现已很少使用,已由TLS替代,而二者实际上是同一种协议,故SSL与TLS一般不做严格区分
1、最底层:基础算法原语的实现,如aes,rsa,md5等
2、向上一层:各种算法的实现
3、再向上一层:组合算法实现的半成品
4、用各种组件拼装而成的各种成品密码学协议软件
一个使用SSL的通信过程需要建立SSL会话,其建立过程是通过SSL Handshake Protocol来实现的,其大致过程分为四个阶段:
此处以HTTPS协议为例,简要说明SSL/TLS会话的建立过程:
下图为笔者访问 jd.com 时的数据包截图,其使用https协议,可以看到在TCP会话建立后,SSL会话建立的过程8
Open SSL是SSL/TLS协议的开源实现,其主要库是以C语言所写成,实现了基本的加密功能。OpenSSL可以运行在OpenVMS、 Microsoft Windows以及绝大多数类Unix操作系统上(包括Solaris,Linux,Mac OS X与各种版本的开放源代码BSD操作系统)
libcrypto
:通用加密库,提供了各种加密函数libssl
:TSL/SSL协议的实现
openssl
:多用途命令行工具
openssl子命令可分为三类
标准命令
消息摘要命令
加密命令
speed
version
s_client
passwd
whatis
命令查看: 该命令的帮助使用
man sslpasswd
openssl passwd -1 -salt SALT
rsa
rsautl
rand
openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num
openssl passwd -1 -salt `openssl rand -base64 8`
man sslrand
查看帮助
genrsa
Generation of RSA Private Key. Superceded by genpkey
openssl genrsa LENGTH
LENGTH应为2^n,默认为512
可使用输出重定向保存私钥,如
# (umask 077; openssl genrsa -out /root/myprivate 2048)
为保证安全,在子shell中将umask改为077,仅自己可读写
提取公钥
openssl rsa -in /PATH/TO/PRIVATE_KEY_FILE -pubout
/dev/random
:仅从熵池中返回随机数,随机数用尽则阻塞/dev/urandom
:从熵池中返回随机数,随机数用尽则使用软件生成为随机数,不安全req
ca
dgst
即为digest,DGST(1)对dgst
命令的说明为:The digest functions output the message digest of a supplied file or files in hexadecimal form. They can also be used for digital signing and verification. 即计算数据特征码
# openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-out filename] /path/to/somefile
例: openssl dgst -sha1 inittab
其他计算命令:
md5sum
sha1sum
sha224sum
...
enc
即encrypted,symmetric cipher routines,以下为其用法
openssl enc -ciphername [-in filename] [-out filename] [-e] [-d]
-ciphername: 加密方式
-e: 加密, 不指定参数的话, 默认是加密
-d: 解密
-a: base64 process the data
-in:指定加密的文件
-out:指定加密后的文件
openssl enc -des3 -salt -a -in inittab -out inittab.des3
openssl enc -des3 -d -salt -a -in inittab.des3 -out inittab
可使用man enc
获取相关帮助
详见 https://en.wikipedia.org/wiki/Elliptic-curve_Diffie%E2%80%93Hellman ↩︎
图片引用自 https://www.docusign.com/sites/default/files/ds_subpage_diagram2.svg ↩︎
详见 https://en.wikipedia.org/wiki/Man-in-the-middle_attack ↩︎ ↩︎
页面地址:https://en.wikipedia.org/wiki/Public_key_infrastructure ↩︎
不过目前的身份证(二代)还不能挂失? ↩︎
https://tools.ietf.org/html/rfc5280 ↩︎
详见进程管理-IPC ↩︎
详见 https://en.wikipedia.org/wiki/Transport_Layer_Security ↩︎