SSL和TLS
了解openssl之前,我们首先要了解SSLTLS是什么。
SSL(Secure Sockets Layer)是一个协议,叫作安全套接层协议。旨在为应用层数据提供加密的传输层通道。,即数据从应用层去往传输层,会首先被ssl给加密。
但是随着时间的发展,SSL的继任者TLS(Transport Layer Security)传输层安全协议被引入,为网络连接提供了更高级的安全性,TLS提供更多的加密算法和选择,所以开始逐渐取代了早期的SSL版本。
例如:
在引入SSL和TLS之前,使用HTTP协议的请求和响应是明文的,这意味着数据包在传输过程中容易被第三方窃听、抓取或篡改。引入SSL/TLS之后,当数据从应用层发送至传输层时,它会被SSL或TLS加密。这样,一个安全的通道被建立,确保数据从发送方(一个端)到接收方(另一个端)的整个路径都是加密的,从而实现端到端的安全性。
应用层数据在前往传输层加密的原因;
一直有一个疑问,为什么应用层的数据要在传输层加密,而不是在网络层或者其它层进行加密。刚开始以为应用层数据肯定要从传输层经过,如果在传输层已经被别人捕获了,在下一层加密没意义了。后面才认识到这是有考虑的:
-
在传输层对应用层数据进行加密,具有很强的选择性,因为传输层加密允许为不同的应用选择是否需要加密,可以给指定的应用加密,如果在网络层或者数据链路层,全部都会被加密。
-
传输层加密能保证端到端的安全性,网络层或数据链路层加密可能只会在两个设备或两个网络之间提供加密
-
将数据从传输层加密了,在网络层或数据链路层被捕获了别人耶看不懂。
openssl
OpenSSL是一个开源的工具库和工具集,用于处理SSL和TLS协议以及对数据进行加密和解密的各种操作。
openssl中文网: https://www.openssl.net.cn/
一般我们最常用的工具,就是这个软件包里面提供的一个叫作 openssl 的命令行工具,通过它可以实现一些加密算法,像SSL、TLS等等。
在Linux发行版系统中,一般默认就安装了openssl工具,通过 openssl verson 就可以查看openssl的版本信息。
openssl基础用法
实现对称加密
对称加密就是加密和解密使用的是同一个密钥,是通过将原始数据分割成若干块来逐个进行加密,所以效率高、速度快
openssl enc -e 算法类型 -a -salt -in 需要加密的文件 -out 存放加密生成的结果的文件
例如:
openssl enc -e -des3 -a -salt -in file1 -out file1.cipher
说明:
-
使用 -salt 来加盐(加盐就是在进行哈希加密的时候加上随机字符串)的时候,openssl会自动生成一个随机的盐,并在加密过程中使用它
-
除了 -des3 这种堆成加密类型,还有-des等类型。使用 man openssl enc 可以看到其它的一些加密类型应该使用的对应参数
-
使用 -a 参数可以将加密后的内容通过base64这种彪马格式来显示
实现对称解密
openssl enc -d 算法类型 -a -salt -in 需要解密的文件 -out 解密后的问题
例如:
openssl enc -d -des3 -a -salt -in file1.cipher -out file1_new
说明:
-
算法类型需要和加密时使用的保持一致
-
使用对称加密的时候会要求提示输入密码。因为对称加密算法使用同一个密码进行加密和解密
实现非对称加密
非对称加密的特点是密钥成对出现,加密和解密用的密钥不相同,并且通信双方都需要各自的密钥和私钥
-
如果使用公钥加密、私钥解密。加密的数据只能自己解开,能充分保证数据的安全
-
如果使用私钥加密,公钥解密。这样能确定数据的来源性,这就是我们所说的数字签名
生成私钥:
openssl genrsa -out 存放私钥的文件 使用的加密算法类型
例如:
openssl genrsa -out b.enc
说明:
-
不指定密钥的长度,默认长度就是2048,密钥长度越长,其加密强度就越高,加密何解密时间越长,一般使用默认的就可以了
-
不指定加密算法的类型,默认使用的非对称加密算法是RSA
-
生成的密钥默认是按照 PEM格式 输出,即以base64格式显示文本信息。
生成公钥:
公钥钥是隐藏在私钥内部的,可以通过私钥的到公钥
openssl rsa -in 私钥文件 -pubout -out 提取出来保存的公钥文件
例如:
实现非对称解密
公钥加密:
openssl rsautl -encrypt -pubin -inkey 公钥文件 -in 需要加密的文件 -out 加密后的文件
私钥解密:
openssl rsautl -decrypt -inkey 私钥文件 -in 需要解密的文件 -out 解密后的文件
实现单向哈希
hash是一种单向的加密算法,是不可逆的。使用哈希算法加密出来的结果就叫做摘要,这玩意儿有个特点就是长度固定,内容不同。一旦原数据发生改变,摘要也会随之发生改变,所以一般用来确认数据的完整性,看有没有被人篡改。
在这里有一个叫作指纹的概念,指纹是每个人独一无二的,不同的人(数据)有不同的指纹(摘要),但是只知道了指纹(摘要),也不能知道是谁(不能通过摘要推出原数据)。
openssl dgst 使用的哈希算法 对哪个文件生成摘要
例如:
openssl dgst file1
说明:
-
不指定哈希算法,默认使用的是 SHA256算法,可以使用 man openssl dgst查看对应选项代表的哈希算法
-
不指定显示的类型,默认显示的是十六进制的字符
生成用户密码
可以使用openssl来给用户生成密码,使用 useradd 命令创建用户的时候可以指定用户的密码,但是这个密码必须是加密的密码才行,这个时候就可以使用openssl来生成一个。
其实就是利用哈希算法来给密码生成一个摘要值
openssl passwd 算法类型 用户密码
不指定任何哈希算法选项,那么默认使用的是传统的UNIX crypt() 方法,比 MD5 还老
算法类型说明:
-
-6:表示采用sha512这种加密算,也会默认使用随机的盐
-
-5:sha256算法,也会默认使用随机的盐
-
-1:md5算法,会默认生成一个随机的盐来与密码一起哈希
这三种都是UNIX密码哈希方案的一部分
例如:
useradd bob -m -s /bin/bash -p $(openssl passwd -6 redhat)
使用useradd创建用户的时候,如果没指定相关属性,会默认使用 /etc/default/useradd中定义的属性信息。
生成随机数
openssl rand 显示格式(主要有hex和base64) 输出的随机字节数量
例如:生成16个随机字节并以十六进制格式输出
openssl rand -hex 16
说明: 一个十六机制数由4个二进制数组成,一个字节8位,所以一个十六进制数等于两个字节。总共会输出三十二个字符
例如:以base64编码形式显示随机数
openssl rand -base64 16
base64编码介绍
base64是一种用64个字符来表示任意二进制数据的方法。在一些早期的协议中,例如smtp、http。他们只设计了ASCII字符数据的传输,当需要包含非ASCII字符或者二进制数据时就会出问题,因为虽然二进制数据都是由于0和1组成,但是难点在于如何表示和传输这些0和1。
这个时候使用base64编码完美解决问题,将二进制数据转为一个仅由ASCII字符组成的安全字符串,这样可以避免由于二进制数据的传输而导致的任何解释或传输问题
编码原理
-
先将要三个字节的二进制数据(一共24位),重新分为4组,每组6位。(每6位就可以表示一个值,范围从0到63)
-
然后将每个6位的数据(一个组)转换为十进制数字,然后根据base64的字符集得到相应的字符。
-
再重复这个过程直到所有的输入数据都被处理完
-
如果原始数据(即待编码的数据)的长度不是3个字节的整数倍(base64将每3个字节作为一个单元来处理),会添加填充字符,即=,来使其长度满足要求。这就是看到等号的原因