常用的公钥加密
和签名算法
:
在配置SSH免密登录的时候,一般会用到几种常用的公钥加密和签名算法:
RSA:RSA是最早的公钥加密和签名算法之一,它在许多协议和系统中被广泛使用,包括HTTPS、SSH、OpenPGP、S/MIME等。然而,RSA需要比较大的密钥(通常是2048位或更大)才能提供足够的安全性,而且它的加密和签名操作相对较慢。
ECDSA:ECDSA是基于椭圆曲线密码学的签名算法,它比RSA更高效,可以提供相同的安全性但需要更小的密钥。ECDSA在许多现代的协议和系统中被广泛使用,包括Bitcoin、Ethereum、TLS 1.3、SSH等。然而,ECDSA的安全性取决于其参数的选择,如果选择不当,可能会降低其安全性。
ED25519:ED25519是一种新的签名算法,它基于椭圆曲线密码学,但设计得更简单、更安全。ED25519比ECDSA更不容易受到侧信道攻击,而且它的性能也非常好。ED25519在一些新的系统和协议中被广泛使用,包括OpenSSH 7.0、Tor、Signal等。”25519”这个数字的来源是这样的:
Curve25519
是一种特定的椭圆曲线,它的名字来源于它的模数p,p是一个接近$2^{255}的质数,具体来说,p=2^{255}-19$,因此得名”25519”。这种曲线被选中的原因是它在安全性和性能之间提供了一个很好的平衡。它的设计者,Daniel J. Bernstein,特意选择了这个参数,以便在现代硬件上实现高效的加密操作,同时还能抵抗已知的加密攻击。
注意:公钥加密和签名算法是两种不同但相关的密码学技术,它们都依赖于公钥和私钥的概念。
- 公钥加密:这是一种加密方法,其中有两个密钥:公钥和私钥。公钥用于加密数据,而私钥用于解密数据。这意味着任何人都可以使用公钥加密信息,但只有拥有相应私钥的人才能解密这些信息。这种方法通常用于保护信息的机密性。RSA和ElGamal是公钥加密的例子。
- 签名算法:这是一种用于验证信息来源和完整性的方法。在这种情况下,私钥用于生成数字签名,而公钥用于验证签名。这意味着只有拥有私钥的人才能生成有效的签名,但任何人都可以使用公钥来验证签名。这种方法通常用于防止信息被篡改或伪造。RSA和ECDSA(Elliptic Curve Digital Signature Algorithm)是签名算法的例子。
值得注意的是,有些算法,如RSA,既可以用于公钥加密,也可以用于签名。然而,有些算法,如ECDSA和ED25519,只用于签名。
我们用的最多的是RSA
,但是很老旧了,必须依靠比较长的密钥才能保证其安全性,就算这样,它的安全性也不如ED25519
了,性能也不如,在进行大量的加密解密运算时,性能的差异就会体现出来。
怎么生成公私钥?
1. RSA
ssh-keygen -t rsa -b 2048 -C "your_email@example.com"
这个命令的含义是:
ssh-keygen
:是一个在Unix和类Unix系统(如Linux和Mac OS)中用于生成、管理和转换认证密钥的工具。它是SSH(Secure Shell)协议的一部分,SSH是一种用于安全远程登录和其他安全网络服务的协议。ssh-keygen
可以生成几种类型的认证密钥,包括RSA、DSA、ECDSA、ED25519等。生成的密钥对包括一个私钥和一个公钥。私钥必须保密,而公钥可以公开。当你想要通过SSH连接到一个服务器时,你可以将你的公钥添加到服务器的授权密钥列表中。然后,当你尝试连接时,服务器会使用你的公钥来加密一个挑战消息,只有持有相应私钥的人才能解密。这样,服务器就可以确认你是你声称的人,而无需你发送密码。-t rsa
:指定要生成的密钥类型为RSA。-b 2048
:指定密钥长度为2048位。在生成RSA密钥对时,你可以选择密钥的长度。密钥的长度决定了加密的强度:密钥越长,破解的难度就越大。然而,密钥长度的增加也会导致加密和解密的计算复杂度增加,因此需要在安全性和性能之间找到一个平衡。2048位是目前广泛接受的RSA密钥长度。它提供了足够的安全性,同时在大多数系统上的性能也是可以接受的。对于大多数用途来说,2048位的RSA密钥已经足够安全。
然而,如果你正在处理极度敏感的信息,或者你的系统可以承受更高的计算负载,你也可以选择使用更长的密钥,如3072位或4096位。但是,这可能会导致性能下降,并且在许多情况下,2048位的密钥已经足够安全。
需要注意的是,随着计算能力的提高,未来可能需要更长的密钥来保持相同的安全级别。因此,你应该定期评估你的加密需求,并在必要时更新你的密钥。
-C "your_email@example.com"
:添加一个注释,"your_email@example.com"
就是你添加的注释。当然,你可以将这个字符串替换为任何有助于你识别密钥的信息。注释并不会影响密钥的功能,它只是一个标签,用于帮助你管理你的密钥。
按回车键,你将被提示输入一个文件名,这将是你的私钥文件的名称。如果你只是按回车键而不输入任何内容,那么私钥将被保存在默认的.ssh/id_rsa
文件中。
你将被提示输入一个密码。这是一个可选步骤,如果你不想为你的私钥设置密码,你可以直接按回车键,如果设置了密码以后每次ssh登录时都要输入密码。
2. ECDSA
ssh-keygen -t ecdsa -b 256
-t ecdsa
指定了密钥类型为ECDSA。-b 256
指定了密钥长度为256位。这是因为ECDSA密钥通常使用256位长度,这提供了足够的安全性,同时保持了良好的性能。- 你也可以向上面RSA一样加一个注释,这是可选的。
其余步骤一样。
3. ED25519
ssh-keygen -t ed25519
-t ed25519
指定了密钥类型为ED25519。为什么没有指定密匙长度?Ed25519是一种公钥加密算法,它使用的是Edwards曲线数字签名算法(EdDSA)。Ed25519的设计者已经为它选择了一个特定的曲线(edwards25519),并且已经设定了一个固定的密钥长度(256位)。这是因为Ed25519的设计目标之一就是提供一种既安全又高效的加密算法,而256位的密钥长度在安全性和效率之间提供了一个很好的平衡。
因此,当你使用
ssh-keygen
生成Ed25519密钥对时,不需要(也不能)指定密钥长度。注释是可选的。
其余步骤一样。
部署公钥?
登录服务器,然后把之前生成的公钥(默认是在~/.ssh/
下一个后缀为.pub
的一个文件中,比如你是用的RSA
,就是id_rsa.pub
,如果是ED25519
就是id_ed25519.pub
,用记事本打开)复制到服务器的~/.ssh/authorized_keys
中,如果没有则需要自己创建。