3

我最近阅读了以下 SO 问题。

在网络主机上存储密码或私钥的最佳方式是什么?

在撰写本文时,它提到了加密的连接字符串(用于 ASP.NET 应用程序)或使用数据保护 API (DPAPI)。对于该用户的特定用例,两者似乎都是很好的解决方案。

但是,传统上,我总是将敏感的配置值(如密码和连接字符串)存储在正在使用它们的服务器上的用户环境变量中。这些很容易定义、更改和阅读(从 IT 角度来看)。无论使用何种框架或语言,它们也很容易访问。

问题是:将敏感数据存储在 Windows 用户环境变量中是否是一种好习惯,如果不是,为什么?

编辑:

根据 Ken 的评论,一个先决条件应该是:Windows 注册表内容是否加密?

4

2 回答 2

7

您在用户或系统环境中存储的任何内容都以明文(非加密)形式存储在 NTUSER.DAT 和 SYSTEM 注册表文件中。它们不仅可以使用十六进制编辑器读取,甚至可以使用简单的文本编辑器或使用 grep 读取,如果您使用众多工具之一从注册表文件中解析/提取数据,则更容易。

示例(Windows 2008 Server,使用 RIP Linux 完成转储):

这是环境变量对话框,我设置了一个用户变量(MySecretPassword=NobodyCanReadThis)和一个系统变量(MySystemSecret=NobodyCanReadThisEither): Windows 环境变量对话框,包含一个用户和一个系统变量

这是在安装 Windows NTFS 分区并在管理员目录中查找 NTUSER.DAT 文件后,在 Linux 中使用 hexedit 时的样子。您可以轻松搜索用户环境变量名称,并以明文形式找到其内容: NTUSER.DAT 的十六进制转储

这是 Windows\System32\Config 目录中的 SYSTEM 注册表文件。同样,您可以轻松搜索变量名称。在这种情况下,变量的值在变量名后面几个字节,但很容易发现: 系统的十六进制转储

于 2012-06-28T00:45:22.913 回答
1

除了上面的答案,你可以用不同的用户登录,使用Sysinternals Process Explorer之类的工具来查看正在运行的进程。其中一个选项卡列出了进程正在运行的环境变量,包括不那么机密的用户环境变量。

当我看到这一点时感到震惊,现在已更改为使用只有运行该进程的用户才能访问的安全文件。

于 2015-06-26T09:40:59.903 回答