许多文章建议使用公钥认证比使用密码更安全。参考文献:http://www.linuxquestions.org/questions/linux-security-4/is-ssh-keys-authentication-more-secure-than-password-authentication-934866/和http://www.spy-hill.net/~myers/help/PublicKey.html。
我不敢苟同。
公钥认证的问题在于它将认证模式从“您知道的内容”转换为“您主文件夹中的内容”。
考虑攻击传播。如果一台机器被攻陷,最好使用基于密码的身份验证将攻击控制在同一台机器内,而不是使用公钥 - 使用公钥会导致每台机器都被攻陷。
我的观点是,如果服务器中没有使用存储密码的脚本,那么进行密码验证和帐户锁定的暴力破解比公钥要强得多。
当存在脚本时 - 1. 确保脚本以尽可能低的权限用户运行,并使用公钥身份验证让脚本访问其他计算机。2. 如果脚本需要 root 权限才能运行,仍然使用相同的非特权帐户,并使用具有 suid 的本地可执行文件(仅脚本可访问)来运行特权命令。
有什么想法吗?
答案1
实际上,使用 PKI 时,如果您发现证书已被泄露,您可以撤销证书。Windows 甚至会强制您在导出私钥时使用密码(私钥会解密使用相应公钥加密的任何内容),因此,当尝试导入要使用的密钥时,攻击者也需要知道密码。更不用说 SHA-512 哈希比“Mike5$ecureP@ssword”更难破解 :-)
答案2
有几个原因使其更安全,但在某种程度上,你是在比较苹果和橘子。首先是一些一般性观察 -
- 密码本质上是不安全的,因为它们的密钥空间(相对)有限,而且人们很难想出真正随机的密码。
- 如果使用了密码,并且任何使用该密码的机器都提供了很大的优势来“暴力破解”密码,因为加密版本是已知的。
公钥/私钥解决了这些问题,如下所示:
他们使用非常大的密钥空间 - 具有合理的位数和足够的随机性,直到宇宙末日之后才能将私钥从公钥中逆转出来[假设单向算法没有太多弱点]
即使您登录的系统(即不是您自己的系统)受到威胁,您的安全模式仍然完好无损。
现在关键的答案是 -
您可能需要修改您的信念,即公钥身份验证“将身份验证模式从“您知道的东西”转换为“您主文件夹中的东西”。虽然您当然可以省略密码短语,但这不是(一般情况下)最佳做法,而且我所知道的所有公钥/私钥系统都支持(并默认要求)密码短语。
总而言之,除非被入侵的机器是你的,否则使用公钥/私钥登录会更安全。如果被入侵的机器是你的,密码对你没有多大帮助,因为它可以在途中被嗅探到!
答案3
有几个原因:
- 密钥可以很容易地限制为某些 IP 地址。它们还可以被限制为执行某些命令,这对脚本很有用(正如您所指出的,脚本要求私钥以未加密的形式存储在您的硬盘上;但是,您可以大大降低该密钥的潜在危险)。您还可以为一个帐户使用多个密钥,允许每个脚本拥有自己的密钥,这样就可以限制密钥。如果您将此与密码短语结合使用你的关键的是,通用登录凭据不会存储在任何未加密的地方。这比将密码以明文形式保存要安全得多,因为这样可以让某人任何事物使用您的帐户。
- 密码会发送到远程服务器,而私钥不会。如果远程服务器被攻破(或其他人冒充远程服务器),这一点很重要:他们可以修改
sshd
密码以窃取密码,但无法窃取您的私钥。 - 如果私钥是密码一旦被破解,更改起来就很容易了。将密码更改为真正安全的密码需要您记住另一个密码。
- 私钥的熵比密码高得多。随机生成的 20 个字符的密码与 2048 位密钥对相比毫无差别。这使得暴力破解比密码破解困难得多。
- 如果您将密钥与密码一起存储,攻击者必须获得两条信息才能获取您的凭据:密钥和密码。如果有人看到您输入密码,他们仍然没有密钥。如果有人窃取了密钥,他们仍然没有密码。如果您对私钥的存放位置非常谨慎,那么窃取文件绝非易事(例如,如果它位于您随身携带的闪存驱动器上,远程攻击者就无法获取它)。