Linux基础中的加密、解密及openssl
数据为何要加密?
因为互联网刚开始时使用的人很是少,在互联网中交流信息的人都比较“单纯”几乎没有安全问题;但随着互联网的快速发展,整个互联网中涌入了大量的用户,正所谓林子大了什么鸟都有,随之而来的就是数据的安全性得不到保障;所以就有了对数据的加密及解密。
安全的目标
信息加密的目的是为了确保所传输的信息具备保密性,不被其余人所劫持后篡改信息;若是被篡改后接收方也应该能知道,并且也应该确保没被劫持的信息接收方能够读取。
加密算法
加密在很早以前就已经存在。远在计算机还没问世以前世界上就已经出现了,例如中国古代的虎符和信牌,或者矾书等。到如今为止密码或加密技术已经普遍应用在生活中的各类场景中,尤为是在这个互联网时代中加密技术更是发展到了极致
html
对称加密
通讯双方使用同一个密钥对明文进行加密和解密。这样就确保了就算是通讯的信息被第三方知道,因为没有密钥也不能解密被加密的信息;这种加密方法确保了数据的安全性,但使用的密钥必须由安全的方式在两方之间传输。
公钥加密
公钥加密也称非对称加密,密钥分为私钥和公钥。其中公钥是从私钥中提取的。并且加密解密的方式是:公钥加密必须用与之对应的私钥来解密,反之亦然;
通常私钥只有加密者自己具备,对应的公钥全部人均可以获得。公钥加密主要能够实现对身份的验证。例如,A用私钥加密一个文件要送给B,B接受到后只有用与A的私钥相对于的公钥解密,若是能解密则说明这个文件是A发送的。
单向加密
单向加密的特色是只能加密不能解密。并且这种加密算术也称为hash散列函数,这种算法会把不一样长度的数据压缩成固定长度的一段字符。
这种加密方法通常用来验证数据的完整性。发送方用单向加密加密数据后会获得一个特征码,接收方收到数据后也用一样的算法加密数据也获得一个特征码。把这两个特征码做比较若是相同则说明数据没有被改动过。
转自【IT精英团】:http://www.itnpc.com/news/web/145238462635582.html web
加密算法和协议:算法
对称加密:数据加密(保密性),(3DES,AES)数据库
公钥加密:身份认证、密钥交换、数据加密(不经常使用,比对称加密要慢3个数量级),(RSA,DSA)安全
单向加密:数据完整性,(MD5, SHA1, ...)服务器
密钥交换: RSA,DH(迪菲-赫尔曼),ECDH(椭圆曲线DH),ECDHE(临时椭圆曲线DH)session
SSL/TLSdom
SSL: 安全套接字层(ssl 1.0, ssl 2.0, ssl 3.0)ide
TLS:传输层安全 (tls 1.0, tls 1.1, tls 1.2, tls 1.3)函数
开始加密通讯以前,客户端和服务器首先必须创建链接和交换参数,这个过程叫作握手(handshake)。
假定客户端叫作爱丽丝,服务器叫作鲍勃,整个握手过程能够用下图说明(点击看大图)。
握手阶段分红五步。
第一步,爱丽丝给出协议版本号、一个客户端生成的随机数(Client random),以及客户端支持的加密方法。
第二步,鲍勃确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数(Server random)。
第三步,爱丽丝确认数字证书有效,而后生成一个新的随机数(Premaster secret),并使用数字证书中的公钥,加密这个随机数,发给鲍勃。
第四步,鲍勃使用本身的私钥,获取爱丽丝发来的随机数(即Premaster secret)。
第五步,爱丽丝和鲍勃根据约定的加密方法,使用前面的三个随机数,生成"对话密钥"(session key),用来加密接下来的整个对话过程。
SSL Handshake Protocol:
第一阶段:ClientHello:
支持的协议版本,好比tls 1.2;
客户端生成一个随机数,稍后用户生成“会话密钥”
支持的加密算法,好比AES、3DES、RSA;
支持的压缩算法;
第二阶段:ServerHello
确认使用的加密通讯协议版本,好比tls 1.2;
服务器端生成一个随机数,稍后用于生成“会话密钥”
确认使用的加密方法;
服务器证书;
第三阶段:验正服务器证书,在确认无误后取出其公钥;(发证机构、证书完整性、证书持有者、证书有效期、吊销列表)
发送如下信息给服务器端:
一个随机数;
编码变动通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
客户端握手结束通知;
第四阶段:收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话全部到的“会话密钥”;
向客户端发送以下信息:
编码变动通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
服务端握手结束通知;
Linux系统上的随机数生成器:
/dev/random:仅从熵池返回随机数;随机数用尽,阻塞;
/dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞;
伪随机数不安全;
熵池中随机数的来源:
硬盘IO中断时间间隔;
键盘IO中断时间间隔;
PKI是Public KeyInfrastructure的首字母缩写,翻译过来就是公钥基础设施;PKI是一种遵循标准的利用公钥加密技术为电子商务的开展提供一套安全基础平台的技术和规范。
PKI:公钥基础设施
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书存取库
CA是PKI的核心,负责管理PKI结构下的全部用户的证书。通讯双方认证对方身份必需要经过CA。
经常使用的证书格式是 x509 格式,它包含有下面的信息:
版本号(version)
序列号(serial number),CA 用于惟一标志此证书
签名算法标志(signatur algotithm ientifier)
发行者的名称,即 CA 本身的名称
有效期,起始日期和终止日期
主体本身的公钥
发行商的惟一标识
整数主题的惟一标志
扩展信息
签名:CA 对此证书的数字签名
ssl组件:
libcrypto, libssl主要由开发者使用;
openssl:多用途命令行工具;
openssl:
从多子命令,分为三类:
标准命令
消息摘要命令(dgst子命令)
加密命令(enc子命令)
标准命令: enc, ca, req, genrsa, ...
对称加密:
工具:openssl enc, gpg
支持的算法:3des, aes, blowfish, towfish
enc命令:
加密:~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
解密:~]# openssl enc -d -des3 -a -salt -out fstab -in fstab.ciphertext
单向加密:
工具:openssl dgst, md5sum, sha1sum, sha224sum, ...
dgst命令:
~]# openssl dgst -md5 /PATH/TO/SOMEFILE
生成用户密码:
工具:passwd, openssl passwd
openssl passwd -1 -salt SALT
生成随机数:
工具:openssl rand
~]# openssl rand -hex NUM
~]# openssl rand -base NUM
公钥加密:
加密解密:
算法:RSA,ELGamal
工具:openssl rsautl, gpg
数字签名:
算法:RSA, DSA, ELGamal
工具:
密钥交换:
算法:DH
生成私钥:
~]# (umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)
提出公钥:
~]# openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
创建私有CA:
openssl命令:
配置文件:/etc/pki/tls/openssl.cnf
构建私有CA:
在肯定配置为CA的服务上生成一个自签证书,并为CA提供所须要的目录及文件便可;
步骤:
(1) 生成私钥;
~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
(2) 生成自签证书;
~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
-new:生成新证书签署请求;
-x509:生成自签格式证书,专用于建立私有CA时;
-key:生成请求时用到的私有文件路径;
-out:生成的请求文件路径;若是自签操做将直接生成签署过的证书;
-days:证书的有效时长,单位是day;
(3) 为CA提供所需的目录及文件;
~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
~]# touch /etc/pki/CA/{serial,index.txt}
~]# echo 01 > /etc/pki/CA/serial
要用到证书进行安全通讯的服务器,须要向CA请求签署证书:
步骤:(以httpd为例)
(1) 用到证书的主机生成私钥;
~]# mkdir /etc/httpd/ssl
~]# cd /etc/httpd/ssl
~]# (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 -days 365
(3) 将请求经过可靠方式发送给CA主机;
(4) 在CA主机上签署证书;
~]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
查看证书中的信息:
~]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
吊销证书:
步骤:
(1) 客户端获取要吊销的证书的serial(在使用证书的主机执行):
~]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
(2) CA主机吊销证书
先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致;
吊销:
# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
其中的SERIAL要换成证书真正的序列号;
(3) 生成吊销证书的吊销编号(第一次吊销证书时执行)
# echo 01 > /etc/pki/CA/crlnumber
(4) 更新证书吊销列表
# openssl ca -gencrl -out thisca.crl
查看crl文件:
# openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text