使用SSH密钥加密和解密密码

4 投票
2 回答
8907 浏览
提问于 2025-04-16 06:58

我的Python脚本(Python 2.6,运行在Debian Linux上)会询问用户输入密码,然后把这个密码保存在用户的主目录里。

因为我不想把密码以明文形式保存,所以我想找个方法来加密它。我想,也许可以用用户的私钥来加密和解密保存在文件里的密码,这样只有拥有私钥的人才能解密这个密码。

用私钥来做这个主意好吗?我该怎么用这个密钥在Python中加密一个字符串呢?

(顺便说一下,我不想用像keyring这样的东西)

编辑

好吧,我明白用用户的ssh密钥来做这种事情是个坏主意。现在我改用base64编码,就像这里描述的那样: 如何用Python对字符串进行编码和解码,以便在URL中使用? 当然,当有人查看我的Python脚本时,这种方法并不安全。但对我来说,能不把密码以明文保存就已经足够了。

2 个回答

2

使用私钥来做这个合适吗?

不合适:

  • 私钥本身可以设置密码保护。
  • 随便读取用户的秘密钥匙是不礼貌的。
  • 私钥可以被更改,而不需要考虑你的脚本。

你似乎在混淆一些术语。你提到了编码解码哈希,但我想你其实是想说加密解密

正如Dave Webb所指出的,你的前提是私钥文件对用户是只读的,但它本身并没有加密。你只是把保护从“文件系统用户只读”变成了“由另一个用户只读的文件保护”。

5

唯一确实值得做的事情就是存储一个只有用户能读取的文件。

你提到使用ssh密钥的理由大概是这样的:

  1. 我需要存储一个密码,所以我会对它进行加密。
  2. 如果我用用户的ssh密钥来加密,这样即使有人拿到了我的脚本源代码,也无法解密密码,因为只有用户能读取他们的ssh密钥。

如果你把加密后的密码存储在一个只有用户能读取的文件里,你就能获得和使用ssh密钥一样的好处,而且根本不需要去处理用户的ssh密钥。

我同意不把密码以明文形式存储是有好处的,这样可以防止以root身份登录的人直接执行:

cat secret-password

来获取密码,但要记住,找到你Python脚本中那行:

password = decrypt-password(data)

是很简单的,然后添加以下一行:

print "The user's password is",password

os.fchown()这样的函数可以保护文件,或者一开始就用正确的权限创建文件也可以。

你可以base64编码密码,这样它就不是明文了,但如果我们假设攻击者可以读取和编辑你的脚本,唯一能保护用户的就是攻击者无法读取包含加密密码的文件。

如果你真的很担心这个问题,可以在每次运行脚本时都提示用户输入密码。

撰写回答