码迷,mamicode.com
首页 > 系统相关 > 详细

linux下的加密和安全

时间:2018-09-07 15:56:20      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:输出   个人   数字   个数   etc   改变   ima   umask   没有   

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 root@172.18.250.11:/etc/pki/CA

然后根CA对子CA的公钥进行签名,命令如下:

 openssl ca -in subca.csr -out certs/subca.crt -days 3650

技术分享图片
完成签名后,需要把签名后的文件回传给子CA,命令如下:

scp certs/subca.crt root@172.18.250.22:/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 root@172.18.250.22:/etc/pki/CA

子CA对公钥签名,生成证书,命令如下:

openssl ca -in server.csr -out certs/server.crt -days 365

执行结果如下:
技术分享图片
然后将证书回传给服务器,命令如下:

scp server.crt root@172.18.252.155:/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下的加密和安全

标签:输出   个人   数字   个数   etc   改变   ima   umask   没有   

原文地址:http://blog.51cto.com/13412442/2171654

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!