1.先说一下密码通信的工具:对称加密,非对称加密,单向散列函数,消息认证码,数字签名.
这里使用openssl进行举例:(使用openssl -help参看介绍)
主要有三部分:
a)标准命令:
- ca:CA管理
- ciphers:列出加密套件
- crl:证书吊销列表管理
- dgst:生成消息摘要
- enc:对称加密解密
- genrsa:生成RSA私钥
- rand:生成伪随机数
- rsa:RSA密码处理工具
- req:生成证书请求
- speed:测试速度
- x509:x509证书管理(签署与自签署)
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
- -des:使用DES算法
- -e:加密
- -d:解密
- -a:(等价与-base64)在加密后和解密前进行base64编码或解密
- -in filename:输入文件
- -out filename:输出文件
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//使用公钥加密文件
- -encrypy:加密
- -in filename:输入文件
- -out filename:输出文件
- -inkey filename:**输入文件
- -pubin: -inkey filename 中的filename是公钥
openssl rsautl -decrypt -in a_encrypt.txt -out a_decrypt.txt -inkey a_key.private//使用私钥解密文件
- -decrypt:解密
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的消息认证码
- -hmac key:使用key创建mac
5)数字签名:使用私钥对消息进行加密,使用公钥对消息进行解密,可以防止否认,消息认证码无法防止否认 openssl genrsa -out a_key.private //生成私钥
- -out filename:输出文件
openssl dgst -md5 -out a.sign -sign a_key.private a.txt//使用私钥对消息进行签字
- -md5:使用MD5算法
- -sign filename:使用该filename中的私钥对文件进行数字签名
openssl rsa -in a_key.private -pubout -out a_key.pubilc//从私钥中获取公钥
- -in filename:输入文件
- -pubout:指定输出文件是公钥
- -out filename:输出文件
openssl dgst -md5 -verify a_key.pubilc -signature a.sign a.txt//用公钥验证数字签名
- -verify filanema:使用filename中的公钥验证数字签名
- -signature filename:待验证的签名文件
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):结束