假设我之前创建了一个私钥/公钥组合,并且当时决定不使用密码保护私钥。如果我后来决定“加强”安全性并改用受密码保护的私钥,我是否需要生成一个新的私钥/公钥对,或者我可以简单地将密码添加到我现有的私钥?
是否也可能相反,我可以从现有私钥中“删除”密码吗?
假设我之前创建了一个私钥/公钥组合,并且当时决定不使用密码保护私钥。如果我后来决定“加强”安全性并改用受密码保护的私钥,我是否需要生成一个新的私钥/公钥对,或者我可以简单地将密码添加到我现有的私钥?
是否也可能相反,我可以从现有私钥中“删除”密码吗?
提醒一句:正如laverya的回答中所述, openssl 以一种(取决于您的威胁模型)可能不再足够好的方式加密密钥。
当然,您可以稍后添加/删除密码。
添加一个(假设它是一个rsa
键,否则使用dsa
)
openssl rsa -aes256 -in your.key -out your.encrypted.key
mv your.encrypted.key your.key
chmod 600 your.key
-aes256
告诉使用openssl
AES256 加密密钥。
正如 ArianFaurtosh 正确指出的那样:对于加密算法,您可以使用aes128
, aes192
, aes256
, camellia128
, camellia192
, camellia256
, des
(您绝对应该避免使用),des3
或者idea
去掉它
openssl rsa -in your.key -out your.open.key
通过省略-aes256
您告诉openssl
不要加密输出 的最后一次,您将被要求输入密码。
mv your.open.key your.key
chmod 600 your.key
虽然当时Guntbert 的回答很好,但它已经有点过时了。openssl rsa -aes256
使用密码的 md5 哈希作为加密密钥创建加密文件,该密钥比您预期的要弱- 并且根据您的观点,实际上可能比纯文本更糟糕。(如果您对 ssh 密钥和登录名使用相同的密码,破解 md5 哈希将比攻击快得多,但是您的系统会存储密码 - 除非 Windows XP 之类的东西)
现代解决方案是使用ssh-keygen -p -o -f PRIVATEKEY
,它允许您输入密码,然后用加密版本覆盖现有的私钥。这使用 bcrypt pbkdf,即使在默认的 16 轮运行时,它也比 md5 慢得多。在这种情况下,“慢得多”是指在十分之一到半秒之间,而不是百万分之一秒 - 登录时您不会注意到这一点,但在破解密码时会有很大的不同。
当私人“受密码保护”时,它仅意味着存储在某处的密钥字节使用密码派生的对称密钥进行加密。私钥很容易编码为字节序列,并且可以像任何文件一样被复制、加密和解密。这里重要的一点是密码是关于存储的:当要使用私钥时(例如签名),首先在某些计算机的 RAM 中对其进行解密,然后继续使用未加密的私钥钥匙。相应地,在 RSA 密钥对中没有什么特别之处可以使它适合或不适合密码保护。密码保护确实是一个正交问题。
当然,如果私钥曾经存储在没有任何额外保护的物理介质(例如硬盘)上,那么它可能会在那里留下可利用的痕迹。细节很大程度上取决于实际用于私钥存储的系统。例如,Windows 系统使用DPAPI来存储用户的私钥,并且 DPAPI 在不让存储的密钥泄漏方面做出了一些额外的努力(这些努力是否成功还有待证明)。
openssl rsa
仅支持 RSA 密钥,并且其加密容易受到暴力破解。
更好用openssl pkcs8
- 它使用密钥派生功能并支持 RSA、ECC 和 Ed 密钥:
openssl pkcs8 -topk8 -in source.key -out encrypted.key
为了获得更好的安全性,请使用 scrypt KDF:
openssl pkcs8 -topk8 -scrypt -in source.key -out encrypted.key
要解密 pkcs8 加密密钥,请使用 openssl pkcs8 -in enc.key -out dec.key