SSH密钥-RSA、DSA、ECDSA、EdDSA

2020-08-27 03:14:25

还有什么比让私钥无人看管更糟糕的呢?拥有可以被暴力强制的公钥的。

安全外壳中的“安全”来自于散列、对称加密和非对称加密的组合。总之,SSH使用加密原语来安全地连接客户端和服务器。在它成立以来的25年里,按照摩尔定律的计算能力和速度要求越来越复杂的低级算法。

截至2020年,PKI世界中采用最广泛的非对称加密算法有RSA、DSA、ECDSA和EdDSA。那么哪一个是最好的呢?嗯,这要看情况。

SSH几乎普遍用于连接到远程机器上的shell。SSH会话最重要的部分是建立安全连接。这分两大步进行:

为了使SSH会话正常工作,客户端和服务器必须支持相同版本的SSH协议。现代客户端将支持SSH 2.0,因为SSH 1.0已经发现了缺陷。在就遵循哪个协议版本达成共识后,两台机器都会协商每个会话的对称密钥,以加密来自外部的连接。当在身份验证中与非对称密钥配对时,在此阶段生成对称密钥可防止在密钥泄露时危及整个会话。协商条件通过Diffie-Helman密钥交换进行,它通过将一方的私钥与另一方的公钥相结合来创建共享密钥来保护整个数据流。这些密钥与用于身份验证的SSH密钥不同。对于那些有兴趣更多地了解这一步骤的人来说,这篇全面的文章SSH握手解释说是一个很好的起点。

协商和连接完成后,客户端和服务器之间就建立了可靠、安全的通道。在KEX期间,客户端已对服务器进行了身份验证,但服务器尚未对客户端进行身份验证。在大多数情况下,客户端使用公钥身份验证。此方法涉及两个密钥,一个公钥和一个私钥。其中一个可以用于加密消息,但另一个必须用于解密。这就是非对称加密的含义。[图2]如果Bob使用Alice的公钥加密消息,则只有Alice的私钥可以解密该消息。此原则允许SSH协议对身份进行身份验证。如果Alice(客户端)可以解密Bob(服务器)的消息,则证明Alice拥有成对的私钥。理论上,这就是SSH密钥身份验证的工作方式。不幸的是,由于当今基础设施的动态性,SSH密钥越来越多地被共享或管理不当,从而损害了其完整性。要了解更多信息,请阅读本文“如何正确使用SSH”。

非对称加密的强大之处在于,私钥可以用于派生成对的公钥,但反之亦然。此原则是公钥身份验证的核心。如果第三方摩根能够破解加密算法,摩根就可以使用爱丽丝的公钥导出她的私钥并欺骗性地代表她,从而使该方法完全无效。要防范这种被称为蛮力逼迫的威胁,需要仔细选择一种加密算法,该算法不能在实际时间内用当前的技术破解。

通常用于非对称加密的这些算法有三类:RSA、DSA和基于椭圆曲线的算法。要正确评估每个算法的强度和完整性,有必要了解构成每个算法核心的数学知识。

RSA密码术于1978年首次使用,它基于这样一种信念,即分解大半素数本质上是困难的。由于还没有找到将复合数分解为其素因子的通用公式,因此所选因子的大小与计算解所需的时间之间存在直接关系。换句话说,给定一个数字n=p&;astq,其中p和q是足够大的素数,可以假设任何能将n分解成其组成部分的人都是唯一知道p和q的值的一方。公钥和私钥也存在同样的逻辑。事实上,p&;q是创建私钥的必要变量,n是后续公钥的变量。此演示文稿简化了RSA整数因式分解。对于有兴趣了解更多信息的人,请单击此处。

DSA遵循与RSA相似的模式,其公钥/私钥对在数学上是相关的。DSA与RSA的不同之处在于DSA使用不同的算法。它使用不同的元素、方程和步骤来解决完全不同的问题。虽然离散对数问题很有趣,但它超出了本文的讨论范围。需要注意的是,使用随机生成的数字m与私钥k一起签署消息。该数字m必须保密。稍后会在这里详细介绍。

使用椭圆曲线的算法也基于这样的假设,即通常不存在解决离散对数问题的有效解决方案。然而,ECDSA/EdDSA和DSA的不同之处在于,DSA使用称为模幂的数学运算,而ECDSA/EdDSA使用椭圆曲线。离散对数问题的计算复杂性允许这两类算法使用小得多的密钥实现与RSA相同的安全级别。

安全性-可以从私钥派生公钥吗?(本文不讨论使用量子计算破解加密。)。

存在像二次筛选和一般数字字段筛选这样的专门算法来对具有特定性质的整数进行因子分解。

时间一直是RSA最大的盟友和最大的敌人。RSA于1977年首次发布,在所有SSH客户端和语言中拥有最广泛的支持,作为一种可靠的密钥生成方法,它确实经受住了时间的考验。随后,它也遵循摩尔定律数十年,并且密钥位长度在尺寸上增长。根据NIST标准,实现128位安全性需要长度为3072位的密钥,而其他算法使用较小的密钥。比特安全性衡量暴力破解密钥所需的试验次数。128位安全意味着要破解2128次试验。

DSA于1994年被FIPS-184采用。与RSA类似,它在主要密码库中有丰富的表示。

虽然建议的位长与RSA相同,但在密钥生成时间方面有了显著改进,以达到相当的安全强度。

DSA要求使用随机生成的不可预测的保密值,如果发现该值,可能会泄露私钥。

需要注意的是,随机生成的数字m与私钥k一起用于签署消息。此数字m必须保密。

值m意味着是现时值,它是包括在许多密码协议中的唯一值。然而,不可预测性和保密性的附加条件使随机数更类似于密钥,因此极其重要。

不仅很难确保机器内的真正随机性,而且不适当的实现可能会破坏加密。例如:

众所周知,Android的Java SecureRandom类会创建冲突的R值。换句话说,这个类重用了一些随机生成的数字。这使一些不同的基于Android的比特币钱包的私钥被盗。随机数m的要求意味着可以对具有相同随机数值的任何两个实例进行反向工程,并揭示用于签署事务的私钥。

更进一步,Fail0verflow发现了用来签署索尼PlayStation3固件更新的私钥。换句话说,程序员可以编写自己的代码,用公开的私钥签名,然后在PS3上运行。事实证明,索尼使用相同的随机数字对每条信息进行签名。

以上两个例子并不完全是真诚的。索尼和比特币协议都使用ECDSA,而不是DSA本身。ECDSA是DSA的椭圆曲线实现。在功能上,RSA和DSA需要3072位的密钥长度来提供128位的安全性,而ECDSA只需要256位密钥就可以实现同样的功能。然而,ECDSA依赖于与DSA相同级别的随机性,因此唯一的好处是速度和长度,而不是安全性。

为了应对椭圆曲线的期望速度和不期望的安全风险,另一类曲线获得了一些恶名。EdDSA解决了与DSA/ECDSA相同的离散对数问题,但使用称为爱德华兹曲线(Edwards Curve)的不同椭圆曲线系列(EdDSA使用扭曲爱德华兹曲线)。虽然与ECDSA相比,它在速度上略有优势,但它的受欢迎程度来自于安全性的提高。EdDSA不依赖随机数作为随机数值,而是确定性地将随机数生成为散列,使其具有防冲突功能。

退一步说,使用椭圆曲线并不能自动保证一定程度的安全性。并非所有曲线都相同。只有几条曲线通过了严格的测试。幸运的是,PKI行业已经慢慢采用Curve25519,特别是针对EdDSA。这些加在一起就是公钥签名算法Ed25519。

与较新的客户端兼容,Ed25519在Edward Curves中的采用率最高,尽管NIST在其最近的SP 800-186草案中也建议使用Ed448。

ED25519是所有度量中执行速度最快的算法。与ECDSA一样,公钥的长度是所需位安全性的两倍。

与密钥长度相比,EdDSA提供了最高的安全级别。它还改善了ECDSA中发现的不安全感。

归根结底,要在RSA2048Ed25596和⁄25519之间做出选择,在性能和兼容性之间进行权衡。RSA在SSH客户端中受到普遍支持,而EdDSA的执行速度要快得多,并且使用小得多的密钥提供相同级别的安全性。彼得·鲁佩尔简明扼要地给出了答案:

对此的简短回答是:只要关键力量在可预见的未来足够好,这实际上并不重要。因为这里我们考虑在SSH会话中使用签名进行身份验证。签名的密码强度只需要经受住当前最先进的攻击。-用于SSH的ED25519