一、数据的加密方式

    数据好好的为什么要加密?鲁迅说过,世上本没有路,走的人多了,也就成了路。同样的道理,数据本不用加密的,上网的人多了,也就必须要加密了。只要电子设备联网,就没有安全可言,安全从来都是相对的。理论上只要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

openresty luajit加密 openssl加密_开发工具


解密/etc/fstab文件

openssl enc -d -des3 -a -salt -in fstab.cipher -out fstab.cleartext

openresty luajit加密 openssl加密_数据库_02


2、单向加密

openssl命令格式:

openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-out filename] 加密文件

-out: 保存至文件中


还可以使用的其它命令sha1sum, md5sum, cksum,计算文件特征码。


例如:计算/etc/fstab的特征码


openresty luajit加密 openssl加密_数据库_03


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是否有私钥:


openresty luajit加密 openssl加密_数据库_04


生成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)


openresty luajit加密 openssl加密_数字证书_05


公钥文件不需要特别生成,因为公钥文件是私钥文件的一部分,是从私钥文件提取出来的。提取公钥并非必要步骤,如果想查看公钥文件可以使用以下命令:

openssl rsa -in private/cakey.pem -pubout -text

openresty luajit加密 openssl加密_数据库_06


(2)、生成自签证书

openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655

-new: 一个新的申请

-x509: 证书格式

-key: 私钥文件路径

-out: 证书保存路径

-days: 有效期限


执行命令后,需填写证书的相关信息:


openresty luajit加密 openssl加密_数据库_07


查看证书是否生成成功:


openresty luajit加密 openssl加密_数字证书_08


(3)、客户端证书申请前的准备工作。

通过配置文件/etc/pki/tls/openssl.conf可知,缺少三个文件,新建这三个文件:

touch index.txt serial crlnumber


openresty luajit加密 openssl加密_shell_09


给记录证书数字编号的文件serial写入编号,我们以01作为它的第一个编号:


openresty luajit加密 openssl加密_openresty luajit加密_10


(4)、CA自签证书完成,客户端可以开始申请证书了,此时我们打开另外一台虚拟机作为客户端。在客户端中,通常哪个应用程序要用到数字证书,那么数字证书就要保存在那个程序的配置文件目录,此时我们以web服务器程序httpd为例。

为了规范,我们在httpd的配置文件目录新建一个目录ssl,在/etc/httpd/ssl目录中生成客户端的密钥文件。

(umask 077; openssl genrsa -out httpd.key 1024)



openresty luajit加密 openssl加密_开发工具_11


(5)、客户端生成证书签署请求

openssl req -new -key httpd.key -out httpd.csr

-new: 生成一个新的签署请求

-key: 以哪个密钥文件为依据

-out: 生成的文件名


openresty luajit加密 openssl加密_shell_12


查看文件:


openresty luajit加密 openssl加密_openresty luajit加密_13


(6)、客户端证书签署请求生成后,接下来把请求发给CA申请数字证书。

使用scp命令将文件传送到服务器的/tmp目录:

scp httpd.csr 192.168.0.6:/tmp/

openresty luajit加密 openssl加密_shell_14


(7)、回到服务器,CA签署证书

openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -days 3650


openresty luajit加密 openssl加密_开发工具_15


(8)、将签署好的文件传送给客户端

scp /tmp/httpd.crt 192.168.0.111:/etc/httpd/ssl


客户端查看文件


openresty luajit加密 openssl加密_开发工具_16


数字证书申请成功,接下来的操作是,配置客户端使用数字证书了。


(9)、假如数字证书过期,可以在CA主机上使用以下命令吊销证书

openssl ca -revoke /path/to/somefile.crt



openresty luajit加密 openssl加密_数据库_17