openssl 详解

//如果需要帮助共同学习,可添加微信号:sandyAndroid,添加时请备注来源和请求信息,也可以入全栈新QQ群1009769932

 

openssl 是网络通信的基石和安全保证,没有openssl,可以说我们的网络传输的信息都是明文,裸奔数据,对安全性大打折扣。下面我们先熟悉几个名词:

一: 概念

1. SSL

SSL的全名叫做secure socket layer(安全套接字层),最开始是由一家叫网景的互联网公司开发出来,主要是防止信息在互联网上传输的时候不被窃听或者篡改,后来网景公司提交SSL给ISOC组织做标准化,改名为TLS。

数据如何被窃取:很简单,如果你上网通过wifi,那么你的数据一定会经过路由器, 通过对路由器做一些处理就可以很容易拿到这些路由经过的数据。

 2. 非对称加密

首先说下两个名称,公钥和私钥,公钥可以在网络传输,私钥只能保存在本地,可以使用公钥加密信息,也可以使用私钥加密信息。公钥和私钥是可以相互推导的,根据私钥可以很容易的计算出公钥,但是根据公钥却很难拿到私钥(所以安全),在互联网上,私钥一般都是保存在服务器端, 公钥则是由客户端保存使用。

3. 对称加密

对称加密的安全性相比较非对称加密降低很多, 对称加密顾名思义,客户端和服务端都约定使用同一个加解密算法A,客户端使用算法A对传输信息M进行解密成密文, 然后将密文传输到服务端, 服务端使用算法A对密文数据进行解密获取传输信息M,这样服务端就拿到了客户端传输的数据信息,完成一次数据通信。

4. 数字签名

数字签名用的比较多, 一直在做windwos usb生物识别驱动开发, 为了驱动在windows系统上安装并工作正常,需要进行对驱动进行数字签名,我是用过CA证书数字签名,EV证书数字签名,好了扯远了,回到数字签名概念上来。

网络传输报文经过Hash算法生成固定位数的摘要信息1,然后用私钥将摘要加密,和之前的报文一起,发送给接收者,接收者通过公钥将摘要解密出来,同样通过Hash算法加密出报文摘要2,如果摘要1和摘要2一直,说明数据没有被纂改,证明数据是完整的。

因为接收者是使用公钥解密的数据,如果数据完整,证明发送数据的人是持有私钥信息的,就能证明发送者的身份,因此数字签名具有证明发送者身份和防止纂改的功能。

 

5. 数字证书

由CA颁发给网站的身份证书,里面包含了该网站的公钥,有效时间,网站的地址,CA的数字签名等。
所谓的CA数字签名,实际上就是使用了CA的私钥将网站的公钥等信息进行了签名,当客户端请求服务器的时候,网站会把证书发给客户端,客户端首先可以通过CA的数字签名校验CA的身份,也能证明证书的真实完整性(数字签名拥有证明身份和防篡改的功能)。

客户端有没有可能到一个假冒的CA去校验数字证书呢?不太可能,因为CA的地址是内嵌在浏览器中的,很难被篡改。

 

二: SSL如何保护数据

1)认证:认证用户和服务器,确保数据发送到正确的客户端和服务器;

2)防窃取:加密数据以防止数据中途被窃取;

3)防篡改:维护数据的完整性,确保数据在传输途中不被篡改。

 

1. 如何认证

SSL硬性规定:一旦客户端向服务端发送了请求,服务端必须返回他的数字证书。

问题探讨1:当我们访问百度的时候, 我们怎么确定我们访问的服务器是真百度还是假百度?会不会我们的请求信息被截取,然后路由到一台伪造的服务器呢?

解答:刚刚说了,SSL通信时,服务器会返回数字证书,我们可以根据证书里面的数字签名,校验证书的合法性。

问题探讨2:以上只能说明证书时百度的,证书时合法的,但是伪造的服务器也有百度的证书,我们还是跑到伪造的服务器上去了,所有返回了证书不能证明服务器就是百度的?

解答:证书中会有百度服务器的公钥信息, 在之后的通信中,客户端都会使用这个公钥去加密数据发送到服务器,服务器必须使用私钥才能解除真实的传输数据,伪造的服务器一定没有百度服务器的私钥,所以请求证书这一步也是没有用的,他的后续请求的数据伪造的服务器也是拿不到,这样伪造的意义也就失去了

这样就解决了服务器认证的问题了。

2:如何防窃取

客户端第一次给服务器发送请求的时候(拿到证书前的一次),会在请求里面放一个随机数C1,服务器在返回证书的响应里也会带一个随机数F,客户端拿到证书后,会使用公钥加密一个随机数C2送给服务器,这样客户端、服务器都拥有了三个随机数:C1、F、C2,双方使用这些随机数和一个相同的算法生成一个对称密钥,之后所有的通信都使用这个对称密钥来进行。
这个密钥会不会被泄露呢?不会,因为密钥是由3个随机数产生的,对于第一个随机数C1,他可能会被中间人监听到,然后第二个随机数F,也可能会被中间人监听到,但是第三个随机数C2,因为是用公钥加密的,除非中间人有私钥,否则是不可能解出来的。
为什么要生成一个对称密钥来进行数据通信呢?因为非对称加密在解密的时候相当耗费性能,换成对称密钥后,会好很多。

 

3:如何防篡改

这个主要是针对服务器发送数字证书这一过程来说的,服务器的数字证书中含有ca数字签名,可以很有效的保证证书的真实性和完整性(没有被篡改)

 

三:Openssl 是啥

HTTPs 就是HTTP on SSL,通过证书+非对称加密算法来解决网站访问的安全性问题。

SSL交互过程还是很复杂的,牵扯到非对称加密和对称加密,以及复杂的交互过程,为此有人写了openssl库,这个库的使用非常广泛,本文就是阐明如何安装和基本使用这个库的。
有了这openssl库,就可以直接写和HTTPS的交互的代码了。

openssl可以实现:秘钥证书管理、对称加密和非对称加密

openssl: 多用途的命令行工具,包openssl,可以执行交互或批量命令。
libcrypto: 加密算法库,包openssl-libs。
libssl:加密模块应用库,实现了ssl及tls,包nss。

1. 加密命令:

工具: openssl enc, gpg
算法: 3des, aes, blowfish, twofish、3des等。
常用选项有:
-in filename:指定要加密的文件存放路径
-out filename:指定加密后的文件存放路径
-salt:自动插入一个随机数作为文件内容加密,默认选项 加点盐:)
-e:加密;
-d:解密,解密时也可以指定算法,若不指定则使用默认算法,但一定要与加密时的算法一致
-a/-base64:当进行加解密时,他只对数据进行运算,有时需要进行base64转换,设置
此选项后加密结果进行base64编码,解密前先进行base64编码。
加密解密算法可以通过自己制定,有什么算法可以通过openssl help enc去查看加密内容。
enc命令:
帮助: man enc
加密:
openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher
解密:
openssl enc -d -des3 -a -salt –in testfile.cipher -out testfile
openssl ?
 

1.1 对称加密算法

OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。

1.2 非对称加密算法

OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。

1.3 摘要命令

OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA算法事实上包括了SHA和SHA1两种信息摘要算法,此外,OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1。

摘要一般有两个作用:1)做信息完整性校验;2)保存密码,有些密码是直接在数据库中采用MD5(真实密码值)保存的,有的还进行加盐处理,使其难以破解,这样密码只能重置,无法告诉你原始过程,因为摘要是不可逆的。

 openssl dgst
常用选项有:
[-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] :指定一种摘要算法
-out filename:将摘要的内容保存到指定文件中
dgst命令:
帮助: man dgst
openssl dgst -md5 [-hex默认16进制] /PATH/SOMEFILE
openssl dgst -md5 testfile
md5sum /PATH/TO/SOMEFILE
MAC: Message Authentication Code,单向加密的一种延伸应用,用于实现网络通
信中保证所传输数据的完整性机制
CBC-MAC
HMAC:使用md5或sha1算法

如:对文件123进行求md5摘要 : openssl dgst -md5 123

1.4 生成密码和base64等

生成密码需要使用的标准命令为 passwd ,用法如下:

openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}
常用选项有:

-1:使用md5加密算法
-salt string:加入随机数,最多8位随机数
-in file:对输入的文件内容进行加密
-stdion:对标准输入的内容进行加密

如: openssl passwd -1 -in sslcon.c -salt 1122334455

1.5 生成随机数

在SSL交互过程中,需要生成随机数

 生成随机数需要用到的标准命令为 rand ,用法如下:
openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num
常用选项有:
-out file:将生成的随机数保存至指定文件中
-base64:使用base64 编码格式
-hex:使用16进制编码格式

如:openssl rand -hex 1122334455

     openssl rand -base64 1122334455

 

1.6 生成密钥对

首先需要先使用 genrsa 标准命令生成私钥,然后再使用 rsa 标准命令从私钥中提取公钥。
genrsa 的用法如下:

openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits]
常用选项:
-out filename:将生成的私钥保存至指定的文件中
-des|-des3|-idea:不同的加密算法
numbits:指定生成私钥的大小,默认是2048

一般情况下秘钥文件的权限一定要控制好,只能自己读写,因此可以使用 umask 命令设置生成的私钥权限,

如: (umask 066;openssl gensa -out 123.txt 4096; )

 

ras 的用法如下:

openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg]
       [-sgckey] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] [-engine id]
常用选项:
-in filename:指明私钥文件
-out filename:指明将提取出的公钥保存至指定文件中 
-pubout:根据私钥提取出公钥 

如:openssl rsa -in 123.txt -out 456.pub -pubout

 

1.7 创建证书

使用openssl工具创建CA证书和申请证书时,需要先查看配置文件,因为配置文件中对证书的名称和存放位置等相关信息都做了定义,具体可参考 /etc/pki/tls/openssl.cnf 文件。

生成证书

颁发证书

吊销证书

参考:https://www.jianshu.com/p/fb2ae3dc7986

以前对密码学这块关注不多, 后期努力学习学习

 

你可能感兴趣的:(C++,openssl)