繁体   English   中英

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

[英]Is it a good idea to store an encryption key as an environment variable?

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

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

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

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

提前感谢您的一些想法。

坦率

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

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

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

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

cat /proc/<pid>/envoron

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

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

请注意,像bash这样的许多 shell 都有内部变量,只有在您使用export功能时才会成为环境变量。 较新版本的bash甚至足够聪明,它们只会在生成孩子时才将它们实际导出到真实环境中。 但是,每次生成任何子进程时,它们都会暴露于其他进程(即使只是grepcat )。

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

一个常见的解决方案是依赖操作系统和文件系统权限:一个只能由其所有者读取的文件只能由所有者访问......以及任何具有管理员权限的人......但无论如何你不能期望受到管理员的保护. 这就是良好的旧.netrc或等效文件背后的基本原理。

自动将(只有所有者可读的)文件读入环境变量是一个密切的变化。 如果具有相同的安全级别并且可以更容易使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM