路漫漫其修远兮
吾将上下而求索

openssl加密原理

先来张图镇楼

image.png

下面的部分是关于 Linux Services and Security

1、小知识点

a. 不同主机间要用套接字进行通信,即某个主机上的端口与另外一个主机的端口进行通信:sip:port—–cip:port

b. 通信前客户端必须知道对方也就是服务端的ip和端口,不然无法通信。也就是服务器端某些应用应该要设置一个默认的端口,服务端的ip由dns来将域名解析为ip;而国际上将常用的服务都规定有默认的端口,即如果要访问httpd服务,则服务端一定监听在80端口,如果访问https服务,服务端一定监听在443端口,这样客户端就可以使用一个高位的随机端口,只需要知道某公司的域名,就可以与其对应的服务器进行通信,而且服务器要保持监听模式,随时接收客户端的请求

        比如:cip:55679(随机端口)—–sip:80(固定端口,web服务)

d. httpd服务本身没有加密功能,以明文的形式在网络上传播

e. SSL:Secure Socket Layer(处于应用层和运输层(4层)之间的新添加的层,应用可以选择通过ssl加密,也可以不选用ssl加密,直接传送)

f. http–>ssl–>https

2012100609461432.png

2、安全的目标

a. 保密性:confidentiality

        威胁:窃听,通信量分析:保证整个数据报文是加密的,即使其他人拿到数据也不能解密

b. 完整性:integrity

        威胁:更改,伪造,重放,否认:保证传输的文件的完整性,不能被篡改。保证这个文件就是对方发的,而不是其他人伪造的

c. 可用性:availability

        威胁:拒绝服务(Dos)

d. 解决方法:技术(加密和解密)、服务(用于抵御攻击的服务,为上述安全特定设计的安全服务)

3、加密和解密

1、传统加密方法:替代加密算法,置换加密方法

2、现代加密方法:现代块加密方法,切割成多个块,每个块单独加密

3、秘钥算法和协议:

        对称加密

        公钥加密

        单向加密

        认证协议

4、对称加密:加密和解密使用同一个秘钥

        DES:date encryption standard  数据加密标准,已经不安全了

        3DES:triple  DES  

        AES:advanced encryption standard  高级加密算法(128bits, 192bits,256bits, 384bits),2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一

        特性:

                加密解密都是用同一个秘钥

                将原始数据分割成固定大小块,逐个加密

        缺陷:

                秘钥过多(如果使用此加密方法在用户和服务端通信,服务器1000个用户,就要在服务器端保存1000个秘钥,每个用户都不一样,不现实)

                秘钥分发困难

5、单向加密:提取数据指纹,只能加密,不能解密

        特性:定长输出:无论原始数据多大,结果大小都相同

                雪崩效应:输入一点改变,将会引起结果的巨大改变

                输入一样:输出必然相同

                不可逆:无法根据特征码还原原始数据

        功能:检查数据完整性,接收方收到数据再进行转换,比较特征码,就可以知道是否文件被改。因为都是明文,中间人也可以截取数据,更改,重新计算特征码,再发送,也会造成篡改,可以将特征码单独加密,密码只有双方有,才能保证数据的完整性

        算法:

                md5:message digest 5, 128bits

                sha1:secure hash algorithm 1, 160bits

                sha224,  sha256,  sha384,  sha512

6、公钥加密:秘钥分为公钥和私钥,假如创建一个公钥(a)和私钥(b)

        公钥:(从私钥中提取产生)公开给所有人

        私钥:自己留存,通过公钥加密解密工具创建,必须保存其私密性,不能让其他人看到

        特点:用公钥(a)加密的数据,只能使用与之配对的私钥(b)解密,反之,用私钥(b)加密的数据,只能使用与之对应的公钥(a)来解密

        RSA:加密算法是一种非对称加密算法

        用途:

                数字签名:让接收方确认发送方的身份

                秘钥交换:发送方用对方的公钥加密一个对称秘钥,并发送给对方

                数据加密:(不常用,比对称加密要慢3个数量级)

        由此可得出:如果bob生成了一个公私钥对,将公钥发送给大家,大家都知道bob的公钥,并且bob的私钥只有自己保存,没有丢失。

        一个公理:如果某一个文件能用bob的公钥解开,则这个文件一定是bob的,这里假定已经证明这个公钥就是bob的

        一个公理:每一个人都可以使用bob的公钥加密某个文件,加密后的这个文件只有bob自己能够解密,即使这个文件被公开,大家都不能解密,这里假定已经证明这个公钥就是bob的

4、模拟通信过程

image.png

假设bob和alice进行通信,为了不被别人偷听,可以这样操作:前提是bob和alice都有对方的公钥信息,这种方法是只用传输一次报文就可以将上面的所有问题都解决,当然也可以通信好几次,交互对称秘钥等操作。如上图

1、alice将要发送的数据通过单向加密生成数据的特征码

2、alice用自己的私钥加密特征码,将加密的特征码附到数据的后面

3、alice用临时生成的对称秘钥加密前面的数据部分(为什么不直接用bob的公钥加密前面的全部数据,因为公钥解密耗时太多,一般用对称秘钥加密数据,只用公钥加密对称秘钥,提高速度)

4、alice用bob的公钥加密临时秘钥,附加在数据后面

5、bob收到数据,要证明信息来自Alice,保密性,完整性

6、bob先用自己的私钥解密临时对称秘钥

7、bob用临时对称秘钥解密前面的数据部分,(保密性)

8、用alice的公钥解密数据的特征码,如果能解密,证明是alice的文件(身份验证)。用单向加密生成数据的特征码,与解密的特征码对比,如果相同,解密完成(数据完整性)

pub enc.zip

5、秘钥交换(Internet Key Exchange IKE)

1、Diffie-Hellman协议:实用的在非保护信道中创建共享密钥方法,维基百科

当双方第一次在互联网上通信,没有对方的公钥,如何在不安全的通道上面交换加密报文的对称秘钥,这里是一个方法

使用一个质数p的整数模n乘法群以及其原根g。下面展示这个算法,绿色表示非秘密信息, 红色粗体表示秘密信息:

爱丽丝与鲍伯协定使用 p=23以及base g=5.

爱丽丝选择一个秘密整数a=6, 计算A = g^a mod p并将A发送给鲍伯:A = 5^6 mod 23 = 8.   同时将pg这三个参数通过互联网发送给鲍伯

鲍伯选择一个秘密整数b=15, 计算B = g^b mod p并发送给爱丽丝:B = 5^15 mod 23 = 19.   B通过互联网发送给爱丽丝

互联网上传输的内容有:pgg^a mod pg^b mod p


爱丽丝计算s = B^a mod p = (g^b mod p )^a mod = g^ab mod p19^6 mod 23 = 2.

鲍伯计算s = A^b mod = (g^a mod )^b mod = g^ab mod p8^15 mod 23 = 2.

爱丽丝和鲍伯最终都得到了同样的值,因为在模p下g^{ab}和g^{ba} 相等。 注意a, b 和 gab = gba mod p 是秘密的。 其他所有的值 – p, g, ga mod p, 以及 gb mod p – 都可以在公共信道上传递。 一旦爱丽丝和鲍伯得出了公共秘密,他们就可以把它用作对称密钥,以进行双方的加密通讯,因为这个密钥只有他们才能得到。 当然,为了使这个例子变得安全,必须使用非常大的a, b 以及 p, 否则可以实验所有g^{ab}mod 23 g^{ab} mod{23}的可能取值(总共有最多22个这样的值, 就算a和b很大也无济于事)。 如果 p 是一个至少 300 位的质数,并且a和b至少有100位长, 那么即使使用全人类所有的计算资源和当今最好的算法也不可能从g, p和ga mod p 中计算出 a

6、PKI:public key infrastructure,公钥基础设施

包含:数字证书认证机构(CA):将用户的个人身份跟公开密钥链接在一起。对每个证书中心用户的身份必须是唯一的

注册机构(RA):PKI的确定链接关系的这一角色称为注册管理中心

证书吊销列表:CRL

证书存取库:

1、X509v3:定义了证书的结构以及认证协议标准,X.509证书的结构如下:

字段 描述
version(证书版本) 当前证书的X.509标准的版本。v1=>1, v2=>2, v3=>3
Serial Number(证书序列号) Serial Number是由CA分配的在该CA下保证唯一的序列号。CA对这个字段保有所有的控制权。所以可以填写任何东西。
Algorithm Identifier Algorithm Identifier是跟协议标准命名不同的一个字段。在X.509协议中,这个字段叫做Signature。事实上,这个字段跟签名并没有什么关系。相反,这个字段包括了hash算法和位数,所以感觉叫Algorithm Identifier更为合适一些。
Issuer(证书颁发者) Issuer字段指明了是由哪个CA签发的该证书。
Period of Validity(有效期) 该字段记录了证书的有效期(从xx年xx月xx日 – xx年xx月xx日)
Subject(证书所有者) 该字段记录了保存证书私钥的主体是谁
Subject's Public Key(证书公钥及对应算法) 该字段包含了主体私钥对应的公钥。以及对应的密钥交换算法和算法的算子大小,比如如果是RSA,那么会标明RSA密钥的长度(2048比如)。
Issuer Unique Identifier 这个字段是可选的,是由X.509v2版本加入的字段。允许2个不同的签发者用同一个唯一名(distinguished name)
Subject Unique Identifier 该字段也是一个可选字段,也是由X.509v2版本加入的。它允许2个不同的主体拥有相同的唯一名(distinguished name)
extensions 该字段由X.509v3版本加入。是扩展字段。签发者(CA)可以添加他们自定义的信息到证书里。
Signature(证书签名及对应算法) 最后一个字段。表示该公钥证书的签名(指纹),将前面的所有数据进行单向加密生成指纹信息,再用自己的私钥加密指纹信息附加在后

证书的作用:证明这个公钥是真正的a.com的而不是其他人冒充的

用自己的理解简单描述:假如你有一个网站:http://andblog.cn

1、目的:为了能使得用户和你的网站之间的通信是加密安全的,并且要证明用户访问的服务器就是你的服务器,而不是别人冒充的服务器(有可能DNS劫持,返回给用户的不是真正andblog.cn域名对应服务器的IP地址),

2、假如使用对称秘钥进行加密信息,则每个用户与服务器之间要单独使用一个对称秘钥进行通信,(使用DH算法交互秘钥),那么如果有1000个用户和服务器进行通信,则有1000个秘钥需要保存,不方便,且无法验证服务器的真实性

3、根据已有的加密体系,可以这样做,首先服务器生成一对公私钥对,私钥自己保存,并注意保密。

        1)如果某个用户来网站进行访问,则将生成的公钥发送给用户,

        2)用户在本地随机生成一个对称秘钥,并且用服务器发过来的公钥将对称秘钥进行加密,返回给服务器。实际应用中,因为不对称加密算法效率比较低,通常,通信双方会使用该加密算法沟通,交换一个随机生成的对称加密算法的密钥,在之后的通信中,都使用效率更快的对称加密算法进行。因为是用服务器的公钥加密的对称秘钥,即使其他人拿到这个信息,因为没有服务器的私钥,也不能解密里面的对称秘钥信息

        3)服务器收到用公钥加密的信息后,用自己的私钥将其解密,取出里面的对称秘钥

        4)然后服务器和客户端就用这个临时生成的对称秘钥进行通信, 通信结束后,就可以这个对称秘钥丢弃,下次通信的时候重新生成一个临时对称秘钥

        5)每个用户都可以使用上面的方法生成随机对称秘钥与服务器进行通信,解决了通信过程加密的问题

        6)这里就出现一个问题,如果证明用户收到的这个公钥就是真正服务器发送过来的,而不是冒充服务器发送过来的,因为如果是冒充服务器发送过来的公钥,上面的操作一样可以正常进行

        7)这里用到了第三方机构,前提是这个第三方机构(CA)是个有公信力的机构,就是说他说的话大家都相信是真的,这个是基础

        8)可以这样做,第三方机构(CA)也生成了一对公私钥对,私钥第三方机构自己保存,这个是高度机密的东西,如果这个私钥泄露了,这个机构就破产了,然后生成CA的自签证书,即第三方机构将(自己的公司名,域名,公钥,有效期等信息)进行单向加密,将单向加密后的指纹信息用自己的私钥进行加密,将加密后的信息附加在这些信息后面,这就是一个自签证书(自己的公司名,域名,公钥,有效期等信息,指纹信息,用自己私钥加密后的指纹信息),这些自签证书就是根证书,安装系统的时候自带在系统里面,这些根证书的作用是为了验证在自己公司签署的域名是合法的

        9)服务器的管理者为了能让用户确定发送给用户的公钥就是自己发送的,而不是冒充的,可以将这个公钥发送给上面的CA,CA会人工查询你的公司是否是你的,andyblog域名是否是你的,这个公钥是否是你的,查询验证正确后,将(andyblog的公司名,andyblog域名,andyblog的公钥,有效期等信息)进行单向加密,并用CA的私钥将这个单向加密后的指纹信息进行加密,附加在后面,这个就是你签署的证书(andyblog的公司名,andyblog域名,andyblog的公钥,有效期等信息,指纹信息,CA用私钥对指纹信息加密后的结果)

        10)当用户访问服务器的时候,服务器将签署的证书发送给用户,用户首先用系统自带的CA证书的公钥解密证书的指纹信息,如果能够解密成功,证明这个证书是这家CA颁发的,信任这家CA,就信任这个证书里面的内容。然后重新将证书里面的信息单向加密生成指纹信息,比对CA解密后的指纹信息,如果正确,表明证书的完整性,证明证书里面的公钥信息就是证书里面的域名的公钥。验证证书是否在有效期内,到这里证书的作用就完成了:身份证明,完整性证明

        11)用户使用证书里面的公钥将随机的对称秘钥进行加密,并且比对浏览器里面的域名是否与证书里面的域名相同,与服务器进行通信

        12)如果再次出现DNS劫持,导致访问的假站点,即使这个站点也有公私钥,但是没有被CA所接受认证,浏览器发现证书有问题,会警告用户访问的是假站点。即使服务器的IP换了,只要服务器上面的私钥更新到了新的IP的服务器上面,并且签名的证书也在新的IP的服务器上面,上面的通信过程依然成立,这里的认证与服务器的IP没有关系,谁有证书,及对用私钥,谁就是真正的服务端

        12)如果服务器被黑客攻击,导致服务器的私钥丢失,这样黑客有可能获取通信的对称秘钥,这时要向CA发送通知,吊销这个证书,重新签署。如果CA自己的私钥丢失了,嘿嘿嘿

4、证书编码

最常见到的有2类编码:

PEM – Privacy Enhanced Mail,打开文本格式是以: " BEGIN…"开头,以" END…"结尾,内容是base64编码。 如果想查看pem格式证书的信息的话,可以用openssl x509 -in cert.pem -text -noout

DER – Distinguished Encoding Rules, 打开看是二进制格式,不可读。 如果想查看DER格式证书的信息,可以用: openssl x509 -i n cert.der -inform der -text -noout

未经允许不得转载:江哥架构师笔记 » openssl加密原理

分享到:更多 ()

评论 抢沙发

评论前必须登录!