1.先说一下密码通信的工具:对称加密,非对称加密,单向散列函数,消息认证码,数字签名.
这里使用openssl进行举例:(使用openssl -help
参看介绍)
主要有三部分:
a)标准命令:
b)消息摘要命令:
c)密码命令:
可以参考教程:http://www.cnblogs.com/f-ck-need-u/p/7048359.html#blogopenssl
1)对称加密:使用相同的密钥进行加密解密 openssl enc -des -e -a -in a.txt -out b.txt
//加密a.txt,将加密后的输出到b.txt openssl enc -des -d -a -in b.txt -out b2.txt
//解密b.txt,将解密后的输出到b2.txt openssl enc -des -e -a -pass pass:123456 -in a.txt
//加密a.txt,显示输入密码,输出到stdout
2)非对称加密:使用公钥加密,私钥解密 openssl genrsa -out key.private 1024
//生成私钥到key.private文件中
1024指定密钥长度,默认1024 openssl rsa -in key.private -pubout -out key.public
//从key.private中提取公钥,输出到key.public openssl rsautl -encrypt -in a.txt -out a_encrypt.txt -inkey a_key.pubilc -pubin
//使用公钥加密文件
openssl rsautl -decrypt -in a_encrypt.txt -out a_decrypt.txt -inkey a_key.private
//使用私钥解密文件
3)单向散列函数:获取消息的指纹,判断消息是否被篡改 openssl dgst -md5 -out a_md5.txt a.txt
//使用MD5计算a.txt消息摘要,输入到a_md5.txt中
4)消息认证码:与生成消息摘要类似,只是消息认证码要使用密码(发送与接受方共享一个密钥)计算散列值 openssl dgst -hmac 123456 -out a_mac.txt a.txt
//生成a.txt的消息认证码
5)数字签名:使用私钥对消息进行加密,使用公钥对消息进行解密,可以防止否认,消息认证码无法防止否认 openssl genrsa -out a_key.private
//生成私钥
openssl dgst -md5 -out a.sign -sign a_key.private a.txt
//使用私钥对消息进行签字
openssl rsa -in a_key.private -pubout -out a_key.pubilc
//从私钥中获取公钥
openssl dgst -md5 -verify a_key.pubilc -signature a.sign a.txt
//用公钥验证数字签名
2.SSL/TLS(SSL[Secure Sockets Layer 安全套接层],TLS[Transport Layer Security传输层安全协议]):SSL与TLS基本可以等价,TLS相当于SSL的升级版,这里将SSL与TLS当作一个整体,SSL/TLS相当于一个密码通信的框架.
TLS协议包括TLS记录协议(主要负责使用对称密码对消息进行加密通信)和TLS握手协议(负责客户端与服务端之间协商决定密码算法和共享密钥),主要结构如图:
握手协议的过程:
1)ClientHello(client->server):客户端向服务端发送协议版本,可用密码套件,客户端随机数等
2)ServerHello(client<-server):服务端向客户端返回协议版本,使用的密码套件,服务端随机数等
3)Certificate(client<-server):服务端向客户端发送证书清单(非匿名通信时)
4)ServerKeyExchange(client<-server):如果证书信息不够,发送必要信息(例如:Diffie-Hellman的公开值)
5)CertificateRequest(client<-server):服务器向客户端请求证书验证,如果是单向认证就没有这一步
6)ServerHelloDone(client<-server):问候结束
7)Certificate(client->server):客户端向服务端发送证书,单向认证没有该步骤
8)ClientKeyExchange(client->server):加密发送预备主密码(RSA:使用公钥加密发送;DH:发送公开值,两端分别计算)
9)CertificateVerify(client->server):发送数字签名证明客户端有私钥
10)ChangeCipherSpec(client->server):密码变更(密码变更协议)
11)Finished(client->server):结束
12)ChangeCipherSpec(client<-server):密码变更
13)Finished(client<-server):结束