基本认知
密码学有着严格的规范,其算法的实现原理是公开的。密码学算法是相对安全的,主要解决四个问题:
- 机密性(隐私性):在网络中传递的数据如果具备机密性,只有拥有密钥的才能解释这些数据,密钥是加密算法的关键。
- 完整性:接收方能够确保接收到的数据就是发送方发送的原始数据,在密码学中,主要使用消息验证码(
MAC
)算法保证完整性。 - 身份验证:通信双方必须确保对端就是要通信的对象。在密码学中,一般使用数字签名技术确认身份。
- 不可抵赖性:在密码学中,数字签名技术能够避免抵赖。
OpenSSL:是
SSL
和TLS
最常见的开源实现,包括了底层密码库和命令行工具,其目标是开发一个强壮的、具有完备功能的商业级工具集,以实现SSL
和TLS
协议以及一个全功能的通用加密库。
随机数
随机数的类型
随机数的工作原理
随机数生成器内部会维护一个状态(internal state)
,对于随机数生成器(TRNG)来说,内部状态的数值来自外部设备,称为熵(entrory)
,比如动态的时间、变化的温度、声音的变化、鼠标位置。而对于伪随机数生成器(PRNG)
来说,内部状态的数值来自于模拟的数值,称为种子(seed)
。随机数生成器每次生成随机数的时候,内部状态的值都会变化,这样才能产生不一样的随机数,如果每次熵和种子是一样的,生成的随机数也是相同的。
Hash算法
由于Hash算法
有很多功能,比如摘要算法(Message DigestAlgorithms)、单向散列函数(Cryptographic One-way Hash Functions)
。输出值也有多种称呼,比如摘要值、散列、指纹
。密码学Hash算法
是非常重要的一个算法,是现代密码学中的核心组成部分,其主要特性如下:
- 相同的消息总是能得到同样的摘要值,特定的Hash算法,不管消息长度是多少,最终的摘要值
长度是相同
的。 - 不管多长的消息,Hash运算非常快速。
- 通过摘要值很难逆向计算出原始消息,Hash算法具备
单向性
,摘要值是不可逆的。为了逆向计算出原始消息,唯一的方法就是采用暴力攻击、字典攻击、彩虹表,对不同的消息组合进行迭代运算,运算的结果如果匹配该消息的摘要值,表示该Hash算法不应该用于密码学。 - 原始消息一旦修改,即使是很轻微的修改,最终的摘要值也会产生变化。
- 很难找出两个不同的消息,并且它们的摘要值是相同的。
密码学Hash算法有很多,比如
MD5算法、SHA族类算法
,MD5早已被证明是不安全的Hash算法了,目前使用最广泛的Hash算法是SHA族类算法。
对称加密算法
通过一个算法和一个密钥(secret key)
对明文(plaintext)
进行处理,得到的不规则字符就是密文(ciphertext)
。对称加密算法有两种类型,分别是块密码算法(block ciphers)
和流密码算法(stream ciphers)
。AES、DES、3DES
等是常见的对称加密算法。
对称加密算法可以用下列公式简单表述:
密文=E(明文,算法,密钥)
明文=D(密文,算法,密钥)
E和D分别表示加密和解密,通过公式可以了解几个关键点:
- 密钥是关键,密钥是一串数字,加密和解密使用同样的一个密钥,如果没有密钥,基于密文是无法获取明文的。
- 加密和解密操作(算法)是一个互逆过程,算法的背后就是复杂的数学知识。
消息验证码
Hash算法能够完成密码学目标之一的完整性校验,但却不能避免消息被篡改,为避免消息被篡改,需要用到消息验证码(MAC)
。消息验证码非常重要,一般结合加密算法一起使用。消息验证码算法具有如下特点:
- 证明消息没有被篡改,这和Hash算法类似。
- 消息是正确的发送者发送的,也就是说消息是经过验证的。
通信双方可以维护同一个密钥,只有拥有密钥的通信双方才能生成和验证消息验证码,消息验证码算法需要一个密钥,这和对称加密算法是一样的,通信双方在消息传递之前需要获得同样的密钥。过程图如下:
消息认证实际上是对消息本身产生一个冗余的信息-MAC(消息认证码)
,消息认证码是利用密钥对要认证的消息产生新的数据块并对数据块加密生成的。它对于要保护的信息来说是唯一和一一对应的。因此可以有效地保护消息的完整性
,以及实现发送方消息的不能伪造。
公开密钥算法(非对称加密)
公开密钥算法表示密钥可以部分公开,公开密钥算法的密钥是一对,分别是公钥(public key)
和私钥(private key)
,一般私钥由密钥对的生成方(比如服务器端)持有,避免泄露,而公钥任何人都可以持有,也不怕泄露。公开密钥算法的功能比较多,可以进行加密解密、密钥协商、数字签名
。公开密钥算法最重要和最广泛的就是RSA算法
。相比对称加密算法来说,公开密钥算法尤其是RSA算法
运算非常缓慢,加解密过程如下:
密钥协商算法
在网络通信应用中,密钥的管理和分配是个难题,尤其是生成一个动态密钥更难,而密钥协商算法就可以解决密钥分配、存储、传输等问题。
RSA密钥协商算法
通过一个例子看看RSA密钥协商算法
如何工作的:
- 客户端初始化连接服务器端,服务器发送
RSA密钥对的公钥
给客户端。 - 客户端生成一个
随机值
,这个值必须是随机的,不能被攻击者猜出,这个值就是会话密钥
。 - 客户端使用服务器
RSA密钥对的公钥
加密会话密钥,并发送给服务器端,由于攻击者没有服务器的私钥,所以无法解密会话密钥。 - 服务器端用它的
私钥
解密出会话密钥。 - 至此双方完成连接,接下来服务器端和客户端可以使用
对称加密算法
和会话密钥
加密解密数据。
DH密钥协商算法
DH算法确切地说,实现的是密钥交换
或者密钥协商
,DH算法在进行密钥协商的时候,通信双方的任何一方无法独自计算出一个会话密钥
,通信双方各自保留一部分关键信息,再将另外一部分信息告诉对方,双方有了全部信息才能共同
计算出相同的会话密钥。DH算法处理过程:
数字签名
RSA签名算法
和DSA签名算法
都可以实现数字签名,数字签名技术能够进行身份验证,防止抵赖、防止篡改、防止伪造。数字签名流程如下:
数字签名技术的本质不是为了加密,所以和签名值一同传递的消息是不用加密的,当然也可以对消息加密后再计算签名值。签名验证流程如图:
考虑到公开密钥算法运行是相对缓慢的,数字签名算法建议对消息摘要值进行签名,因为摘要值的长度是固定的,运算的时候速度会比较快。
参考
- 《深入浅出HTTPS:从原理到实战》(虞卫东)