一、数据的加密方式
数据好好的为什么要加密?鲁迅说过,世上本没有路,走的人多了,也就成了路。同样的道理,数据本不用加密的,上网的人多了,也就必须要加密了。只要电子设备联网,就没有安全可言,安全从来都是相对的。理论上只要CPU的运算速度够快,世界上没有破解不了的密码,只是时间问题,但是我们还是得加密。数据的加密方式通常用三种:对称加密、公钥加密和单向加密。
1、对称加密
数据的加密通常都要依托于一种算法,所谓的算法,可以简单的理解为,将一类数据有目的重新排列、组合使之面目全非的计算方法。而对称加密,就是使用这一类算法计算明文,生成密文。但是,密文依旧可以使用加密算法的逆算法还原成明文。这种加密方式是可逆的,具有对称性,所以叫作对称加密。常用的加密算法有:DES, 3DES, AES, Blowfish,Twofish, IDEA, RC6, CAST5, Serpent等。
我们知道,两台主机在网络上互相通信,数据很有可能被中间人截获。于是使用对称加密的数据就有可能被中间人还原,然后中间人对还原后的数据进行添加、删除、修改操作,然后使用相同的算法加密修改后的数据,再转发给目的地。因此对称加密虽然好用,但面临了好多问题:首先面临口令传输安全性的问题;其次无法确认收发信息者的身份;还有一个就是无法确认传输数据的完整性。
2、公钥加密
公钥加密也叫,非对称加密。常用的公钥加密算法有:RSA, EIGamal。它是使用一类公钥加密算法,生成一对密钥文件,一个是私钥自己持有但绝不公开,另一个是公钥,可以对外公开。公钥文件是用来加密的,私钥用来解密。公钥加密速度很慢,通常不用来加密大数据文件,而是用来加密口令。因为密钥文件只有成对的才能完成加密与解密的操作,所以公钥加密也能用来作身份认证。所以当两台主机通信,传输数据时,使用对称加密技术加密数据,加密数据的口令再使用公钥加密方法加密,这样重重加密后的数据,在传输上于是就解决了口令传输安全性的问题,又解决了身份验证的问题。使用这两种方式结合的加密技术,虽然解决了这两个问题,数据不能被第三者还原,但是很有可能被第三者破坏,如果要保证数据的完整性,那就要用到第三种加密方式,单向加密。
公钥加密技术有一项延伸应用,叫作数字签名。数字签名的加密方式刚好和公钥加密相反,它是私钥加密、公钥解密,使用的算法为DSA。
3、单向加密
常用的单向加密算法有:MD5, SHA1, SHA512, CRC-32。单向加密技术并不是用来加密的,它是使用一种单向加密算法提取文件的特征码的操作。任何一个文件通过单向加密方式生成的特征码都是唯一的。任何一个文件其中微小的变化通过单向加密算法运算后,最终的结果都会发生翻天覆地的变化。并且,每个文件计算出来的特征码都不能还原。于是,单向加密技术轻松的解决了数据传输过程中,文件完整性的问题。
4、CA
论理上公钥加密虽然可以解决身份认证的问题,但是,当两台主机在传输数据时,两主机间的第三者也可以生成一对自己的密钥文件,近而中转两台主机的数据。所以使用公钥加密作数据传输时,此时的这个环节是一个很大的漏洞。所以,此时如果网络上有一个机构专门负责分发密钥文件,及检查密钥文件持有者的合法性,那么这个问题就很好的解决了。通常网络上的这种机构我们称之为CA,CA发放的密钥文件我们称之为,数字证书。
CA证书一般都是固定格式,数字证书的制作使用的就是公钥加密技术,申请证书只须申请者按照一定格式把数字证书制作好后,提交给CA机构审核,审核通过后,该数字证书就行之有效了。须要说明的是,制作数字证书时,私钥自己持有且必须严密保存,公钥文件可以对外公开,每个数字证书都有时间期限,证书丢失后,须向CA机构申请吊销。
我图画的不好,关于上面说的,我列个表格对比一下吧。
加密方式 | 对称加密 | 公钥加密 | 单向加密 | CA |
优 点 | 1、加密速度快; | 1、密钥成对,能实现身份识别,及密钥交换; 2、当对称加密、公钥加密、数字签名、单向加密相结合时,相对很安全; | 1、加密速度快; 2、算法具有唯一性,结果不可逆; | 1、集众家之长,安全; |
缺 点 | 1、算法公开,容易反解; 2、不能识别解密者身份合法性; | 1、加密大文件速度慢; | 1、贵!普通人用不起; | |
便 利 性 | 操作方便,数据加密后只有一个口令; | 加密后会成生两个密钥文件,私钥必须好好保存不能让第二者知道; | 操作方便,数据加密生成特征码后不能再修改文件,如若修改需重新加密; | 需要向第三方CA机构申请数字证书,并且证书有时间期限; |
常用算法 | DES, 3DES, AES, Blowfish,Twofish, IDEA, RC6, CAST5, Serpent | RSA, EIGamal, DSA | MD5, SHA1, SHA512, CRC-32 |
关于密钥的交换,除了可以使用公钥加密算法外,还可以使用的一种算法是DH算法,DIFFIE-Hellman。
说了那么多,我们使用openssl命令实际操作一遍。
二、使用openssl命令
openssl是一个套件,它由三部分组成,libcryto、libssl、openssl。libcryto是一个通用功能加密库,里面实现了众多的加密算法;libssl用于实现TLS/SSL的功能;openssl是一个多功能的命令行工具,它能够让你创建证书、吊销证书、加密解密数据等。在命令行输入openssl ?,可以查看openssl的相关加密解密选项。
1、对称加密,使用enc选项,可以使用man enc查看enc子命令的帮助。
加密格式:
openssl enc -des3 -a -salt -in 要加密的文件 -out 文件保存路径
-des3: 使用des3加密算法加密,也可以使用其它加密算法
-a: 以base64位格式输出
-salt: 加盐
-in: 要加密的文件路径
-out: 文件加密后的保存路径
解密格式:
openssl enc -d -des3 -a -salt -in 要解密的文件 -out 文件保存路径
加密/etc/fstab文件
enc -des3 -a -salt -in /etc/fstab -out fstab.cipher
解密/etc/fstab文件
openssl enc -d -des3 -a -salt -in fstab.cipher -out fstab.cleartext
2、单向加密
openssl命令格式:
openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-out filename] 加密文件
-out: 保存至文件中
还可以使用的其它命令sha1sum, md5sum, cksum,计算文件特征码。
例如:计算/etc/fstab的特征码
3、公钥加密,使用命令 openssl rsautl ,用的不多,主要的运用还是数字证书。
4、CA数字证书
数字证书的格式通常为x509,主要包含以下几个部分:
公钥和有效期限; 要包含持有者的个人合法身份信息;# 身份信息通常为主机名 证书的使用方式; CA的信息; CA的数字签名;
为了模拟操作,我们得自己充当CA,作为CA,身份也得验证,所以CA也得有一个数字证书,但是CA是专门给别人发证书的,自己的证书无人可发,于是CA可以自己给自己发放数字证书,这叫自签署证书。我们先来查看一下CA的配置文件/etc/pki/tls/openssl.conf中[ CA_default ]的各项参数:
[ CA_default ] dir = /etc/pki/CA # CA工作目录 certs = $dir/certs # 数字证书所在位置 crl_dir = $dir/crl # 数字证书吊销列表 database = $dir/index.txt # 数字证书及吊销证书记录文件 #unique_subject = no # Set to 'no' to allow creation of # several ctificates with same subject. new_certs_dir = $dir/newcerts # 刚签属的证书 certificate = $dir/cacert.pem # CA自己的证书,CA的公钥 serial = $dir/serial # 当前数字证书的编号 crlnumber = $dir/crlnumber # 当前吊销证书的编号 # must be commented out to leave a V1 CRL crl = $dir/crl.pem # 当前正在使用的的CRL private_key = $dir/private/cakey.pem# CA自己的私钥 RANDFILE = $dir/private/.rand # 随机数据文件 x509_extensions = usr_cert # x509证书的扩展,用户证书
实例:用openssl实现私有CA
(1)、进入CA的工作目录/etc/pki/CA,给CA自己生成一个私钥。
查看CA是否有私钥:
生成CA私钥:
openssl genrsa -out private/cakey.pem 2048
说明:-out参数为保存路径,2048为密钥文件的长度。
注意:私钥文件是一个很重要的文件,因此分配权限要注意,并且文件要作特别的加密保存,此处因为实验,所以不作加密。此处我们需要给CA密钥最小权限,可以修改umask的值为077,为了不影响整个shell环境,我们可以在小括号里执行命令,小括号里的命令默认是在一个子shell进程里执行,因此执行完命令umask值不影响父shell。
(umask 077; openssl genrsa -out private/cakey.pem 2048)
公钥文件不需要特别生成,因为公钥文件是私钥文件的一部分,是从私钥文件提取出来的。提取公钥并非必要步骤,如果想查看公钥文件可以使用以下命令:
openssl rsa -in private/cakey.pem -pubout -text
(2)、生成自签证书
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655
-new: 一个新的申请
-x509: 证书格式
-key: 私钥文件路径
-out: 证书保存路径
-days: 有效期限
执行命令后,需填写证书的相关信息:
查看证书是否生成成功:
(3)、客户端证书申请前的准备工作。
通过配置文件/etc/pki/tls/openssl.conf可知,缺少三个文件,新建这三个文件:
touch index.txt serial crlnumber
给记录证书数字编号的文件serial写入编号,我们以01作为它的第一个编号:
(4)、CA自签证书完成,客户端可以开始申请证书了,此时我们打开另外一台虚拟机作为客户端。在客户端中,通常哪个应用程序要用到数字证书,那么数字证书就要保存在那个程序的配置文件目录,此时我们以web服务器程序httpd为例。
为了规范,我们在httpd的配置文件目录新建一个目录ssl,在/etc/httpd/ssl目录中生成客户端的密钥文件。
(umask 077; openssl genrsa -out httpd.key 1024)
(5)、客户端生成证书签署请求
openssl req -new -key httpd.key -out httpd.csr
-new: 生成一个新的签署请求
-key: 以哪个密钥文件为依据
-out: 生成的文件名
查看文件:
(6)、客户端证书签署请求生成后,接下来把请求发给CA申请数字证书。
使用scp命令将文件传送到服务器的/tmp目录:
scp httpd.csr 192.168.0.6:/tmp/
(7)、回到服务器,CA签署证书
openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -days 3650
(8)、将签署好的文件传送给客户端
scp /tmp/httpd.crt 192.168.0.111:/etc/httpd/ssl
客户端查看文件
数字证书申请成功,接下来的操作是,配置客户端使用数字证书了。
(9)、假如数字证书过期,可以在CA主机上使用以下命令吊销证书
openssl ca -revoke /path/to/somefile.crt