使用SSH密钥加密和解密密码
我的Python脚本(Python 2.6,运行在Debian Linux上)会询问用户输入密码,然后把这个密码保存在用户的主目录里。
因为我不想把密码以明文形式保存,所以我想找个方法来加密它。我想,也许可以用用户的私钥来加密和解密保存在文件里的密码,这样只有拥有私钥的人才能解密这个密码。
用私钥来做这个主意好吗?我该怎么用这个密钥在Python中加密一个字符串呢?
(顺便说一下,我不想用像keyring这样的东西)
编辑
好吧,我明白用用户的ssh密钥来做这种事情是个坏主意。现在我改用base64编码,就像这里描述的那样: 如何用Python对字符串进行编码和解码,以便在URL中使用? 当然,当有人查看我的Python脚本时,这种方法并不安全。但对我来说,能不把密码以明文保存就已经足够了。
2 个回答
使用私钥来做这个合适吗?
不合适:
- 私钥本身可以设置密码保护。
- 随便读取用户的秘密钥匙是不礼貌的。
- 私钥可以被更改,而不需要考虑你的脚本。
你似乎在混淆一些术语。你提到了编码
、解码
和哈希
,但我想你其实是想说加密
和解密
。
正如Dave Webb所指出的,你的前提是私钥文件对用户是只读的,但它本身并没有加密。你只是把保护从“文件系统用户只读”变成了“由另一个用户只读的文件保护”。
唯一确实值得做的事情就是存储一个只有用户能读取的文件。
你提到使用ssh密钥的理由大概是这样的:
- 我需要存储一个密码,所以我会对它进行加密。
- 如果我用用户的ssh密钥来加密,这样即使有人拿到了我的脚本源代码,也无法解密密码,因为只有用户能读取他们的ssh密钥。
如果你把加密后的密码存储在一个只有用户能读取的文件里,你就能获得和使用ssh密钥一样的好处,而且根本不需要去处理用户的ssh密钥。
我同意不把密码以明文形式存储是有好处的,这样可以防止以root
身份登录的人直接执行:
cat secret-password
来获取密码,但要记住,找到你Python脚本中那行:
password = decrypt-password(data)
是很简单的,然后添加以下一行:
print "The user's password is",password
像os.fchown()
这样的函数可以保护文件,或者一开始就用正确的权限创建文件也可以。
你可以base64
编码密码,这样它就不是明文了,但如果我们假设攻击者可以读取和编辑你的脚本,唯一能保护用户的就是攻击者无法读取包含加密密码的文件。
如果你真的很担心这个问题,可以在每次运行脚本时都提示用户输入密码。