linux下的加密和安全
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下的加密和安全相关的知识,希望对你有一定的参考价值。
1.对称加密算法
对称加密算法就是使用一把钥匙进行加密解密的算法,加密时用这把钥匙加密,解密时用这把钥匙解密,其最大的优势在于加密解密速度快,其特点在于将原始数据分成固定大小的块,逐个进行加密。而其缺点就很明显,秘钥分发的过多,如果要发给1000个人就需要给这1000个人秘钥,而且秘钥的传输并不安全,任何人只要截获秘钥就可以随意修改数据,当我们收到一个数据时,不能保证该数据的来源的可靠性,其可能篡改过。
我们经常使用的对称加密算法主要有DES算法,3DES,AES等算法。
2.非对称加密算法
非对称加密算法就是加密解密使用的不是同一把钥匙,使用公私钥加密,公钥对外公开,任何人只要想拥有,都可以给他,私钥只有自己持有。公私钥加密解密的规则是公钥加密的数据只有私钥才能解开,私钥加密的数据只有公钥才能解开,我们可以用下面的图来解释公私钥加密过程。
如图所示,当B想要发送数据给A时,有A生成一对公私钥,公钥pa,私钥sa,公钥对外公开,B,C都可以拥有A的公钥pa,但只要A有自己的私钥sa,这时,B想要给A发送数据,只需要用A的公钥加密,生成数据段pa(data)发送给A,因为使用的是A的公钥加密,只有A的私钥能解开,而只有A又有A的私钥sa,而C没有A的私钥,即使抓到数据包也解不开该数据包,这样就可以实现加密的安全,同时没有了秘钥传递的安全隐患。但由于加解密过程繁琐,所以使用非对称加密算法加解密数据效率不高。
3.CA和证书
使用非对称加密算法虽然解决了秘钥传递的隐患,数据也是被加密安全的,但是存在这样一个问题,就是A收到的来自B的数据,但是这个B并不是真正的B,而是C冒充的,因为C也有A的公钥,C虽然没有A的私钥,不能解开B发个A的数据,但是他能够截获该数据,并冒充B,使用A的公钥加密令一个数据发给A,A并不能感觉到数据的来源不对,依然相信C就是自己想要的B,这样是不安全的,解决的办法就是使用数字签名。
1.单向散列hash函数
单向散列的目的是对一段数据生成固定大小的指纹,我们称其为消息摘要,这个过程是不可逆的,不能消息摘要反推回数据。其特点是任意长度输入,固定长度输出,如果修改原始数据,则生成的消息摘要也会发生改变,常用的算法是MD5,例如
md5sum hello.txt
执行结果如下:
修改hello.txt中的数据,再次执行上述命令,结果如下:
两次输出的MD5值不同,我们可以使用md5sum生成我们需要的消息摘要。
2.CA中心
CA中心是我们的公信机构,可以帮我们确定B的身份就是B,CA同样有着一对公钥和私钥,公钥每个人都可以拥有,私钥只有CA自己持有。我么可以自己创建自己的CA中心。
查看CA配置文件,路径为/etc/pki/tls/openssl.cnf,可以看到一些CA配置,CA的主目录在/etc/pki/CA:
还有其他文件存储路径:
还有一些其他项:
现在开始部署CA:
1.创建根CA在centos7
创建根CA需要两个文件,我们生成一下:
touch index.txt
echo 00>>serial
进入CA主目录,使用下面的命令生成私钥,-out 指定路径,必须要与配置文件相同,私钥密码随意,这里设置为centos:
(umask 066;openssl genrsa -out private/cakey.pem -des3 2048)
然后通过私钥提取出公钥,命令如下:
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 7300
执行结果如下:
注意这里输入的密码是公钥的密码。
2.创建子CA在centos6
创建子CA需要的一些文件:
进入CA目录
touch index.txt
echo 00>>serial
然后生成子CA的私钥:
(umask 066;openssl genrsa -out private/cakey.pem -des3 2048)
执行结果如下:
然后根据私钥生成公钥:
openssl req -new -key private/cakey.pem -out subca.csr
执行结果如下:
因为是子CA,所以里面的信息要按照配置文件中的要求去填写,即,国家和省还有地点要一样,城市和公司名随意,部门一定不能一样。
然后需要根CA对子CA的公钥进行签名,过程如下
将公钥传给根CA,命令如下:
scp subca.csr [email protected]:/etc/pki/CA
然后根CA对子CA的公钥进行签名,命令如下:
openssl ca -in subca.csr -out certs/subca.crt -days 3650
完成签名后,需要把签名后的文件回传给子CA,命令如下:
scp certs/subca.crt [email protected]:/etc/pki/CA/cacert.pem
3.部署服务器
服务器首先要有自己的公私钥,用下面的命令生成自己的私钥:
(umask 066;openssl genrsa -out server.key 1024)
执行结果如下:
然后根据私钥生成公钥,命令如下:
openssl req -new -key rhel5.key -out server.csr
结果如下:
然后将该公钥传给子CA让其签名,命令如下:
scp server.csr [email protected]:/etc/pki/CA
子CA对公钥签名,生成证书,命令如下:
openssl ca -in server.csr -out certs/server.crt -days 365
执行结果如下:
然后将证书回传给服务器,命令如下:
scp server.crt [email protected]:/app
这样服务器就有了证书。
4.数字签名
可以参考下图:
当B要向A发送数据时,B数据dataA使用单向散列的方法生成一个消息摘要,生成数据dataB,然后将消息摘要发送给CA,CA对这个消息摘要用自己的私钥加密进行签名,并回传给B,B将dataA和CA传回的数字签名一起使用A的公钥进行加密,A收到数据后,用自己的私钥解开,生成dataA和数字签名,A使用CA的公钥对数字签名解密,得到消息摘要A,然后A使用相同的单向散列对数据dataA生成数字签名,如果两个摘要相同,则证明数据在传输过程中没有被改变过,如果A能解开数字签名,说明发送数据的B就是真正的B,不能解开,说明不是CA承认的B。
当然我们有了证书就不需要如此麻烦,B只需要用自己的证书对dataB进行加密就可以了,如果C想要冒充B,他就要向CA证明自己是B,但CA不会给他颁发证书。
证书中有着B的信息,这些是CA承认的东西。
以上是关于linux下的加密和安全的主要内容,如果未能解决你的问题,请参考以下文章