将 API 密钥存储在环境变量中真的安全吗?

信息安全 密钥管理 贮存 共享主机
2021-08-26 02:32:50

该站点说最好将环境变量中的 API 密钥保留在代码之外。和这里

安全地存储凭证

您应该非常小心以确保您的凭据得到安全存储。如果有人通过 send 或 all 权限获得了您的 api_key 或 access_token,他们将能够从您的帐户中发送所有比特币。

特别是,您应该避免将这些凭据存储在您的代码库(被添加到版本控制中)或数据库中,除非您已安全地加密它们。将凭据与代码库和数据库分开是一种很好的做法。

默认情况下,所有帐户都关闭 API 密钥访问。因此,如果您决定进行 API 密钥集成,则需要先启用它并从那时起采取必要的步骤来安全地存储它。如果您觉得 API 密钥已被泄露,您可以随时重新生成(或禁用它)。

但是,每当程序崩溃时,它通常会将环境作为崩溃报告的一部分发送:

https://lists.launchpad.net/openjdk/msg01149.html

环境变量: ...

那么……那是什么?我不明白为什么在环境中存储密钥比源代码更安全。如果有人进入系统,他们可以访问两者。

2个回答

如果您的计算机无需密码即可使用 API,则信息必须存储在系统的某个位置。将其存储在环境变量中的目的是使您不会将其与源代码一起签入版本控制,但实际上,理想的情况是使用 HSM 或 TPM 之类的东西来存储 API以加密方式获取密钥,您可以通过编程方式检索或将其存储在磁盘上,该磁盘使用使用它的服务或应用程序的帐户凭据加密。

我个人会犹豫是否使用环境变量,但如果您只是担心意外泄露密钥(而不是对有权访问您的盒子的人的本地安全性),那么它是如何分离代码和密钥的一种选择,而不是最好的。

使用环境变量可能是非常糟糕的建议。正如您自己所注意到的,在某些情况下可能会显示环境变量,例如在 PHP 世界中,可能会要求您作为支持过程的一部分提供给第三方的 phpinfo 页面会执行此操作。还要考虑如何以及何时设置环境变量。如果在 Web 服务器启动时设置,则该变量对任何人都可见运行的脚本。当黑客利用网站的弱点存放他们可以运行的任意脚本时(最近估计每天有成千上万的网站遭到破坏),他们可能能够在几秒钟内获得密钥。相反,如果密钥是从代码库的单个且理想情况下模糊的部分中的文件设置的,并且可能是通过受保护的代码或本机代码设置的,那么黑客可能需要更长的时间才能识别密钥。如果您有良好的入侵检测,那么您很有可能在他们能够分析您的站点以找到设置密钥的位置之前阻止它们。披露:我与 ionCube 有关。