HTTPS加密手段
对称密钥加密方式
对称密钥加密就是加密密钥和解密密钥使用的是同一个密码,常见的加密方式有 DES,AES 等。
在了解 HTTP 认证方式时候,有一种基于密钥加密的方式是 DIGEST 认证,服务端先向客户端发送需要身份凭据的响应,响应首部携带着加密算法和用于加密的随机字符串nonce
等信息;客户端在收到后,会生成自己的随机字符串cnonce
,并和服务端提供的随机字符串nonce
混合在一起使用算法加密,最后通过响应首部将cnonce
,nonce
以及加密的信息一起发送到服务端验证。
DIGEST 认证实际上就是一种共享密钥的加密认证方式,服务端要把自己的密钥发送给客户端,而客户端也要生成自己的密钥发送到服务端,这样才能完成认证。而在互联网上转发密钥时,如果通信被监听那么密钥就可会落入攻击者之手,同时也就失去了加密的意义。
公开密钥加密方式
公开密钥加密,Public-key cryptography,也称为非对称加密,公开密钥加密方式使用不同的加密密钥和解密密钥,在公开密钥加密方式中,公钥和所有的加密算法都是公开的,只有私钥部分由双方各自保留。
在互联网通信中,任何一方既可以是发送者,也可以是数据的接收者,以 A 为发送者和 B 为接收者为例,公开密钥加密的实现方式如下:
- 接收者 B 利用密钥对产生器产生公开密钥和私钥,公开密钥会发送给 A;
- 发送者 A 使用 B 产生的公钥,使用 hash 算法对数据进行加密,然后发送给接收者 B;
- 接收者 B 收到密文后,使用自己的私钥进行解密。
公钥算法的主要局限在于,这种加密形式的速度相对较低。实际上,通常仅在关键时刻才使用公钥算法,如在实体之间交换对称密钥时。所以主流的一些业务多使用公钥加密和私钥加密结合的方式。
公钥加密算法
常用公钥加密算法有:
- RSA,RSA 算法是由三个 MIT 的老外开发出来,而他们的姓氏手写字母拼在一起就是 RSA 三个大写字母,所以就被称为 RSA 算法。RSA 是使用最广泛的公钥加密算法,特别适用于互联网传输的数据,RSA 算法可以生成一个公钥和私钥,到目前为止使用公钥加密的明文没有任何方法破解,只能使用私钥解密。
- Diffie-Hellman,DH 算法,也是用发明者两个老外的名字中的单词命名的。DH 算法只适用于密钥交换。
- DSA,Digital Signature Algorithm,数字签名算法,DSA 是美国国家安全署发明的算法,仅适用于数字签名。
密码散列函数
密码散列函数,也就是 hash 函数,是一种将源数据压缩成固定长度的新数据的函数。密码散列函数不是一种加密算法,它是有损压缩数据的方法,因此它只在数据验证的方面使用。hash 函数具有以下特点:
- 输入函数的数据可以很长也可以很短,但是输出的散列值都是固定长度的,并且很短;
- 不同的散列值一定对应不同的输入,具有这种性质的散列函数称为单向散列函数;但是不同的输入很有可能得出相同的散列值,这种情况叫做散列碰撞。
在数据传输的过程中先使用散列函数生成散列值然后附在数据后面发送,接收者在收到数据后,也用 hash 函数生成一份散列值,与原数据附着的散列值进行比较来验证数据是否被修改。使用密码散列函数理论上并不能保证数据一定不被修改,因为存在碰撞的可能性,但是要找到碰撞的两个数据得到相同散列值的情况几乎不可能,所以可以基本认为只要散列值相同则验证的数据就相同。
散列函数
- MD5,message digest,报文摘要,MD5 就是 MD 的第五个版本,MD5 函数对输入的 message 会得到固定长度的 128 位的 message digest。在过去的研究过程中发现,要找到一个与原 message 得到相同 message digest 的不同 message 几乎不可能。不过后来中国的王小云教授团队研究发现,能在 15 分钟内找到 MD5 的碰撞值,后来也有其他团队找到 MD5 碰撞值,于是后来 MD5 逐渐被 SHA 算法取代
- SHA,Secure Hash Algorithm,安全的 hash 函数,SHA 已经有 SHA-2 和 SHA-3 等版本,SHA 和 MD5 不同点是生成的散列值是 160 位长度的,所以 SHA 算法比 MD5 要更慢
- MAC,Message Authentication Code,报文鉴别码,是对 hash 函数生成的散列值进行加密后得到的密文。
数字签名
数字签名则是结合散列函数和公钥加密方式来保护数据完整性的方法。
生成数字签名和签名验证的的过程如下:
- 需要先将明文输入 hash 函数,得到一串固定长度的散列值;
- 然后用户根据 RSA 算法生成公钥和私钥,再用私钥对散列值进行加密得到最终的签名;
- 用户将签名放在明文中(相当于按手印),然后和公钥一起发送给接收者;
- 接收者收到公钥和签名后的数据后,分离明文和签名,然后使用公钥解密数据里的签名部分,得到原始散列值;
- 接收者再根据 hash 函数和收到的明文生成对比散列值,用于和签名得到的散列值进行对比,如果散列值不一样则表示传递的明文一定也一样,也就表示明文已经是篡改过的。(这个结果理论上无法保证数据没有被篡改,因为不同的输入也可以得出同样的散列值;但是散列值碰撞的情况极为少见,需要大量耗时计算,所以基本上可以认为明文不会被篡改)
数字签名的算法是使用公钥去解密私钥加密的内容,也属于公开密钥加密方式;当面对互联网第三方攻击时,数字签名可以做到以下三点:
- 第一:第三方从报文提取明文并修改,加上原来的签名然后再发送给接收者,但是散列值保证了不同的散列值一定来自不同的数据源,所以修改后的数据一定无法通过验证,这也就保证了签名的数据无法被修改;
- 第二:第三方想修改明文并伪造一份签名发送给接收者,但是私钥只有发送者才有,所以第三方无法产生相同的签名,那么也就保证了签名无法被伪造;
- 第三:如果 A 不承认发送过签名,B 可以把收到的签名出示给第三方公证机构,第三方可以根据公钥解密出明文,则证明 A 确实发送过签名。
数字证书
digital certificate,数字证书,或者叫公开密钥认证证书,是将公钥和持有者身份进行绑定的文件,也就是负责验证通信双方身份的。从数据加密还有数字签名,保证的都是数据在传输的过程中不会被盗取和修改,然而在接收加密信息或者签名的信息的一方,并不知道数据的来源,所以这就给大量钓鱼的第三方提供了机会,必须使用数字证书验证身份后才能进行数据的加密传输。
数字证书不光用于 HTTPS,在互联网很多传输数据的业务方面都有使用,例如电子邮件 SMTPS 等,并且一些电子合同也能使用,很多国家和地区都立法通过使用数字签名的数字证书和亲笔签名具有一样的法律效力。
数字证书的种类也有很多,业界现行的标准是国际电信联盟电信标准化部门制定的 X.509,并由IETF发行的RFC 5280文档详细说明。
X.509
X.509 是数字证书的标准格式,该数字文档将加密密钥对与网站,个人或组织之类的关联起来,遵从 X.509 标准格式的数字证书一般包含以下内容:
- 版本:现行通用版本是 V3;
- 序号:用于识别每一张证书,特别在撤消证书的时候有用;
- 主体:拥有此证书的法人,或者自然人身份或机器,如果是网站使用 TLS 证书,则就是网站的域名;
- 发行者:以数字签名形式签署此证书的数字证书认证机构;
- 有效期开始时间
- 有效期结束时间
- 公开密钥用途:指定证书上公钥的用途,例如数字签名、服务器验证、客户端验证等
- 公开密钥:注意这个公钥是持有证书的主体的公钥,例如在服务器中,就是服务器公开的密钥
- 数字签名:负责验证数字证书的,保证数字证书不会被篡改
CA
CA,Certificate Authority,也就是证书认证中心,是一个负责发放和管理数字证书的第三方权威机构,例如上图中的 Let’s Encrypt 这个机构,它也是一个公司。
CA 的主要职责如下:
- 证书的颁发:接收、验证用户(包括下级认证中心和最终用户)的数字证书的申请;
- 证书的更新:认证中心可以定期更新所有用户的证书,或者根据用户的请求来更新用户的证书;
- 证书的作废:由于用户私钥泄密等原因,需要向认证中心提出证书作废的请求;证书已经过了有效期,认证中心自动将该证书作废;
数字证书的申请和使用
当互联网上的个人,网站或组织希望获得数字证书时,首先要向第三方机构,例如 CA 等提交申请,将自己的一些信息,例如年龄性别等提供给 CA,CA 在验证身份准确后,会根据这些信息加上自己的信息生成一份文件,并对这份文件进行数字签名,保证其不会被篡改,然后就得到了数字证书。
当需要出示数字证书证明身份的时候,对方会首先使用 CA 提供的公钥对证书的数字签名进行验证,当验证通过后才会使用证书里面提供的信息。
域名证书安全级别
- DV,Domain Validation,域名验证型证书,认证机构只会根据申请方提供的信息审核域名所有权
- OV,Organization Validation,组织认证型证书,申请者必须通过两项审核:管理相关域名的权利,而且相关组织是实际存在的法人
- EV,Extended Validation,扩展验证,这是最严格的审核级别,审核过程可能牵涉专业法律人员的调查及独立审计人员的确认,成本也自然更高,成功获得扩展验证证书的网站,现代浏览器通常会在地址列以绿色表示相关机构的法人名称及专属国家代码。过去 Chrome 会显示绿标,但是从 Chrome 77 版本以后就不给显示了。