非对称加密

引入Alice作为发送方,Bob作为接收方。 非对称加密技术要求双方公开一个用于加密报文的密钥,称为公钥(K+)。然后使用不公开的、仅双方知道的密钥(K-)进行解密。

非对称加密技术

RSA是非对称加密技术的代名词,采用模n运算,所以RSA会将报文作为一个数字来看待。RSA算法相当耗时,如果要发送大量数据,发送数据前,先用RSA再加密一个密钥(session key,Ks),然后使用对称加密技术发送数据。典型的RSA公钥长度为2048bit。

对称加密

Alice和Bob共用一个密钥加密。此处涉及如何安全地共享密钥。常见的对称加密算法有DES,AES,3DES等。

完整性与数字签名

为了防止报文中途被人篡改,通常需要通过一个Hash函数(摘要算法)对报文计算一个摘要或散列值(Hash)。即:

找到任意两个报文x、y使得H(x) = H(y),在计算上是不可能的

常用的Hash函数有MD5(生成128比特的散列值)、SHA-1(生成160比特散列值)。

非对称加密技术

Alice发送报文时,将生成的摘要附加到原始报文中,形成扩展报文 (m, H(m)),Bob收到后计算 H(m)*,并于摘要对比。

MAC

用密钥s级联原文m形成的散列值H(m+s)称为报文鉴别码(MAC)。鉴别报文完整性和防篡改。

数字签名

为了证明报文确实是Bob发送的,需要在原报文上做特殊处理,对报文进行数字签名达到这个目的。

Bob发送明文m前,先对m生成一个摘要,并使用他的私钥对H(m),进行加密,得到 K-(H(m)),对原文直接加密计算代价太昂贵。Alice收到报文后,对明文m进行摘要计算,得到散列结果H(m),然后用Bob的公钥K+解密获得原摘要,然后对两个摘要做对比。

数字签名

CA

这种签名方式有个缺点,就是可以在Alice的电脑上伪造Bob的公钥,所以要将公钥交给认证中心(CA)保管,由CA负责将公钥与实体绑定,并生成一个证书。证书包含公钥和公钥所有者全局唯一身份信息(IP地址、名字)。CA使用自己的私钥对Bob的公钥和和相关信息进行加密生成证书。

Bob拿到证书后,每次向Alice发送信息时,都要附上该证书,Alice收到信息后,用CA的公钥解开数字证书,拿到Bob的真实公钥。

SSL

TCP的安全增强版被称为安全套接字(SSL),SSL的版本3被称为运输层安全性(TSL),统称为SSL/TSL。

SSL需要双方通讯前交换密钥,协商对称加密算法、公钥算法、MAC。

SSL双方要生成四种密钥:用于加密会话的加密密钥E,用于加密MAC的MAC密钥M。加密的MAC实际上为:(数据, MAC密钥M, 不重复的序号)。不重复数可以防止被攻击。

  • $E_B$ 从Bob到Alice的会话密钥
  • $M_B$ 从Bob到Alice的MAC密钥
  • $E_A$ 从Alice到Bob的会话密钥
  • $M_A$ 从Alice到Bob的MAC密钥

SSL记录格式

TSL握手过程:

  1. B: 客户发送它所支持的算法列表,和一个不重复数
  2. A: 服务器选择一种对称算法(如AES)、公钥算法(如RSA)、MAC算法。把这些选择连同CA证书和服务器不重复数发送给客户端
  3. B: 客户端验证证书、提取公钥,生成前主密钥(PMS),用公钥加密PMS发送给服务器
  4. A&B: 使用相同的密钥导出函数(SSL标准定义),客户和服务器独立从PMS和不重复数中计算出主密钥(MS)。然后该MS被切分生成两个密码和MAC密钥
  5. B: 客户发送所有握手报文的MAC
  6. A: 服务发送所有握手报文的MAC

最后两个步骤可以防止握手被篡改。因为握手报文是明文发送的,攻击者可以从算法列表中删除一些算法强的。如果最后的MAC不一致,服务可以选择断开SSL。

发送不重复数也可以使每次使用的密钥不同。

SSH

SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。SSH指纹是服务端公钥的摘要,

SSH握手过程:

  1. 版本号协商,选择使用SSH1还是SSH2
  2. 密钥算法协商,选择公钥算法、加密算法、MAC算法
  3. 利用DH交换算法,计算出密钥
    1. Bob生成公钥和密钥,并向Alice发送公钥
    2. Alice利用Bob的公钥构造密钥对,将生成的公钥发送给Bob
    3. Alice和Bob都用对方的公钥和自己的私钥利用算法计算出相同的密钥
    4. 利用这个密钥进(session-key)行对称加密
  4. 利用密钥进行身份验证

处理密码验证的形式,还可以通过证书验证。客户端通过ssh-keygen生成密钥对,并将公钥保存在server的authorized_key文件中。

  1. 客户端发送认证请求,发送public key发送给服务端
  2. 服务端确认公钥存在,利用公钥对一个随机的256位字符串进行MD5加密,并发送给客户端
  3. 客户端用私钥进行解密,并将它和一个会话ID生成MD5值发送给服务器
  4. 服务端同样生成原文和会话ID的MD5摘要,并与客户端的进行比较