在Windows用户环境中存储密码变量是不是很糟糕?

时间:2012-06-27 22:56:18

标签: encryption passwords sysadmin windows-server

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

What's the best way to store a password or private key on a web host?

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

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

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

编辑:

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

2 个答案:

答案 0 :(得分:6)

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

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

这是Environment Variables对话框,我设置了一个User变量(MySecretPassword = NobodyCanReadThis)和一个System变量(MySystemSecret = NobodyCanReadThisEither): Windows Environment Variables dialog, with one user and one system variables

在安装Windows NTFS分区并在Administrator目录中查找NTUSER.DAT文件之后,这就是Linux中使用hexedit的方式。您可以轻松搜索用户环境变量名称,并以明文形式查找其内容: hexdump of NTUSER.DAT

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

答案 1 :(得分:1)

In addition to the above answers, you can log in as a different user and use a tool such as Sysinternals Process Explorer to look at the running process. One of the tabs lists the environment variables that the process is running with including the not so secret user environment variables.

Was shocked when I saw this and have now changed to use a secured file only accessible by the user running the process.