加密、解密、openssl的基本应用
及CA的实现过程
一、加密、解密技术
在互联网上数据传输有两种:明文传输和加密传输。明文传输的协议有:ftp、http、smtp、telnet。但是为了数据的完整性和安全性,所以后来引用了加密等相关手段来保证数据的安全和完整性
现在的加密/解密技术主要有三种:对称加密,非对称加密,和单向加密
1、对称加密
采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
优点:
速度快
加密相对安全
加密紧凑(不会发生加密前与加密后文件大小相关太大)
缺点:
随着参与者数量的增加,密钥数量急剧膨胀((n×(n-1))/2)
因为密钥数量过多,对密钥的管理和存储是一个很大的问题
不支持数字签名和不可否认性(不能认证数据是否完整,不支持身份认证)
常见的对称加密算法有:
DES:使用56位的密钥,2000年的时候被人破解了,所以现在基本不再使用
AES:高级加密标准,可以使用128,129,256三种长度密钥
其它:blowfish,Twofish和RC6,IDEA(商业算法),CAST5等
2、非对称加密
非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
优点:
安全,因为不必发送密钥给接受者,所以非对称加密不必担心密钥被中途截获的问题
密钥数目和参与者数目相同,没有复杂的密钥分发问题
在交换公钥之前不需要预先建立某种信任关系
缺点:
加密速度很慢
密文会变长(例如:若1GB大小文件,加密后会变成1.5GB左右)
常见的非对称加密算法有:
RSA 加密和签名
DSA 签名
ElGamal
非对称加密总结:
非对称加密长度通常有512,1024,2048,4096位,最常用的就是2048位,长度固然可以增加安全性但是需要花费很长时间来进行加密/解密,和对称加密相比,加密/解密的时间差不多是对称加密的1000倍,所以我们通常用其作为用户认证,用对称加密来实现数据的加密/解密
3、单向散列算法(单项加密)
又称hash函数,Hash函数(也称杂凑函数或杂凑算法)就是把任意长的输入消息串变化成固定长的输出串的一种函数。这个输出串称为该消息的杂凑值。一般用于产生消息摘要,密钥加密等。Hash函数主要用于完整性校验和提高数字签名的有效性。
特点:
输入一样,输出必须相同
雪崩效应:输入的微小改变,将会引起结果的巨大改变
定长输出:无论原始数据是多大,结果大小都相同的
加密过程不可逆,无法根据特征码还原原来的数据
常见散列函数(Hash函数)
·MD5:是RSA数据安全公司开发的一种单向散列算法,MD5被广泛使用,可以用来把不同长度的数据块进行暗码运算成一个128位的数值;
·其它:SHA1,SHA512,CEC-32
下图是帮助我们理解加密算法在Internet上的使用所作的说明:
解释如下,先说BOB和ALICE通信阶段
黑框A:表示要传输的数据
黑框B:就是单项加密对这段数据提取的特征码,这段特征码同时运用了非对称加密,具体过程是用BOB的私钥加密,传输给ALICE,只要到达后ALICE能解密,表明对方确实是BOB。这一过程同时起到了用户认证和数据完整性的校验。黑框B又称为数字签名
红框A:这一阶段会生成一段很长的随机数(密钥)然后配合对称加密算法对黑框A和黑框B加密,但是我们如何把加密的密钥传输给ALICE呢?这就要用到红框B了
红框B:这一阶段是用ALICE的公钥加密这串随机数(对称加密阶段的密钥),ALICE接受到数据后如果能用自己私钥解密,那就证明接受者确实ALICE
加密过程:
第一步:用单向加密算法提取数据(黑框A)的特征值
第二步:用自己的私钥加密这段特征值形成黑框B
第三步:用对称加密算法,对黑框A和黑框B来加密,得到红框A
第四步:用ALICE的公钥来加密第三步所用的密钥,得到红框B
解密过程:
第一步:ALICE用自己的私钥解密红框B得到对称加密的密钥
第二步:用这个密钥解密红框A内容
第三步:用BOB的公钥解密黑框B,如果能成功,说明发送方确实是BOB,这就完成了身份验证(解密后会得到一串数据的特征值)
第四步:用同样的单项加密算法来对这段数据提取特征值,如果和第三步的特征值一样,说明这段数据是完整的,这就完成了数据完整性的校验
进行完上述内容厉害的读者会发现一个问题就是BOB和ALICE如何获得对方的公钥,或者说如何证明获得的公钥就是对方,这就需要引入另一方证书颁发机构CA,下面是对证书颁发机构跟BOB/ALICE之间的解释
黑框C:代表要颁发给BOB/ALICE的公钥,组织,地址等信息
黑框D:是对黑框C进行单向加密后得到的数字签名,然后用自己的私钥对其加密,传输给BOB和ALICE,拿着这个证书颁发机构的公钥(这些证书颁发机构的公钥一般已经被microsoft事先放在windows里面,当然其他操作系统也是一样的)的BOB和ALICE如果能对这个证书进行解密,说明这个证书颁发机构不是冒充的
红框E:表示颁发给BOB和ALICE的证书
二、openssl应用详解
1、安装openssl (默认已经安装)
2、子命令应用
enc对称加密,des3加密方法, -in指定要加密的文件,-e表示加密,-out指定加密后要保存的位置, -salt 使加密过程更安全, -a 表示输出的结果保存为base64的文本编码格式,不指定会保存为二进制, -d 解密
加密示例:将/etc/fstab加密并输出到/tmp/fstab.cipoher
命令:openssl enc -des3 -a -salt -in /etc/fstab -out /tmp/fstab.cipoher
cat /tmp/fstab.cipoher
我输入的密码为:redhat
解密示例:还原后内容和原文件一样
命令:openssl enc -d -des3 -a -salt -in/tmp/fstab.cipoher
-out /tmp/fstab.cleartext
另外也可以使用openssl进行单向加密
单向加密:
特性:
One-Way
Collision-free
算法:
md5:128bits
sha1:160bits
sha512:512bits
工具:sha1sum,md5sum,cksum,opemssl dgst
openssl dgst [-md5|-md4|-md2|-sha|-mdc2|-ripemd160|-dss1] [-outfilename] /path/to/somefile
三、用openssl实现自建CA:
1、查看配置文件
vim /etc/pki/tls/openssl.cnf
[ CA_default ]
dir = /etc/pki/CA #工作目录,此处需要指定,不然给客户到签证的时候必须在特定的目录下才能实现。
certs = $dir/certs #客户端证书目录
crl_dir = $dir/crl #证书吊销列表
database = $dir/index.txt #证书记录信息
new_certs_dir = $dir/newcerts #新生成证书的目录
certificate = $dir/cacert.pem #CA自己的证书位置
serial = $dir/serial #序列号
crlnumber = $dir/crlnumbe #证书吊销列表序列号
crl = $dir/crl.pem #证书吊销列表文件
private_key = $dir/private/cakey.pem #CA自己的私钥
RANDFILE = $dir/private/.rand #随机数文件
x509_extensions = usr_cert
2、把另外一台服务器172.16.251.45做成CA
在CA服务器172.16.251.45上执行:
命令:cd /etc/pki/CA
(umask 077;openssl genrsa -out private/cakey.pem 2048) #生成密钥对
如果想查看公钥:
openssl rsa -in private/cakey.pem -pubout -text -noout
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655
#生成自签证书
touch index.txt serial crlnumber #建立序列号文件
echo 01 > serial #写入起始序列号
3、配置httpd使用证书
在本机上执行:
命令:cd /etc/httpd #web服务器的配置目录
mkdir ssl
cd ssl #每一种服务要想使用证书,必须有私钥,每一种应用都需要自己的证书
(umask 077; openssl genrsa -outhttpd.key 1024)#给自己生成密钥
openssl req -new -key httpd.key -out httpd.csr #生成证书签署请求文件,机构和其他名字必须和CA颁发机构上的一样
scp httpd.csr 172.16.251.45:/tmp #将请求文件发给CA
openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -days 3655 #CA服务器签名,签名以后才可以使用
CA服务器上执行:
cd /tmp
scp httpd.crt 172.16.251.111:/etc/httpd/ssl/ #将签名后的请求文件传回去
另外如果需要吊销证书:
# openssl ca -revoke/path/to/somefile.crt (谨慎使用)