我正在用 Python 3 编写一个命令行应用程序。该应用程序将由不同用户在其本地计算机上运行。应用程序的某些部分需要登录数据库。我想让用户选择存储他们的凭据或每次都输入它们。
为了存储凭据(如果用户选择如此),我想使用在本地计算机上创建并加密的单独文件。为了加密文件,我需要生成一个密钥。
现在我的问题:将加密和解密所需的密钥存储为环境变量是否是一个好主意(我想分发关键信息,而不仅仅是将它们存储在应用程序的另一个文件中)?我应该考虑什么解决方案来存储密钥?是否有不同的环境变量(在安全方面)?
我知道,没有完美的解决方案(尤其是使用本身以纯文本形式存储的 python 脚本),但我想花一些精力来思考这个问题,而不仅仅是使用 .netrc 或类似的东西。
提前感谢您的一些想法。
弗兰克
不幸的是,此类问题归结为先有鸡还是先有蛋的问题:凭证只能以加密形式存储。并且解密密钥也应该以加密形式存储...
一个常见的解决方案是依赖操作系统和文件系统权限:只有其所有者可读的文件只能由所有者...以及具有管理员权限的任何人访问...但无论如何,您不能指望受到保护行政。这就是旧的
.netrc
或等效文件背后的基本原理。
自动将(仅所有者可读)文件读取到环境变量中是一种密切的变体。如果具有相同的安全级别,可以更容易使用。
具有该用户权限的任何其他进程(特别是作为该用户运行的任何其他进程)都可以查看该用户的所有进程的所有环境变量。具有管理员权限的进程(例如
root
或 sudo
访问权限)可以查看所有用户的所有环境变量。
这允许任何恶意进程读取其所属用户的所有环境变量,并且任何管理恶意进程通常读取所有环境变量。
在 Linux 中,您可以在以下位置查看这些环境变量:
cat /proc/<pid>/environ
其中
<pid>
是您要“监视”的进程的进程 ID。
顺便说一句,它们每个都由空字符分隔。
请注意,许多像
bash
这样的 shell 都有内部变量,只有当您使用 export
函数时,这些变量才会成为环境变量。较新版本的 bash
甚至足够聪明,它们只在生成子代时才将它们真正导出到真实环境中。然而,每次产生任何子进程时,它们都会暴露于其他进程(即使只是一个 grep
或 cat
)。