一、加密方式

对称加密:

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密

需要对加密和解密使用相同密钥加密算法。由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密

所谓对称,就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥是控制加密及解密过程的指令。算法是一组规则,规定如何进行加密和解密。因此安全性不仅取决于加密算法本身,密钥管理的安全性更是重要。因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题。常用的对称加密有:DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES算法等

对称加密固然能够保证数据的机密性,但无法保证数据的完整性和可用性。如下图所示:


221319923.png

非对称加密:

与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法

特点:

私钥加密的数据-->与之配对的公钥解密 实现身份验证

公钥加密的数据-->与之配对的私钥解密 实现数据的机密性

加密的数据是对称加密的三个数量级,所以非对称加密算法很少对数据进行加密,大部分用于密码加密。

功能:

身份验证

机密性

密钥交换

非对称加密本身并不难理解,结合图对非对称加密的流程做简要的分析。

164426237.png

如图所示,对数据进行加密之前要准备好两个密钥,一个公钥,一个私钥;其中公钥是公开的,任何人都可以获得,私钥只有解密方拥有。会话双方分别为老李和小王,老李现在想给小王传送数据,为了避免被监听,老李需要对数据进行加密。由于数据的接受方是小李,所以老王选择使用小李的公钥进行加密,小李的公钥任何人都可以知道,不需要秘密传送。小李在接收了老王传送的数据之后,使用只有他自己知道的私钥进行解密。从整个过程看,不涉及密钥的传输,所以从根本上解决了对称加密的密钥传输安全问题。

单向加密:

它的特点:不管加密的数据多长都会定长输出;不可逆转即无法将得到的数据在逆着解密;雪崩效应即数据微小的变化就会导致结果的巨大变化

常用在此机制上的算法有:MD5、 SHA1 、CRC-32


实现身份验证和数据完整性但无法保证数据安全的过程:


A先用单向加密数据将得到的数据再用自己的私钥加密附在数据之后发给B;B收到数据后若能用A的公钥解密出加过密的特征码则说明这就是A发来的数据,若用单向加密数据能得到和A发来的一模一样的特征码说明此数据没被别人篡改过这样就保证了数据的完整性

实现身份验证,数据完整性和数据加密的过程:


A用单向加密要发给B的数据得到特征码,再用自己的私钥加密此特征码,将加过密的特征码附加在数据之后A会用自己生成的对称密钥加密这两段数据再用A的公钥加密生成的密钥再次附件在加过密的两段数据之后发给B;B收到数据后用自己的私钥解密出密码然后用此密码解密出数据,若B能用A的公钥解出附加在数据之后的特征码就说明这就是A发来的数据,若B用单向加密得到的数据特征码和A发来的一模一样则说明此数据未被篡改过如此一来身份验证,数据完整性和数据加密便都可实现了但此过程也会遇到无法保证得到的公钥就是要通信的一方的公钥。


理想完整的安全发送流程:

加密:

1、发送方使用选定的单向加密算法计算原始数据的特征码;

2、发送方使用自己的私钥加密特征码,附加于原始数据后面;

3、发送方生成一次性对称密钥,并使用此密钥加密数据(原始数据+加密后的特征码)

4、发送方使用接收方的公钥加密一次性对称密钥;附加于加密数据后面

解密:

1、接收方使用自己的私钥解密加密的一次性对称密钥;

2、使用对称密钥解密数据,得到加密的特征码和原始数据;

3、使用发送方公钥解密加密的特征码;

4、使用与发送方相同的单向加密算法重新计算数据的特征码,并与解密出的特征作比较;

图解:

182321741.jpg

二、数字证书(公钥证书):

数字证书:x.509v3

版本号(version)

序列号():证书本身在CA中惟一标识;

签名算法标志

发行者名称

有效期:

证书主体名称:(组织(主机),个人)

证书主体公钥信息:

发行商惟一标志

证书主体的惟一标志

扩展:

签名:


PKI: Public Key Infrastructure

端实体(申请者)

注册机构(RC)

签证机构(CA)-->签证机构(CA)

证书撤消列表(CRL)发布机构

证书存取库

服务器证书(SSL证书)

服务器证书被安装于服务器设备上,用来证明服务器的身份和进行通信加密。服务器证书可以用来防止欺诈钓鱼站点。

数字证书颁发过程图示

数字证书颁发过程图示

在服务器上安装服务器证书后,客户端浏览器可以与服务器证书建立SSL连接,在SSL连接上传输的任何数据都会被加密。同时,浏览器会自动验证服务器证书是否有效,验证所访问的站点是否是假冒站点,服务器证书保护的站点多被用来进行密码登录、订单处理、网上银行交易等。全球知名的服务器证书品牌有Globlesign,Verisign,Thawte,Geotrust等。

SSL证书主要用于服务器(应用)的数据传输链路加密和身份认证,绑定网站域名,不同的产品对于不同价值的数据和要求不同的身份认证。

最新的高端SSL证书产品是扩展验证(EV)SSL证书。在IE7.0、FireFox3.0、Opera 9.5等新一代高安全浏览器下,使用扩展验证VeriSign(EV)SSL证书的网站的浏览器地址栏会自动呈现绿色,从而清晰地告诉用户正在访问的网站是经过严格认证的。

HTTPS图解:

111632346.png

1. 客户端发起HTTPS请求

这个没什么好说的,就是用户在浏览器里输入一个https网址,然后连接到server的443端口。


2. 服务端的配置

采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl就是个不错的选择,有1年的免费服务)。这套证书其实就是一对公钥和私钥。如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。


3. 传送证书

这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。


4. 客户端解析证书

这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值。然后用证书对该随机值进行加密。就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。


5. 传送加密信息

  这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。


6. 服务段解密信息

 服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密。所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。


7. 传输加密后的信息

这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。


8. 客户端解密信息

  客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容。整个过程第三方即使监听到了数据,也束手无策。


三、OpenSSL详解:

组成部分:

  • libcrpto:通用加密库

  • libssl:TLS/SSl的实现,基于会话的,实现了身份认证、、数据机密性和会话完整性的TLS/SSL库

  • openssl:多用途命令行工具,可以实现私有证书颁发机构

加密和解密一个文件,实例:

openssl enc -des3 -in functions -e -out functions.des3
#通过enc指定des3加密方式对functions文件进行加密,保存在funtions.des3中
openssl enc -des3  -in functions.des3 -d -out function.txt
#通过enc指定以desc加密方式的functions.des3文件进行解密,保存在function.txt中


通过dges参数对文件进行单向加密,实例:

openssl dgst -sha1 function:计算数据的特征码

其他方式加密,实例:

openssl passwd –l 密码 :输入密码即可显示加密后的密码
openssl passwd -1 -salt 数据:加密的时候指定salt
openssl rand -base64 8:生成随机数

获取公钥:

#openssl rsa -in /path/to/keyfile -pubout

申请证书流程:

1、生成一个私钥:

#(umask 077;openssl genrsa -out /root/mykey.pri 2048)

2、制作一个证书签署请求:

openssl req -new -key /root/mykey.pri -out /root/myreq.csr

#/root/mykey.pri(私钥文件),-out保存在/root/myreq.csr

3、由CA负责签署证书

1、 配置/etc/pki/tls/openssl.cnf文件

####################################################################
[ CA_default ]
dir = /etc/pki/CA # Where everything is kept (CA中心的目录)
certs = $dir/certs # Where the issued certs are kept (证书保存目录)
crl_dir = $dir/crl # Where the issued crl are kept (被吊销证书的目录)
database = $dir/index.txt # database index file. (证书索引文件)
#unique_subject = no # Set to 'no' to allow creation of
# several ctificates with same subject.
new_certs_dir = $dir/newcerts # default place for new certs.(经过CA中心签名的证书备份目录)
certificate = $dir/my-ca.crt # The CA certificate (CA的公钥文件名)
serial = $dir/serial # The current serial number (CA中心的颁发证书序列号)
crlnumber = $dir/crlnumber # the current crl number (已吊销证书序列号)
# must be commented out to leave a V1 CRL
crl = $dir/my-ca.crl # The current CRL (证书吊销列表)
private_key = $dir/private/my-ca.key # The private key (CA私钥文件)
RANDFILE = $dir/private/.rand # private random number file
x509_extensions = usr_cert # The extentions to add to the cert
default_days = 365 # how long to certify for (证书有效期)
default_crl_days= 30 # how long before next CRL
default_md = default # use public key default MD
preserve = no # keep passed DN ordering
[ policy_match ] #此段为证书相关信息选项,其中match指定的项,要求被签名证书一定要与CA的对应项一致。
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
#
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = CN (国家代码需要自己修改)
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Hebei (州或省名需要自己修改)
localityName = Locality Name (eg, city)
localityName_default = Beijing (地点名称需要自己修改)
0.organizationName = Organization Name (eg, company)
0.organizationName_default = Tianli Company (组织或公司名需要自己修改)

2、生成自签证书:

[root@TP-CW-WS-DL-02~]# cd /etc/pki/CA
[root@TP-CW-WS-DL-02 CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
................................+++
.....................................+++
e is 65537 (0x10001)
#openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
#自建CA必须与之前的保持一致。
touch index.txt
echo 01>serial
3、签署证书:
#openssl ca -in /path/to/myreq.csr -out /path/to/certfile.crt -days 365

签署后的index.txt文件如下

[root@TP-CW-WS-DL-02 CA]# cat index.txt
V       231117165318Z           00      unknown /C=CN/ST=Shanghai/O=bjiaonline/OU=Tech/CN=www.bjiaonline.com/emailAddress=admin@bjiaonline.com