天天看点

谈谈关于数据加密,解密及签名的一些问题

实现网络安全性的机制:

随机数生成器

PS:任何的加密或者解密机制都要结合随机数来实现。linux上用于生成随机数的设备/dev/random,

/dev/urandom 字符设备,软设备,在系统初始化过程当中由/etc/rc.d/rc.sysinit脚本实现。

/dev/random和/dev/urandom均从熵池(entropy  pool)获得随机数。不同之处在于,random的机制是一旦熵池为空,/dev/random 将终止提供随机数。urandom的机制是一旦熵池为空,将转而通过伪随机数生成器(伪随机数通过软件来实现的。可靠程度不高 ,不建议使用 )来获得随机数。

熵池(entropy pool)中的数据主要来自用户事件,例如击键动作(两次击键动作的时间差),鼠标移动动作,块设备的中断等等。

openssl  rand 也可以生成一串随机数。

<a href="http://lyp0909.blog.51cto.com/attachment/201103/4/508999_1299206221W3mB.png"></a>

单向加密:提取数据特征码的一种机制。在实现数据完整性方面应用较多,能够保证数据在传输过程中没有被篡改过。

作用:实现数据完整性 加密密码

特点:定长输出  雪崩效应(如果数据发生改变,特征码也会发生巨大改变) 数据不能逆转

常用单向加密算法:md2,md5(信息摘要,麻省理工学院  定长输出128位),mdc2,md160,sha,sha1(美国国家安全署  定长输出160位)

linux常用加密工具:sha1sum [--check]  file

                          md5sum [---check]  file

                          openssl,gpg                   rpm -V  校验数包                   

应用场合:数字签名,密钥分发

数字签名:发送方用自己的私钥加密数据,加密的结果发送给接收方,接收方用发送方的公钥来解密。

<a href="http://lyp0909.blog.51cto.com/attachment/201103/4/508999_1299206223eVWL.png"></a>

数据签名的实现

除A外没有别人持有A的私钥SKA,所以除A外没有人能产生密文DskA(X)。这样B就相信报文X是A签名发送的。这就是报文鉴别的功能。同理,其他人如果篡改过报文,但并无法得到A的私钥SKa

对X进行加密。B对篡改过的报文进行解密后,将会得到不可读的明文,就知道收到的报文被篡改过。这样就保证报文的完整性的功能。若A要抵赖曾发送报文给B,B可把X及Dska(X)出示给进行公正的第三者。第三者很容易用PKa去证实A确实发送X给B。这就是不可否认的功能。

公钥加密算法速度很慢,比对称加密慢了三个数量级,所以一般很少用来加密。那么签名是怎么实现的呢?

我们可以这样做,先用单向加密取出数据的特征码,再用自己的私钥去加密这段特征码,接收方所收到的数据包括明文数据和加密的特征码本身。

<a href="http://lyp0909.blog.51cto.com/attachment/201103/4/508999_1299206224afa1.png"></a>

用报文摘要鉴别报文

这样就可以实现数据的完整性和用户身份合法性的验证,但无法保证数据本身的机密性。

实际应用中,一般不使用公钥加密,而使用对称加密。

<a href="http://lyp0909.blog.51cto.com/attachment/201103/4/508999_1299206226qePu.png"></a>

                               具有保密性的数据签名                         

实现过程:1. A 先使用单向加密算法提取数据的特征码(保证数据的完整性),然后利用自己的私钥对数据(主要是提取出来的特征码)进行签名,此时数据依然是明文。

          2.A 利用对称密钥的机制一次性的生成对称密钥,A用生成的对称密钥利用对称加密算法对整段数据进行加密。然后再利用B的公钥对密码(对称密钥)进行加密后将整个数据打包发给B。

对称密钥

特征码

数   据

        3.B利用自己的私钥对密码(对称密钥)进行解密,然后再利用对称密钥对整个数据进行解密。

        4.B利用A的公钥来解密签名(即:核实签名),如果成功,则说明发送方就是A,然后A在对这段数据做哈希运算,如果运算的结果与A计算出来的结果一样,则说明数据没有被篡改。

问题:A的公钥如何传送给B呢?

CA的重要性此时开始体现了.....

PKI (Public Key Infrastructures)公钥基础架构

核心:CA证书颁发机构   作用:帮助组织或者个人生成数字证书(Digital Certificates),数字证书是用于验证用户身份并获取用户公钥的凭证(经过第三方认证),是现代通信当中电子商务里边非常依赖的重要工具。

CA要求必须是具有公信力,双方都认可的机构。所有发出去的证书做成一个证书列表(通常通过一个目录服务去实现)公开给其他人,供其他人去验证身份。

CA结合一个目录服务这一系列的架构称之为PKI。

证书吊销名单:在过期之前被吊销的证书名单。

大多数证书已经被做进操作系统中,所以实际应用中我们很少去下载证书。

在证书的尾部一般有CA的签名,用户在拿到证书后会进行单向加密计算,并拿着CA的公钥去解密这个签名,如果解密成功,则CA的身份被验证,再拿着计算结果和加密结果进行比对,以确认证书是否有效。

实现的组件(Implementations):openssl 实现网络上数据通信的加密和解密。

                                              gpg:实现文件加密。

Openssl组成:libcrypto(库,用于通用加密解密的重要组件)

                libssl    (库,支撑实现linux上TLS/SSL()协议的低层级制, 实现基于连接的认证,数据传输的完整性,会话完整性的重要的库文件)

PS:SSL  Security Socket Layer 安全套接字层  由网景公司开发

     TLS  Transport Layer  Security  标准化组织。

在会话层增加了SSL协议,可以用也可以不用。基于证书的实现数据加密解密。

              opennssl

TLS/SSL 握手实现过程:

1 客户端向服务器端发送一个TLS握手连接请求,服务器端发现请求后双方开始协商使用何种机制交换密钥,加密和解密,使用什么机制来验证数据完整性;

2 服务器端发送自己的证书和公钥给客户端;

3 客户端验证服务器端证书的有效身份和证书是否还在有效期内;

4 客户端使用协商好的协议生成一个一次性对称会话密钥;

5 客户端将生成的一次性对称会话密钥使用服务器端发来的公钥进行加密;

6 服务器端使用自己的私钥解密客户端发过来的一次性对称会话密钥;

7 客户端和服务器端使用对称会话密钥进行通信。

PS:使用startx机制能够实现利用同一个端口提供不加密/加密(http/https)的服务。

本文转自 490999122 51CTO博客,原文链接:http://blog.51cto.com/lyp0909/506206,如需转载请自行联系原作者

继续阅读