一、加密、解密介绍
人类对信息加密解密由来已久,据可证实的最早信息加密解密应用可以追溯到公元前2000年的古代埃及,可以说加密解密技术是随着人类的进步而发展的。
现在网络信息的触角无所不到,信息的安全关系到每一个人切身利益,因此,对互联网传输信息的加密解密是保证所传递信息的安全和完整必不可少的手段。
现在应用的加解密技术主要分为三种:对称加密算法、非对称加密算法以及单向加密算法。
1、对称加密算法(Symmetric Algorithm):
该算法基于这样的假设:双方共享一个密钥,并且使用相同的加密方法和解密方法。1976年以前几乎所有的加密算法都基于此,时至今日,对称密钥仍然各个领域广泛应用,特别是在数据解密和消息完整性检测方面。
图解:
A输出明文,然后用同一个密钥的对称算法进行加密,加密完成后发给B,B得到后用同一个密钥解密后得到明文。但对称算法容易被C复制或篡改
优点:
1、加密、解密双方使用同一口令(密钥);
2、加密速度快,分隔成固定大小的块,逐个进行加密
缺点:
1、密钥过多(若一方和多方通信会需要存储多个密码);
2、密钥传输交换(交易双方都使用同样钥匙,安全性得不到保证);
常见的对称加密算法有:DES、3DES、AES、Blowfish、RC2、RC4、RC5、Twofish, IDEA, RC6, CAST5, Serpent等。
常见工具有:gpg, openssl enc
使用命令:
# openssl enc -des3 -a -salt -in /path/from/somefile -out/path/to/somecipherfile
加密 -a:表示已base64的方式加密(对文本文件一般都用base64的方式)
# openssl enc -d-des3 -a -salt -in /path/from/somecipherfile -out /path/to/somefile
解密 -d:表示解密
2、单向加密:
又被称为不可逆加密算法,在加密过程中不需要使用密钥,数据经加密后生成定长密文,且密文无法解密。一般由于数据完整性验证。
其特点是:密文不可逆且不可预测;定长输出;相同明文输入,生成密文相同;雪崩效应(明文的任何微小的变化,都会对生成的密文产生巨大的影响)。
常见的单向加密算法有:MD5、HMAC、SHA1、SHA512、CRC32等。
常见的工具有:sha1sum, md5sum, cksum, openssl dgst
使用命令:
# openssl dgst [-md5|-sha1] [-out/path/to/filename] /path/from/somefile
互联网上的信息加密应用或许我们可以理解为:在通信的双方之间建立一条安全通道,其他对这条通道传输的信息是不可理解或不可见的。
3、非对称加密算法(Asymmetric Algorithm):
也被称为公开密钥加密,有一对加密密钥和解密密钥,这一对密钥是数学相关,使用加密密钥加密后得到的信息,只有解密密钥才能解密。如果真的一个,并不能计 算出另一个。因此如果公开了一个密钥,并不会危害到另一个密钥。公开的密钥被称为:公钥(publickey),不公开的密钥称为私钥 (privatekey)。
图解:
加密过程:
第一步:A用单向加密算法计算出数据的特征码(数据指纹)放在数据后面,
第二步:A用自己的私钥加密 数据特征码,并放数据的后面
第三步:A生成一对秘钥,采用对称加密对加密过的特征码和数据进行加密
第四步:A用B的公钥再对整个数据加密,放在数据的后面
第五步: 把经过多重加密的数据发送给B
解密过程:
第一步: B 接收到A 发来的数据,就用自己的私钥去解密,成功解密,就证明这个数据的确是发给自己的没错,
第二步:B 用A生成的密码解密数据,得到加密的特征码与加密的数据
第三步; B 还要用A的公钥解密,来验证是否是A发出的这个数据的,用来验证数据的来源是否是与自己通信的用户
第四步:B 用A单向加密的算法来解密加密的数据的***
第五步:比较得出的特征码是否一致,一致则说明数据时完整的,没被修改过。
优点:可用于密钥的交换和数字签名
缺点:不适合加密数据因速度太慢;此机制无法解决的难题是无法确定得到的公钥就是对方的
常见的算法有:RSA、EIGamal、DSA等。(RSA:既能加密也能签名的一种算法,
DSA: 数据加密算法,只能用于签名用的)
常见工具有:gpg, openssl rsautl
使用命令:
例:#openssl genrsa -out/path/to/keyfile NUMBEROFBITS
二、openssl的基本应用
OpenSSL
工具包是Linux上SSL v2/v3和TLS v1协议的实现方式之一,并提供了常用的加密解密功能。
OpenSSL
主要由三部分组成:
1
:
libcrypto
:加密库,主要用来实现加密、解密的功能库
2
:
libssl
:实现SSL服务器端功能会话库
3
:
openssl
多功能命令行工具:/usr/bin/openssl(生成密钥、创建数字证书、手动加密解密数据)
创建CA的前提条件:
使用openssl就可以模拟出来一个自建的CA,在此之前,我们先来看一下openssl工具的的配置文件/etc/pki/tls/openssl.cnf:
所以接下来我们使用openssl工具创建私有CA时,所涉及到的路径和文件名需要和配置文件中默认的保持一致,否则我们就需要同时修改此配置文件
1、创建私有CA的步骤:
1.cd /etc/pki/CA/
为CA自己生成一个私钥
#(umask 077; openssl genrsa -out private/cakey.pem 2048)
因为私钥文件需设置权限为除属主外,其他人都不可以读,即设为600。可使用此命令即可以一步到位地生成私钥文件的同时,设置好了权限。(加括号,意为umask 077命令只对子shell有效,对当前shell无效)
如果想查看公钥:
# openssl rsa -in private/cakey.pem -pubout -text -noout
2. CA自签证书
#openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
参数解释:
-new 表示新的请求
-x509 表示生成自签署证书
-key 表示后跟的文件路径为私钥的文件路径(从私钥提取公钥)
-out 表示存放自签署证书的位置
-days 表示该证书的有效期天数,(就像***上的有效期一样)
自建CA的自签证书的Common Name前面所有的国家、组织等信息,和证书签署请求中填写的必须保持一致。否则自建CA无法签署。因为这是我们自建的私有CA只能在内部自己使用。
现在自建CA的私钥文件cakey.pem和自签证书cacert.pem都已具备,各种工作目录certs、crl、newcerts也都已存在,现在就缺少了一个序列号文件serial和一个数据库文件index.txt
下面来创建这几个文件(Centos6.5后这些文件可能不需要手动创建)
#touch index.txt
#echo 01 > serial
此时即创建了自建CA,可以开始给别人签证了
签署证书:
我们自己创建好的CA所在的主机,接收到别人发来的证书签署请求后,执行如下命令,即可签署证书,生成证书文件。
#openssl ca -in /path/to/certreq.csr -out/path/to/certfile.crt -days 365
CA给别人签署证书之后,index.txt文件中即查看到证书信息,serial文件编号也改变。
我们已经有了私有CA了,接下来我们的服务器则可以向这个CA申请证书了。
2、客户端申请证书的步骤:
1、自己生成一个私钥;
#(umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
2、制作一个证书签署请求;(此过程会自动从私钥中提取公钥,并附加上个人信息)
#openssl req -new -key
/etc/httpd/ssl/httpd.key -out
/etc/httpd/ssl/httpd.csr
3、把签署请求文件发送给CA服务
利用SCP命令
scp /etc/httpd/ssl/httpd.csr CA服务器(IP地址)
3、CA签署证书
1、CA先验证申请者的信息,再签署证书
openssl ca -in
/etc/httpd/ssl/httpd.csr �Cout
/etc/httpd/ssl/httpd.crt -days 365
2、发送给请求者
利用SCP命令
scp /etc/httpd/ssl/httpd.crt 客户端(IP地址)
4、吊销证书(当节点出现自己私钥丢失的情况时需要吊销证书)
1
、 由节点请求吊销
1
)获取证书serial(序列号)
#openssl x509 �Cin
/etc/httpd/ssl/httpd.crt �Cnoout�Cserial-subject
2)吊销证书
# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
3
)生成吊销证书的编号(如果是第一次吊销需要生成编号)
#echo 00 > /etc/pki/CA/crlnumber
4
)更新证书吊销列表
# cd /etc/pki/CA/crl
#openssl ca �Cgencrl crl/thisca.crl
如果需要查看吊销列表,使用命令openssl crl �Cin /path/to/crlfile.crl �Cnoout -text
openssl
补充材料:
openssl
中有如下后缀名的文件
.key
格式:私有的密钥
.crt
格式:证书文件,certificate的缩写
.csr
格式:证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写
.crl
格式:证书吊销列表,Certificate Revocation List的缩写
.pem
格式:用于导出,导入证书时候的证书的格式,有证书开头,结尾的格式
常用证书协议
x509v3: IETF
的证书标准
x.500:
目录的标准
SCEP:
简单证书申请协议,用http来进行申请,数据有PKCS#7封装,数据其实格式也是PKCS#10的
PKCS#7:
是封装数据的标准,可以放置证书和一些请求信息
PKCS#10:
用于离线证书申请的证书申请的数据格式,注意数据包是使用PKCS#7封装这个数据
PKCS#12:
用于一个单一文件中交换公共和私有对象,就是公钥,私钥和证书,这些信息进行打包,加密放在存储目录中,CISCO放在NVRAM中,用户可以导出,以防证书服务器挂掉可以进行相应恢复。思科是.p12,微软是.pfx
不足之处还请赐教