一、对称加密、非对称加密和散列函数

对称加密

对称加密(symmetric encryption)又称私钥加密(private-key cryptography),是一种混淆算法,能够让数据在非安全信道上进行安全通信。为了保证通信安全,Alice和Bob首先得到双方都认可的加密算法和密钥。当Alice需要向Bob发送数据时,她使用这个密钥加密数据。Bob使用相同的密钥解密。Eve能够访问信道,所以可以看到加密数据;但因为没有密钥,所以看不到原始数据。Alice和Bob只要能保证密钥安全,就能一直安全地通信。

注意
讨论加密时通常会使用到三个术语:明文(plaintext,即原始数据)、密钥(cipher,用于加密)和密文(ciphertext,即加密后的数据)。

非对称加密

非对称加密(asymmetric encryption)又称为公钥加密(public key cryptography),它是另一种方法,使用两个密钥,而不是一个;其中一个密钥是私密的,另一个是公开的。顾名思义,一个密钥用于私人,另一个密钥将会被所有人共享。这两个密钥之间存在一些特殊的数学关系,使得密钥具备一些有用的特性。如果你利用某人的公钥加密数据,那么只有他们对应的私钥能够解
密。从另一个方面讲,如果某人用私钥加密数据,任何人都可以利用对应的公钥解开消息。后面这种操作不提供机密性,但可以用作数字签名。
RSA是目前最普遍部署的非对称加密算法。现在推荐的RSA强度是2048位,强度等同于112位的对称密钥。

散列函数

散列函数(hash function)是将任意长度的输入转化为定长输出的算法。散列函数的结果经常被简称为散列(hash)。编程中普遍使用散列函数,但并非所有散列函数都适用于密码学。
散列函数最常用的使用场合是以紧凑的方式表示并比较大量数据。比如,为了避免直接比较两个文件(可能很难,比方说,它们存放于世界上不同的位置),你可以比较它们的散列。散列函数经常被称为指纹、消息摘要,或者简单称为摘要。现在使用最为广泛的散列函数是SHA1,它的输出是160位。因为SHA1已经变弱,所以建议升级为SHA256的变种。与密码不同,散列函数的强度并不与散列长度对等。因为生日悖论(概率论中的常见问题),散列函数的强度最多只是散列长度的一半。

二、密钥、证书和加密算法

证书

证书是一个包含公钥、订阅人相关信息以及证书颁发者数字签名的数字文件,也就是一个让我们可以交换、存储和使用公钥的壳。因此,证书成为了整个PKI体系的基础组成元素。

证书种类

CA会根据不同类型的证书申请,执行不同的验证流程。
域名验证

  • 域名验证(domain validated,DV)证书需要CA验证订阅人对域名的所有权之后才能进行签发。大多数情况下CA会发送一封确认邮件给域名的管理邮箱,管理员通过之后(按照邮件里面的步骤和链接)CA就会签发证书。如果无法通过邮件确认,那么CA通过别的通信手段(例如电话或者邮寄信件)或者合理的方式证明订阅人对域名的所有权之后就可以签发证书。签发IP地址证书的步骤也是类似的。
  • 组织验证
    组织验证(organization validated,OV)证书会对身份和真实性进行验证。直到采用了Baseline Requirements之后,OV证书的验证流程才标准化起来,但是在如何签发OV证书以及如何将这些信息编码到证书中等方面,依旧存在很多前后不一致的情况。
  • 扩展验证
    扩展验证(extended validation,EV)证书以更加严格的要求验证身份和真实性。它是为了解决OV证书缺乏的前后一致性而引入的,所以EV证书的验证流程非常详细,几乎不会出现前后不一致的情况。

DV证书的签发是全自动的,所以非常快,它的签发时间主要取决于DNS管理员确认邮件所需的时间;而EV证书则相反,可能需要几天甚至几周才能拿到。

密钥

私钥是TLS安全的基石,为私钥选择恰当的密钥算法和长度,TLS可以提供高强度的安全性(在现有计算条件下需要很多年才能被破解)。实际上,抛开数学方面的考虑(位数越高越安全),TLS最大的弱点在于密钥的管理,或者说如何保护私钥的私密性。

密钥算法

目前TLS支持3种算法,但实际上只有RSA这一种被广泛使用;DSA已经被废弃,而ECDSA在未来几年内有望被广泛使用。

DSA

DSA算法很容易被排除:因为DSA的密钥长度最大只能到1024位(IE浏览器也不支持更高强度),这个位数根本无法确保安全性,所以没有人会在TLS实际应用中使用DSA算法,
与所有人背道而驰的结果是让你陷入兼容性问题中。

RSA

RSA算法是最常见的一种选择,基本上所有的TLS部署都会支持RSA算法。但是,RSA在2048位(最小位数)的密钥下,比ECDSA密钥在安全性上更弱并且性能更差。更糟的是,增加RSA密钥长度是性能消耗的增加并不是线性的,如果你觉得2048位的加密强度不够,需要使用更高的位数(比如3072位)的RSA密钥时,在性能上就会有极大幅度的下降。

ECDSA

ECDSA算法是未来的选择。256位的ECDSA密钥有128位用于安全加密上,相对而言,2048位的RSA密钥只有112位是真正用于安全加密的。不仅如此,在这个加密强度下,ECDSA比RSA算法快2倍;如果是与3072位的RSA密钥在相同加密强度下相比,ECDSA性能要快6倍以上。
不是所有用户端都支持这种算法。新的浏览器都支持ECDSA,但是一些老版本的浏览器是不支持这个算法的。你可以通过同时部署RSA和ECDSA的密钥来解决对新老浏览器的兼容,但并不是所有服务程序都能提供这种配置方式,另外这种方案也需要额外的工作来同时维护两套密钥和证书。因此,就现状而言,ECDSA的最佳使用场景是用于部署追求最高性能的TLS服务系统。未来,随着我们对安全的日益重视,ECDSA也会变得越来越重要。

密钥长度

在密钥长度方面,大部分系统部署只需要2048位RSA密钥或者256位ECDSA密钥,分别提供112位和128位的加密强度。也就是说,大部分系统部署可以使用算法的最低安全密钥长度,因为即使如此系统也足以满足用户的安全需求。
从长期的安全保护来说,你应该使用至少128位加密强度的安全密钥。在这个条件下,256位的ECDSA密钥是最佳也最实用的选择。如果用RSA就必须使用3072位密钥,但性能上就差得太多。双密钥部署是一种不错的选择,既可以避免性能的损失,又能提供最好的浏览器支持:现代浏览器(希望你的客户群体都属于这一类)可以使用ECDSA密钥,而其他用户可以使用较弱的RSA密钥,或者是接受强RSA密钥的性能损失。
{% asset_img 常用密钥长度的加密强度映射.png [常用密钥长度的加密强度映射] %}

密钥管理

我们已经讨论了很多密钥长度方面的安全性,但实际上密钥管理问题更可能对你的系统安全产生严重的影响。有充分的证据表明,大部分成功的攻击都是绕过了加密环节,而不是直接破解出加密内容。如果有人能侵入你的系统并拿到密钥或者以某种方式诱使你公开了密钥,那他们也就不再需要烦恼于如何暴力破解你的加密数据了。

标签: none

添加新评论