加密算法:
- 对称加密的通信双方使用相同的密钥,如果一方的密钥遭泄露,那么整个通信就会被破解。常见的对称加密算法:
- DES
Data Encryption Standard
:分组加密技术,以64位(含8位奇偶校验位)分组长度对数据加密。有两个特点:混淆和扩散。混淆是使密文的统计特性与密钥的取值之间的关系尽可能复杂化,扩散是将每一位明文的影响尽可能迅速地作用到较多的输出密文位中,以便在大量的密文中消除明文的统计结构。- 3DES:执行3次DES来达到增加密钥长度和安全性的目的。
- AES
Advanced Encryption Standard
:一种区块加密标准,基于排列和置换运算,目前是对称加密中最流行的算法。
- 非对称加密使用一对秘钥,公开的密钥叫公钥,只有自己知道的叫私钥。用公钥加密的数据只有对应的私钥可以解密。用私钥加密的数据只有对应的公钥可以解密。非对称加密算法有:
- RSA
Rivest Shamir Adleman三人提出的
目前最有影响力的公钥加密算法,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA可以通过认证(如使用X.509数字证书)来防止中间人攻击。- ECC
Elliptic curve cryptography
椭圆曲线密码加密技术。主要优势是在某些情况下它比其他的方法使用更小的密钥(如RSA加密算法)提供相当的或更高等级的安全。- Elgamal,基于迪菲-赫尔曼密钥交换的非对称加密算法。
-
散列算法
Hash Function
把数据压缩成摘要,或者说是转换为指纹(散列值hash values
)。散列算法有:
- MD5
Message Digest Algorithm 信息摘要算法
,本质上说是一种签名算法。
# 输入任意长度的信息,输出128位的数字指纹。
# 不同输入产生不同的结果,哪怕只修改1个字节,得到的指纹都有很大区别
# 结果不可逆,不能反推出输入信息- SHA
Secure Hash Algorithm 安全散列算法
,分为SHA-1和SHA-2(SHA-224、SHA-256、SHA-384、SHA-512)。SHA-1强于MD5,但均可被破解,目前大公司全面放弃SHA-1,改用SHA-2。
攻防:
- 彩虹表用于加密散列函数逆运算的预先计算好的表,常用于破解加密过的密码散列,这是以空间换时间的典型实践。为了防止这种破解,扩大用户输入的组合是有效的方法:
- HASH的n次迭代,比如n = 1000
- 加盐,在密码任意固定位置插入特定的字符串,如HASH(pwd + salt)。又比如在微信通信里,要传递三个参数ABC,则需要将ABC与appsecret一起sha1一遍,得到一个签名串,然后将这个签名串与appkey一起传递给微信,此时,微信会通过appkey去查找对应的appsecret,然后再将ABC参数与查询出来的appsecret做一遍相同的签名算法,如果得到的签名串一致,则认为是授权成功。此处appsecret就是盐。
- 中间人攻击,通过拦截正常的网络通信数据,并进行数据篡改和嗅探,而通信的双方却毫不知情。
- 非对称加密的安全隐患 网络通信开始时,A和B要通过网络交换公钥。但C拦截了A和B的公钥,又分别用自己的公钥发给A和B。这就是中间人攻击。现实中,通过CA(Certificate Authority)来保证公钥的真实性。B会先把自己的公钥(和一些其他信息)交给CA。CA用自己的私钥加密这些数据,加密完的数据称为B的数字证书。现在B要向A传递公钥,B传递的是CA加密之后的数字证书。A收到以后,会通过CA发布的CA证书(包含了CA的公钥),来解密B的数字证书,从而获得B的公钥。CA把自己的证书集成在了浏览器和操作系统里面,避免劫持。盗版系统、非官方浏览器存在CA证书被篡改的可能。
数字证书
数字证书有很多格式版本,SSL证书格式遵循X.509标准,X.509是由国际电信联盟(ITU-T)制定的数字证书标准,主要有X.509v3(1997)、X509v4(1997)、X.509v1(1988)等。
CA证书颁发机构,Certificate Authority的缩写
。数字证书采用信任链验证。数字证书的信任锚(信任的起点)就是根证书颁发机构。根证书(root certificate)是一个无签名或自签名的识别根证书颁发机构的公钥证书。许多应用程序(如浏览器)会代表用户信任值得信任的根证书。
-
证书的编码
证书有两种编码格式,DER
二进制编码方式和PEM
ASCII的Base64编码方式。 -
文件扩展名
.CRT
与.CER
互为等价,代表是证书文件,.CRT
通常用于Unix操作系统,.CER
通常用于微软操作系统;
.KEY
代表公钥或私钥文件; -
证书的查看
无论是PEM还是DER的编码方式都不能直接查看,可以通过命令查看:
查看PEM编码的证书:
openssl x509 -in cerfile.cer -text -noout
查看DER编码的证书:
openssl x509 -in cerfile.cer -inform der -text -noout
-
证书编码的转换
PEM转DER:
openssl x509 -in cerfile_pem.cer -inform pem -outform der -out cerfile_der.cer
DER转PEM:
openssl x509 -in cerfile_der.cer -inform der -outform pem -out cerfile_pem.cer
-
公钥提取
X.509证书,核心是根据RFC 5280编码或数字签名的数字文档。
openssl x509 -in cerfile.cer -pubkey -noout > pub.key
SSL/TLS协议
-
SSL(Secure Socket Layer)
位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议(SSL Record Protocol)和SSL握手协议(SSL Handshake Protocol)。SSL是Netscape开发的,目前有三个版本,SSL1.0、SSL2.0、SSL3.0,因其存在严重的安全问题,大多数公司目前均已不在使用了。 -
TLS(Transport Layer Security)
用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。TLS是IETF将SSL标准化后的产物。其实TLS可以理解为SSL的升级版,TLS目前也有三个版本,TLS1.0、TLS1.1、TLS1.2,目前常用的为TLS1.2。 -
TLS握手
在TLS中有两种主要的握手类型:一种基于RSA,一种基于Diffie-Hellman。 这两种握手类型的主要区别在于主秘钥交换和认证上。用RSA握手还是DH握手取决于加密套件,可以用openssl ciphers -v
查看。
-
RSA的TLS握手
整个流程如下如所示:
-
客户端向服务器发送Client Hello,将客户端的功能和首选项告诉服务器。
Random:包含32字节的数据,其中28字节是随机生成的(Random Bytes)。剩下的4字节包含额外的信息(GMT Unix Time),在握手的时候这随机数都是独一无二的,可以防止重复攻击。
Session ID:在第一连接时,会话ID字段是空的,这表示新会话,没有其他会话需要恢复。在后续的连接中,这个字段可以保存会话的唯一标识。服务器可以借助会话ID在自己的缓存中找到对应的会话状态。
Cipher Suites:密码套件是由客户端支持的所有密码套件组成的列表,该列表是按优先级顺序排列的。由密钥交换方法、身份验证方法、密码定义以及可选的MAC或PRF算法组合而成。
-
服务器收到响应,选择双方都支持的协议,套件,向客户端发送Server Hello。同时服务器也将自己的证书发送到客户端(Certificate)。
Certificate:典型的Certificate消息用于携带X.509证书链。证书链是以ASN.1 DER编码的一系列证书,一个接一个组合而成。叶子证书必须是第一个发送,中间证书按照正确的顺序跟在叶子证书之后,根证书省略。
-
客户端自己生产预主密钥,通过公钥加密预主秘钥,将加密后的预主秘钥发送给服务器 (Client Exchange)。
Change Cipher Spec:发送端已取得用以生成连接参数的足够信息,已生成加密密钥(主密钥),并且将切换到加密模式。客户端和服务器在条件成熟是会发送这个消息。
- 服务器用自己的私钥解密加密的预主密钥。
- 之后,客户端与服务器用相同的算法根据客户端随机数,服务器随机数,预主秘钥生产主密钥,之后的通信将都用主密钥加密解密。
主密钥的是由预主密钥进一步计算而成,这个过程通过一个伪随机函数(pseudorandom function, PRF)来完成,master_secret = PRF(pre_master_secret,"master secret",ClientHello.random+ServerHello.random)
-
DH的TLS握手
整个流程如下如所示: