所谓的数据加密,就是把明文的数据用算法加密为密文,然后进行存放或传输,保证其安全性。
数据加密方式:
1,对称加密
加密方和解密方共用一个密钥,用算法加密后会产生一个密码,用于对此数据解密。对称加密的速度非常快,适用于加密大容量的数据。
通常用的加密算法有:
DES:支持64位的密钥长度
3DES:用DES加密三次
AES:DES的替代者,支持128,256,512位密钥长度的加密
2,公钥加密
用算法加密数据后,会产生一对密钥,一个是公钥,一个是私钥。公钥加密的数据只有私钥才能解,而私钥加密的数据只有对应的公钥才能解。但是,公钥机制加密的速度是非常慢的,它不用于加密大容量的数据,一只用于密钥交换,即对用对称加密算法生成的密码进行加密。
常用的加密算法:RSA,DSA,ElGamal
3,单项加密
用单项加密算法对数据加密后,会生成一个数据的特征码,这个特征码用于唯一标识这段数据。
主要应用就是数字签名和验证数据的完整性。
常见的算法有:MD5:定长输出128位;SHA1:定长输出160位;CRC-32
而通常一个安全的数据传输过程,要包括以上三种加密方式:
发送方准备好自己要发送的数据后,用单项加密算法获得一个特征码。然后发送方用自己的私钥对特征码进行加密,把加密过的特征码放在用对称加密算法加密过的数据前面,然后发送方再用接收方的公钥对数据的密码进行加密,最后发送给接收方。接收方,用自己的私钥可以对加密的数据密码进行解密,有了数据密码就可以对数据进行解密了,接收方再用发送方的公钥对数据的特征码进行解密,如果能解密,就说明这段数据是发送方发的,也就实现了数字签名,然后接受方再把数据用单项加密算法计算出一个特征码,用这个特征码和发送方发过来的特征码进行比对,如果相同,就说明这段数据是完整的,没有被修改,这就实现了数据完整性的检验。
这其中有一个问题?数据的私钥自己存放,但是数据的公钥要发送给对方,这个通过什么来实现呢?
这就用到了CA(certificate authority)即电子商务认证中心。它是负责发放和管理数字证书的权威机构,作为第三方存在。CA在发证书的时候,会通过实地调查申请者,确定申请者身份后,才会发证。CA证书发行的时候,也要进行数字签名,用CA的私钥加密,用于唯一标识这个CA组织。
而CA证书中通常包含的内容为:
1,证书持有者的相关信息
2,公钥
3,CA的相关信息
4,证书的使用方法
而怎么计算文件的特征码呢?
md5sum filename
用md5计算这个文件的校验码
sha1sum filename
用sha1计算这个文件的校验码
openssl dgst -md5 filename
openssl dgst -sha1 filename
指定算法对文件进行校验码计算
下面我们来说一下Linux中实现加密的工具openssl:
openssl有三个重要的库文件:
1,libcrypto
加密库,提供加密机制,实现通用的加密
2,libssl
保证协议并附加安全机制,如认证安全和传输安全等,并支持传输层安全套接字协议ssl/tls
3,openssl
多目标的通用加密,可以生成x.509格式证书,并可以建立一个本地的CA.
openssl的命令用法:
openssl version
查看openssl的版本
openssl cipers
显示所有常用的算法
openssl speed md5
对算法的加密速度进行测试
openssl ?
显示openssl可用的指令
openssl ca
用于创建CA
openssl crl
用于创建证书吊销列表
openssl passwd
用于生成一个经过加密的密码
openssl genrsa 1024 > mykey.pri
用于生成经过RSA加密的私钥,并放在mykey.pri这个文件中
openssl rsa -in mykey.pri -pubout -out mykey.pub
从私钥信息中提取公钥,保存至mykey.pub这个文件
openssl rsa -in mykey.pri -des3 -out mykey.cipher
对私钥进行3DES加密存放至mykey.cipher文件
openssl rsa -in mykey.cipher -out mykey.sec
解密这个文件至mykey.sec这个文件
制作本地的CA:
/etc/pki/CA目录,就是CA默认的工作目录
/etc/pki/tls/openssl.conf 是openssl的配置文件
/etc/pki/CA/private 存放我们自己建的CA的私钥
cd /etc/pki/tls
vi openssl.conf
找到[ CA_default ]行:
把"dir = ../../CA"改为"dir = /etc/pki/CA,即把我们CA的工作目录使用绝对路径来定义
cd /etc/pki/CA
(umask 077; openssl genrsa 2018 > private/cakey.pem)
创建这个文件,并直接更改它的权限;文件的名字是固定的,配置文件中定义好的,cakey.pem是用于存放CA自己的私钥,CA虽然是授权的发证单位,但自己也要有私钥来实现数字签名,来区分不同的CA
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
会自动提取到公钥,创建cacet.pem这个证书,这个证书是CA本身的证书,格式为x509。以后CA就可以给别人发证了。
req:申请证书
-new:表示是新发的申请
-x509:指定我们的CA证书的格式
-key:指定一个私钥文件
-out:从我们知道的私钥中提取公钥信息,并保存至cacert.pem文件中
-days:指定证书的有效期
命令执行之后会出现这些信息让填入:
第一个:我们要创建的CA所在的国家,两个字符
第二个:我们要创建的CA所在的省份
第三个:我们要创建的CA所在的城市
第四个:我们要创建的CA的公司名称
第五个:CA申请者所在的部门
第六个:我们要创建的CA服务器
第七个:我们要创建的CA的邮箱
mkdir certs crl newcerts
certs 为所签证书的目录
crl为 所吊销的证书的目录
newcerts 要签的新证书的目录
touch index.txt serial crlnumber
echo 01 > serial
echo 01 > crlnumber
通过这几个步骤,我们创建了CA必须的几个文件,至此我们的CA服务器就建好了
我们可以在我们请求发证的主机上,申请证书了:
(umask 077; openssl genrsa 1024 > httpd.key)
生成自己的私钥,私钥长度为1024位
openssl req -new -key httpd.key -out httpd.csr
然后从私钥中提取公钥,并生成一个向CA发送的请求文件httpd.csr
第一个:我们要申请的CA所在的国家
第二个:我们要申请的CA所在的省份
第三个: 我们要申请的CA所在的城市
第四个:我们要申请的CA的公司名称
第五个:申请者所在的部门
第六个:申请者要为哪台主机申请证书
第七个:申请者的email
第八个:对这个请求加密,当CA签证的时候要输入密码
第九个:说明申请者是哪个公司的
我们把httpd.csr发送到CA的服务上,然后在的CA服务器上签署,命令为:
openssl ca -in htttpd.csr -out httpd.crt (默认一年)
CA签署这个证书
至此,httpd.crt就是我们的证书了,我们就可以使用了。
注:要了证书httpd.crt和私钥httpd.key,那么我们就可以用他们建立安全的通信连接了
本文转自 leejia1989 51CTO博客,原文链接:http://blog.51cto.com/leejia/801852,如需转载请自行联系原作者