1、为什么网站要使用安全证书
我们所处的网络环境是复杂多样的,大致分为两类,一类是可信的网络服务商,比如直接连的电信运营商的网络,网线,4G,5G;另一类是不可信的网络,比如WIFI,局域网路由器,网吧,或者使用了网络代理等等,你的数据经过了一个不可控的网络中间节点,而它是可以看到你的所有数据信息,比如网吧网管品行不正,或者你在路边连的免费WIFI设备有恶意程序或中了木马,如果你输了什么用户名密码,如果是HTTP协议,那大概率是会被收集到,因为HTTP是明文传输的。
2、SSL(Secure Socket Layer 安全套接层)
是基于HTTPS下的一个协议加密层,最初是由网景公司(Netscape)研发,后被IETF(The Internet Engineering Task Force - 互联网工程任务组)标准化后写入(RFCRequest For Comments 请求注释),RFC里包含了很多互联网技术的规范!
起初是因为HTTP在传输数据时使用的是明文(虽然说POST提交的数据时放在报体里看不到的,但是还是可以通过抓包工具窃取到)是不安全的,为了解决这一隐患网景公司推出了SSL安全套接字协议层,SSL是介于HTTP和TCP之间的一个协议层,是基于HTTP标准并对TCP传输数据时进行加密,所以HPPTS是HTTP+SSL+TCP的简称。
3、TLS(Transport Layer Security 安全传输层协议)
由于HTTPS的推出受到了很多人的欢迎,在SSL更新到3.0时,IETF对SSL3.0进行了标准化,并添加了少数机制(但是几乎和SSL3.0无差异),标准化后的IETF更名为TLS1.0(Transport Layer Security 安全传输层协议),可以说TLS就是SSL的新版本3.1,并同时发布“RFC2246-TLS加密协议详解”,如果想更深层次的了解TLS的工作原理可以去RFC的官方网站:www.rfc-editor.org,搜索RFC2246即可找到RFC文档!
SSL 是指安全套接字层,简而言之,它是一项标准技术,可确保互联网连接安全,保护两个系统之间发送的任何敏感数据,防止网络犯罪分子读取和修改任何传输信息,包括个人资料。两个系统可能是指服务器和客户端(例如,浏览器和购物网站),或两个服务器之间(例如,含个人身份信息或工资单信息的应用程序)。
4、非对称加密
所谓非对称加密,是指一方使用密钥A加密,另一方却能使用密钥B解密。典型的就是公钥私钥系统。公钥加密的数据可以用私钥解密,私钥加密的数据可以用公钥解密,但是公钥加密的数据不能用公钥解密,私钥加密的数据不能用私钥解密。
公钥是给别人的,私钥是自己留着。比如,甲要给乙传输加密信息,那么甲要先拿到乙的公钥,使用此公钥对数据加密传输到乙,乙使用私钥来解密;同样的,如果乙要回复加密信息给甲,也要先拿到甲的公钥才行,因为如果乙使用的自己的私钥来加密,而此私钥对应的公钥是公开的,所以数据毫无保密可言。
常用的算法:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)。
5、对称加密
使用同一个密钥,加上一对加密解密算法即可。
常用的算法:DES、3DES、AES、Blowfish、IDEA、RC5、RC6
6、HTTPS运行过程
6.1、服务端准备证书
网站运营方去认证机构申请下载证书,里面包含pem文件和key文件,其中pem文件内容就是CERTIFICATE证书,或者称为公钥;key文件内容就是RSA PRIVATE KEY密钥。在nginx中配置上证书的路径,同时将http的请求重定向到https,即将80端口的重定向到https。
当然,也可以自己使用 openssl 程序生成证书和密钥,通过浏览器访问网站的时候会提示“你的连接不是私密连接”,因为浏览器找不到证书的认证机构,但是还是可以继续访问网站。
如果在图中步骤1被中间人拦截了,他给客户端发了自己的公钥证书,那么客户端的请求就相对于被拦截了,所以,客户端一定要验证是否是权威机构办法的证书,已经验证完全通过。
6.2、客户端发起 HTTPS 请求
用户在浏览器里输入一个 https 网址,然后连接到 server 的 443 端口。
6.3、传送证书
这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
6.4、客户端解析证书
这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。
地址栏中https左边点击按钮就能看到证书详情。
如果证书没有问题,那么就生成一个随机值,此随机数其实就是AES密钥,AES是对称加密算法,后面的数据通讯就是使用AES和这个密钥来加密解密的。
使用证书对该随机值进行加密。
6.5、客户端传送数据
客户端使用AES算法对要传递的数据进行加密得到密文,然后使用RSA公钥对AES密钥和密文进行加密。
6.6、服务端返回数据
服务端收到数据后使用RSA私钥解密,得到AES密钥和密文,然后使用AES算法解密数据,得到明文。
服务端将要返回的数据使用AES加密。
7、RSA加密算法
RSA是一种著名的非对称加密解密算法,包括公钥和私钥,公钥用来加密,私钥用来解密,私钥是保存在服务器上的。
RSA加密解密的速度较慢,因此不会用他来加密数据量大的场景。在https过程中也仅仅用来加密AES的密钥。
RSA签名:首先使用哈希算法,比如sha256,对消息字符串进行哈希运算得到长度较短且固定的字符串,使用RSA私钥对此字符串加密,得到签名字符串,将其附加在消息字符串的合适位置后,一并发送。接收方使用对应的公钥对签名字符串解密得到哈希值,同时对原始消息再计算哈希值,二者相比较,假如两者相符的话,则认为发信人持有正确的私钥,并且这个消息在传播路径上没有被篡改过。
签名是用来确定私钥的持有者身份以及判断内容是否被中间人篡改。比如在支付宝的支付签名中,就用到了两对公钥私钥,客户持有自己的私钥和支付宝的公钥,支付宝持有自己的私钥和客户的公钥,双方相互签名和验签。
8、RSA算法原理
RSA是一种非对称加密算法,是由Rivest、Shamir、Adleman三位数学家的缩写,RSA是目前最有影响力和最常用的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。
今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战和质疑。目前1024位和2048位的长度基本上够用了。
RSA算法基于一个十分简单的数论事实:将两个大质数(质数又称素数,就是除了1和本身以外,不会再有别的因数)相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为公钥。
8.1、公钥私钥生成过程
-
随意选择两个大的质数p和q,p不等于q,计算
n = p * q
,这两个数是通过伪随机数生成器生成的。伪随机数生成器不能直接生成质数,它是通过不断的重试得到的。n 转换成二进制后的长度,就是密钥长度,比如 1024bit, 2048bit。
-
令
m = (p-1) * (q-1)
-
随机选择一个小的奇数 e,要求 e与 m 互质,并且 e 小于 m ,比如 e = 65537
-
接下来计算 d :
(d * e) % m = 1
,这里 d 和 e 是模乘法逆元的关系。可以利用欧几里德算法来计算模乘法逆元。 -
(n,e)
为公钥,(n,d)
为私钥。
8.2、RSA加密解密
密文 = (明文^e) % n
明文 = (密文^d) % n
8.3、模幂运算
形如 c = (a^b) % p
,其中 a, b, p 均为整形。
想要计算出结果,先要解决几个问题,首先a , b, p 可能是非常大的整数,会导致内存溢出,该如何声明。其次就是 a 与 b 的幂运算,如果参数太大也无法直接运算。
对于大整数,比如 9999...999
,有100个9,可以使用数组来存储每一个数字,[9, 9, 9,...]
对于幂运算,可以拆解,a^1234 = a^1000 * a^200 * a^30 * a^4
,实际会将指数部分表示成二进制的形式
对于模运算,可以根据公式,(a * b) % p = (a % p) * (b % p) % p
,证明如下:
假设:
a = Ap +B;b = Cp + D
其中 A,B,C,D 是任意常数,那么:
ab = ACp^2 + ADp + BCk +BD
ab % p = BD % p
又因为:
a % p = B;b % p = D
所以:
(a % p)(b % p) % p = BD % p