将加密密钥存储为环境变量是个好主意吗?

问题描述 投票:0回答:2

我正在用 Python 3 编写一个命令行应用程序。该应用程序将由不同用户在其本地计算机上运行。应用程序的某些部分需要登录数据库。我想让用户选择存储他们的凭据或每次都输入它们。

为了存储凭据(如果用户选择如此),我想使用在本地计算机上创建并加密的单独文件。为了加密文件,我需要生成一个密钥。

现在我的问题:将加密和解密所需的密钥存储为环境变量是否是一个好主意(我想分发关键信息,而不仅仅是将它们存储在应用程序的另一个文件中)?我应该考虑什么解决方案来存储密钥?是否有不同的环境变量(在安全方面)?

我知道,没有完美的解决方案(尤其是使用本身以纯文本形式存储的 python 脚本),但我想花一些精力来思考这个问题,而不仅仅是使用 .netrc 或类似的东西。

提前感谢您的一些想法。

弗兰克

python python-3.x encryption environment-variables
2个回答
2
投票

不幸的是,此类问题归结为先有鸡还是先有蛋的问题:凭证只能以加密形式存储。并且解密密钥也应该以加密形式存储...

一个常见的解决方案是依赖操作系统和文件系统权限:只有其所有者可读的文件只能由所有者...以及具有管理员权限的任何人访问...但无论如何,您不能指望受到保护行政。这就是旧的

.netrc
或等效文件背后的基本原理。

自动将(仅所有者可读)文件读取到环境变量中是一种密切的变体。如果具有相同的安全级别,可以更容易使用。


2
投票

不要在环境变量中存储任何敏感信息。

具有该用户权限的任何其他进程(特别是作为该用户运行的任何其他进程)都可以查看该用户的所有进程的所有环境变量。具有管理员权限的进程(例如

root
sudo
访问权限)可以查看所有用户的所有环境变量。

这允许任何恶意进程读取其所属用户的所有环境变量,并且任何管理恶意进程通常读取所有环境变量。

在 Linux 中,您可以在以下位置查看这些环境变量:

cat /proc/<pid>/environ

其中

<pid>
是您要“监视”的进程的进程 ID。

顺便说一句,它们每个都由空字符分隔。

请注意,许多像

bash
这样的 shell 都有内部变量,只有当您使用
export
函数时,这些变量才会成为环境变量。较新版本的
bash
甚至足够聪明,它们只在生成子代时才将它们真正导出到真实环境中。然而,每次产生任何子进程时,它们都会暴露于其他进程(即使只是一个
grep
cat
)。

© www.soinside.com 2019 - 2024. All rights reserved.