Windows PC电脑;
国密SSL VPN客户端(浏览器);
Wireshark客户端(需支持国密协议版本, github地址 ),用于查看握手数据。
打开wireshark客户端,监听对应的网卡。可以在联网时通过wireshark查看哪个网卡有网络波动,选择对应的网卡。
Wireshark设置按照IP过滤,设置SSL VPN连接的国密服务器IP过滤。IP地址即为安全接入的网关或安全服务的地址。
此时可以看到通过GMTLS协议的握手数据。根据请求我们具体分析。
客户端向服务端发送Client Hello消息,传送客户端支持的最高 SSL 协议的版本号、随机数、加密算法列表,以及其他所需信息。Client Hello消息的内容如下图所示:
服务端收到客户端建立SSL连接的请求后,通过发送Server Hello消息向客户端传送SSL 协议的版本号、随机数、会话ID、加密算法的种类以及其他相关信息。消息内容如下:
同时服务端向客户端发送包含其证书的Certificate消息。证书中所携带服务端的公钥。如下图所示:
发送Certificate Request消息,要求服务端上报证书,如下图所示:
客户端发送Client Key Exchange和Change Cipher Spec消息,Client Key Exchange包含使用服务器公钥加密过的随机数Pre_Master_Secret,该参数用于后续生成主密钥。 (此处客户端使用前面提到的两个随机数,再生成第三个随机数,然后通过服务端证书中的公钥对第三个随机数加密,生成该 Pre_Master_Secret ) **;Change Cipher Spec消息告诉服务器,接下来的消息将采用新协商的加密套件和密钥进行通信,并通知客户端到服务器的握手过程结束。如下图所示:
服务端同样发送Change Cipher Spe消息通知服务端到客户端的握手过程结束,并发送一个加密的握手数据Encrypted Handshake Message 消息,客户端收到消息解密后进行验证,验证通过则说明握手过程中的数据没有被篡改过,也说明服务端是之前交换证书的持有者。现在双方就可以开始加密通信。如下图所示:
##
密码技术在网络传输安全上的应用
随着互联网电子商务和网络支付的飞速发展,互联网安全已经是当前最重要的因素之一。作为一名合格的软件开发工程师,有必要了解整个互联网是如何来保证数据的安全传输的,本篇文章对网络传输安全体系以及涉及到的算法知识做了一个简要的介绍,希望大家能够有一个初步的了解。
###密码技术定义
简单的理解,密码技术就是编制密码和破译密码的一门技术,也即是我们常说的加密和解密。常见的结构如图:
其中涉及到的专业术语:
1.秘钥:分为加密秘钥和解密秘钥,两者相同的加密算法称为对称加密,不同的称为非对称加密;
2.明文:未加密过的原文信息,不可以被泄露;
3.密文:经过加密处理后的信息,无法从中获取有效的明文信息;
4.加密:明文转成密文的过程,密文的长度根据不同的加密算法也会有不同的增量;
5.解密:密文转成明文的过程;
6.加密/解密算法:密码系统使用的加密方法和解密方法;
7.攻击:通过截获数据流、钓鱼、木马、穷举等方式最终获取秘钥和明文的手段。
###密码技术和我们的工作生活息息相关
在我们的日常生活和工作中,密码技术的应用随处可见,尤其是在互联网系统上。下面列举几张比较有代表性的图片,所涉及到的知识点后面都会一一讲解到。
1.12306旧版网站每次访问时,浏览器一般会提示一个警告,是什么原因导致的? 这样有什么风险呢?
2.360浏览器浏览HTTPS网站时,点开地址栏的小锁图标会显示加密的详细信息,比如百度的话会显示```AES_128_GCM、ECDHE_RSA```,这些是什么意思?
3.在Mac系统的钥匙串里有很多的系统根证书,展开后有非常多的信息,这些是做什么用的?
4.去银行开通网上支付都会附赠一个U盾,那U盾有什么用呢?
##如何确保网络数据的传输安全
接下来我们从实际场景出发,以最常见的客户端Client和服务端Server传输文件为例来一步步了解整个安全体系。
####1. 保密性
首先客户端要把文件送到服务端,不能以明文形式发送,否则被黑客截获了数据流很容易就获取到了整个文件。也就是文件必须要确保保密性,这就需要用到对称加密算法。
** 对称加密: **加密和解密所使用的秘钥相同称为对称加密。其特点是速度快、效率高,适用于对较大量的数据进行加密。常见的对称加密算法有DES、3DES、AES、TDEA、RC5等,让我们了解下最常见的3DES和AES算法:
** DES(Data Encryption Standard): **1972年由美国IBM研制,数学原理是将明文以8字节分组(不足8位可以有不同模式的填充补位),通过数学置换和逆置换得到加密结果,密文和明文长度基本相同。秘钥长度为8个字节,后有了更安全的一个变形,使用3条秘钥进行三次加密,也就是3DES加密。
**3DES:**可以理解为对明文进行了三次DES加密,增强了安全程度。
** AES(Advanced Encryption Standard): **2001年由美国发布,2002年成为有效标准,2006年成为最流行的对称加密算法之一。由于安全程度更高,正在逐步替代3DES算法。其明文分组长度为16字节,秘钥长度可以为16、24、32(128、192、256位)字节,根据秘钥长度,算法被称为AES-128、AES-192和AES-256。
对称加密算法的入参基本类似,都是明文、秘钥和模式三个参数。可以通过网站进行模拟测试:[http://tool.chacuo.net/crypt3des]()。其中的模式我们主要了解下ECB和CBC两种简单模式,其它有兴趣可自行查阅。
** ECB模式(Electronic Codebook Book): **这种模式是将明文分成若干小段,然后对每一段进行单独的加密,每一段之间不受影响,可以单独的对某几段密文进行解密。
** CBC模式(Cipher Block Chaining): **这种模式是将明文分成若干小段,然后每一段都会和初始向量(上图的iv偏移量)或者上一段的密文进行异或运算后再进行加密,不可以单独解密某一断密文。
** 填充补位: **常用为PKCS5Padding,规则为缺几位就在后面补几位的所缺位数。,比如明文数据为```/x01/x01/x01/x01/x01/x01```6个字节,缺2位补```/x02```,补完位```/x01/x01/x01/x01/x01/x01/x02/x02```。解密后也会按照这个规则进行逆处理。需要注意的是:明文为8位时也需要在后面补充8个```/x08```。
####2. 真实性
客户端有了对称秘钥,就需要考虑如何将秘钥送到服务端,问题跟上面一样:不能以明文形式直接传输,否则还是会被黑客截获到。这里就需要用到非对称加密算法。
** 非对称加密: **加密和解密秘钥不同,分别称为公开秘钥(publicKey)和私有秘钥(privateKey)。两者成对出现,公钥加密只能用私钥解密,而私钥加密也只能用公钥加密。两者不同的是:公钥是公开的,可以随意提供给任何人,而私钥必须保密。特点是保密性好,但是加密速度慢。常见的非对称加密算法有RSA、ECC等;我们了解下常见的RSA算法:
** RSA(Ron Rivest、Adi Shamir、Leonard Adleman): **1977年由麻省理工学院三人提出,RSA就是他们三个人的姓氏开头字母拼在一起组成的。数学原理是基于大数分解。类似于```100=20x5```,如果只知道100的话,需要多次计算才可以试出20和5两个因子。如果100改为极大的一个数,就非常难去试出真正的结果了。下面是随机生成的一对公私钥:
这是使用公钥加密后结果:
RSA的这种特性就可以保证私钥持有者的真实性,客户端使用公钥加密文件后,黑客就算截获到数据因为没有私钥也是无法解密的。
** Tips: **
+** 不使用对称加密,直接用RSA公私钥进行加密和解密可以吗? **
答案:不可以,第一是因为RSA加密速度比对称加密要慢几十倍甚至几百倍以上,第二是因为RSA加密后的数据量会变大很多。
+** 由服务端生成对称秘钥,然后用私钥加密,客户端用公钥解密这样来保证对称秘钥安全可行吗? **
答案:不可行,因为公钥是公开的,任何一个人都可以拿到公钥解密获取对称秘钥。
####3. 完整性
当客户端向服务端发送对称秘钥加密后的文件时,如果被黑客截获,虽然无法解密得到对称秘钥。但是黑客可以用服务端公钥加密一个假的对称秘钥,并用假的对称秘钥加密一份假文件发给服务端,这样服务端会仍然认为是真的客户端发送来的,而并不知道阅读的文件都已经是掉包的了。
这个问题就需要用到散列算法,也可以译为Hash。常见的比如MD4、MD5、SHA-1、SHA-2等。
** 散列算法(哈希算法): **简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。而且该过程是不可逆的,无法通过摘要获得原文。
** SHA-1(Secure Hash Algorithm 1): **由美国提出,可以生成一个20字节长度的消息摘要。05年被发现了针对SHA-1的有效攻击方法,已经不再安全。2010年以后建议使用SHA-2和SHA-3替代SHA-1。
** SHA-2(Secure Hash Algorithm 2): **其下又分为六个不同算法标准:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA512/256。其后面数字为摘要结果的长度,越长的话碰撞几率越小。SHA-224的使用如下图:
客户端通过上面的散列算法可以获取文件的摘要消息,然后用客户端私钥加密后连同加密的文件发给服务端。黑客截获到数据后,他没有服务端私钥无法获取到对称秘钥,也没有客户端私钥无法伪造摘要消息。如果再像上面一样去掉包文件,服务端收到解密得到摘要消息一对比就可以知道文件已经被掉包篡改过了。
这种用私钥对摘要消息进行加密的过程称之为数字签名,它就解决了文件是否被篡改问题,也同时可以确定发送者身份。通常这么定义:
** 加密: **用公钥加密数据时称为加密。
** 签名: **用私钥加密数据时称为签名。
####4. 信任性
我们通过对称加密算法加密文件,通过非对称加密传输对称秘钥,再通过散列算法保证文件没被篡改过和发送者身份。这样就安全了吗?
答案是否定的,因为公钥是要通过网络送到对方的。在这期间如果出现问题会导致客户端收到的公钥并不一定是服务端的真实公钥。常见的** 中间人攻击 **就是例子:
** 中间人攻击MITM(Man-in-the-MiddleAttack): **攻击者伪装成代理服务器,在服务端发送公钥证书时,篡改成攻击者的。然后收到客户端数据后使用攻击者私钥解密,再篡改后使用攻击者私钥签名并且将攻击者的公钥证书发送给服务器。这样攻击者就可以同时欺骗双方获取到明文。
这个风险就需要通过CA机构对公钥证书进行数字签名绑定公钥和公钥所属人,也就是PKI体系。
** PKI(Privilege Management Infrastructure): **支持公钥管理并能支持认证、加密、完整性和可追究性的基础设施。可以说整个互联网数据传输都是通过PKI体系进行安全保证的。
** CA(Certificate Authority): **CA机构就是负责颁发证书的,是一个比较公认的权威的证书发布机构。CA有一个管理标准:WebTrust。只有通过WebTrust国际安全审计认证,根证书才能预装到主流的浏览器而成为一个全球可信的认证机构。比如美国的GlobalSign、VeriSign、DigiCert,加拿大的Entrust。我国的CA金融方面由中国人民银行管理CFCA,非金融CA方面最初由中国电信负责建设。
CA证书申请流程:公司提交相应材料后,CA机构会提供给公司一张证书和其私钥。会把Issuer,Public key,Subject,Valid from,Valid to等信息以明文的形式写到证书里面,然后用一个指纹算法计算出这些数字证书内容的一个指纹,并把指纹和指纹算法用自己的私钥进行加密。由于浏览器基本都内置了CA机构的根证书,所以可以正确的验证公司证书指纹(验签),就不会有安全警告了。
但是:所有的公司其实都可以发布证书,甚至我们个人都可以随意的去发布证书。但是由于浏览器没有内置我们的根证书,当客户端浏览器收到我们个人发布的证书后,找不到根证书进行验签,浏览器就会直接警告提示,这就是之前12306打开会有警告的原因。这种个人发布的证书,其实可以通过系统设置为受信任的证书去消除这个警告。但是由于这种证书机构的权威性和安全性难以信任,大家最好不要这么做。
我们看一下百度HTTPS的证书信息:
其中比较重要的信息:
签发机构:GlobalSign Root CA;
有效日期:2018-04-03到2019-05-26之间可用;
公钥信息:RSA加密,2048位;
数字签名:带 RSA 加密的 SHA-256 ( 1.2.840.113549.1.1.11 )
绑定域名:再进行HTTPS验证时,如果当前域名和证书绑定域名不一致,也会出现警告;
URI:在线管理地址。如果当前私钥出现了风险,CA机构可以在线吊销该证书。
####5. 不可抵赖性
看起来整个过程都很安全了,但是仍存在一种风险:服务端签名后拒不承认,归咎于故障不履行合同怎么办。
解决方法是采用数字时间戳服务:DTS。
** DTS(digital time-stamp): **作用就是对于成功的电子商务应用,要求参与交易各方不能否认其行为。一般来说,数字时间戳产生的过程为:用户首先将需要加时间戳的文件用Hash算法运算形成摘要,然后将该摘要发送到DTS。DTS在加入了收到文件摘要的日期和事件信息后再对该文件进行数字签名,然后送达用户。
####6. 再次认证
我们有了数字证书保证了身份的真实性,又有了DTS提供的不可抵赖性。但是还是不能百分百确定使用私钥的就是合法持有者。有可能出现被别人盗用私钥进行交易的风险。
解决这个就需要用到强口令、认证令牌OTP、智能卡、U盾或生物特征等技术对使用私钥的当前用户进行认证,已确定其合法性。我们简单了解下很常见的U盾。
** USB Key(U盾): **刚出现时外形比较像U盘,安全性能像一面盾牌,取名U盾。其内部有一个只可写不可读的区域存储着用户的私钥(也有公钥证书),银行同样也拥有一份。当进行交易时,所有涉及到私钥的运算都在U盾内部进行,私钥不会泄露。当交易确认时,交易的详细数据会显示到U盾屏幕上,确认无误后通过物理按键确认就可以成功交易了。就算出现问题黑客也是无法控制U盾的物理按键的,用户可以及时取消避免损失。有的U盾里面还有多份证书,来支持国密算法。
** 国密算法: **国家密码局针对各种算法制定了一些列国产密码算法。具体包括:SM1对称加密算法、SM2公钥算法、SM3摘要算法、SM4对称加密算法、ZUC祖冲之算法等。这样可以对国产固件安全和数据安全进行进一步的安全控制。
## HTTPS分析
有了上面的知识,我们可以尝试去分析下HTTPS的整个过程,用Wireshark截取一次HTTPS报文:
Client Hello: 客户端发送Hello到服务端443端口,里面包含了随机数、客户端支持的加密算法、客户端的TLS版本号等;
Server Hello: 服务端回应Hello到客户端,里面包含了服务端选择的加密套件、随机数等;
Certificate: 服务端向客户端发送证书
服务端计算对称秘钥:通过ECDH算法得到对称秘钥
客户端计算对称秘钥:通过ECDH算法得到对称秘钥
开始用对称秘钥进行加密传输数据
其中我们又遇到了新的算法:DH算法
** DH(Diffie-Hellman): **1976年由Whitefield与Martin Hellman提出的一个奇妙的秘钥交换协议。这个机制的巧妙在于可以通过安全的方式使双方获得一个相同的秘钥。数学原理是基于原根的性质,如图:
*** DH算法的用处不是为了加密或解密消息,而是用于通信双方安全的交换一个相同的秘钥。 ***
** ECDH: **基于ECC(椭圆曲线密码体制)的DH秘钥交换算法,数学原理是基于椭圆曲线上的离散对数问题。
** ECDHE: **字面少了一个E,E代表了临时。在握手流程中,作为服务器端,ECDH使用证书公钥代替Pb,使用自身私钥代替Xb。这个算法时服务器不发送server key exchange报文,因为发送certificate报文时,证书本身就包含了Pb信息。
##总结
| 算法名称 | 特点 | 用处 | 常用算法名 |
| --- | :--- | :---: | ---: |
| 对称加密 | 速度快,效率高| 用于直接加密文件 | 3DES、AES、RC4 |
| 非对称加密 | 速度相对慢,但是确保安全 | 构建CA体系 | RSA、ECC |
| 散列算法 | 算出的摘要长度固定,不可逆 | 防止文件篡改 | SHA-1、SHA-2 |
| DH算法 | 安全的推导出对称秘钥 | 交换对称秘钥 | ECDH |
----
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)