在一次网络通信或者是进程通信中,如果传输数据采用明文的方式,那么很容易被第三方"窃听"到,安全性难以保障。
而所谓加密是让数据从明文变成密文,传输过程中是密文,传送过去之后对方接收到的也是密文。——可以理解为密文就是乱码,看不出内在的任何意义,通常也都是逐位对应的。
在接收方接收到密文之后只有把它还原为原来的样子才可以理解对方说的具体是什么,此过程就叫做解密。
所谓系统的安全要实现的目标应该包括:机密性-confidentiality,完整性-integrity 和可用性-availability;在通信中威胁到上述三者的***行为分别有:
1.威胁机密性的***行为:窃听、嗅探、扫描、通信量分析
2.威胁完整性的***行为:更改、伪装、重放、否认
3.威胁可用性的***行为: 拒绝服务(DoS)
针对各种威胁安全性***行为,我们分别从技术层面和服务层面出发,有不同的解决方案。
技术:数据的加密和解密;服务:安全服务;
今天来初探Linux世界里的加密和解密是怎么一回事;
加密需要两个东西,算法+密钥;
加密的算法分为四类:
对称加密算法-通俗的说就是 用什么密钥加密就用同一个密钥进行解密;
其优势所在就是加密速度较快;但劣势也非常明显:
对称加密无法保证完整性。被截获了,随破解不出来里面的密文是什么,但是,截获者插入一些字符篡改内容,再发送给接收者;接收者在接收到被篡改的密文以后,解密出来,发现内容似乎没有什么意义,此时,怎样确定此密文就是自己信任的对方发送过来的呢?所以完整性是无法得到保证的。
这种算法的主流算法有:DES,AES,3DES等等;
公钥加密算法-采用公钥加密,私钥解密;
公钥加密也叫做非对称加密,加密解密采用同一组的公钥和私钥。
先来解释一下什么是公钥私钥:
私钥(seceret key|private key):是通过特定的工具创建生成;由使用者自己留存。务必保证其私密性;
公钥(public key):从私钥中提取生成,可以公开给所有人使用;
这种方式加密的数据安全等级高,代价就是密钥很长,从512位、768位、1024位、2048位、4096位、8192位不等;由此也对系统的性能提出了更高的要求,例如此种加密技术的RSA的发展似乎遇到了瓶颈。因此,很少用公钥加密算法来加密大批量的数据;
单项加密算法 - 提取数据特征码,只能由明文计算出密文,也就是只可加密不能解密;
因此此种算法的功能就是保证数据的完整性,防止被篡改;
常见的算法:md5、SHA1(安全hash算法)、SHA2、SHA256、SHA512、SHA3(目前最新的)
密钥加密算法-IKE
所谓IKE:
1、IPsec使用IKE来完成对等体之间的认证和密钥的生成以及交换
2、协商和维护安全关联(SA)参数
3、SA是一个集合,包含了加密算法,认证方式等等
4、通过认证,防止伪装***
5、自动产生密钥,并自动更新密钥
6、动态,安全的交换密钥
在实际应用里,通信双方数据加密进行以下步骤:
1.通信双方互相交换证书,并到信任的CA进行证书验证;
2.发送方使用某种对称加密算法对数据进行加密;对加密后的数据使用单向加密,计算其特征值;发送方再用自己的私钥加密此特征值,以证明数据来源的可靠;发送方使用接收方的证书加密对称密钥;
3.接收方在收到数据后,先使用自己的私钥解密对此密钥;然后使用发送方的公钥特征值,再利用相同的单向加密算法;
不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文传播,带来了三大风险。
(1)窃听风险(eavesdropping):第三方可以获知通信内容。
(2)篡改风险(tampering):第三方可以修改通信内容。
(3)冒充风险(pretending):第三方可以冒充他人身份参与通信。
SSL/TLS协议是为了解决这三大风险而设计的,希望达到:
(1)所有信息都是加密传播,第三方无法窃听。
(2)具有校验机制,一旦被篡改,通信双方会立刻发现。
(3)配备×××书,防止身份被冒充。
SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。
它将将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。这样保证了公钥不会被篡改;
数字证书里包含的内容:
拥有者的名称
拥有者所提交的公钥
有效期
证书的版本号
证书的序列号
签发算法ID
签发CA的名称
主体名称
发证者唯一标识
发证者的数字签名
扩展信息
因此,SSL/TLS协议的基本过程是这样的:
(1) 客户端向服务器端索要并验证公钥。
(2) 双方协商生成"对话密钥"。
(3) 双方采用"对话密钥"进行加密通信。
前两步也叫握手阶段 - handshake
SSL/TSL的handshake的四个阶段:
1.客户端向服务器索要证书并验证;
client_hello发送的信息内容:
支持的协议版本,如:TLS V1.2...
客户端生成的随机数,可能在之后充当加密的密钥;
支持的加密算法,如AES,sha...
协商各自支持的压缩算法。非必
2.双方协商生成会话密钥;dh算法交换密钥
Server_hello的内容:
确认使用的加密协议的版本号。
服务器生成一个随机数,稍后用于生成会话密钥
确认加密算法及压缩算法;
3.双方采用生成的会话密钥进行安全加密的通信;
客户端验证服务器证书,在确认无误后,取出其公钥;
验证服务器证书需要验证下述内容:
验证发证机构CA;
验证证书的完整性;
验证证书的持有者信息;
验证证书的有效期
验证证书的吊销列表;
客户端发送信息给服务器:
1.一个随机数,用于服务器上的公钥加密
2.编码格式变更的通知,表示随后的信息都将用双方已经协商好的加密算法和密钥进行加密发送;
客户端握手结束;
4.双方互相通告握手结束的信息;
服务器会收到客户端发送来的此次握手阶段的第三个随机数 Pre-Master_key
计算本次会话所用到的会话密钥,向客户端发送相关信息;
编码变更通知,表示随后的信息都将用双方已经协商好的加密算法和密钥进行加密发送;
服务器端握手结束;
接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。
转载于:https://blog.51cto.com/healerj9/1953642