Encryption 在Windows用户环境变量中存储密码是否是一种不良做法?

Encryption 在Windows用户环境变量中存储密码是否是一种不良做法?,encryption,passwords,sysadmin,windows-server,Encryption,Passwords,Sysadmin,Windows Server,我最近读了下面的问题 在撰写本文时,它提到了加密的连接字符串(用于ASP.NET应用程序)或使用数据保护API(DPAPI)。对于这个用户的特定用例,这两种方法似乎都是很好的解决方案 但是,传统上,我总是将敏感的配置值(如密码和连接字符串)存储在使用它们的服务器上的用户环境变量中。这些很容易定义、更改和阅读(从IT角度)。无论使用何种框架或语言,它们都很容易访问 问题是:将敏感数据存储在windows用户环境变量中是否是一种良好的做法?如果不是,原因是什么 编辑: 根据Ken的评论,一个先决问

我最近读了下面的问题

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

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

问题是:将敏感数据存储在windows用户环境变量中是否是一种良好的做法?如果不是,原因是什么

编辑:


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

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

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

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

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

这是Windows\System32\Config目录中的系统注册表文件。同样,您可以轻松地搜索变量名。在本例中,变量的值在变量名后几个字节,但很容易发现:

除了上述答案之外,您还可以以其他用户身份登录,并使用Sysinternals Process Explorer等工具查看正在运行的流程。其中一个选项卡列出了进程运行时使用的环境变量,包括不太机密的用户环境变量


当我看到这一点时感到震惊,现在已改为使用仅可由运行进程的用户访问的安全文件

是什么让你相信用户evnv。VAR有“某种程度的加密”?以不同的用户身份登录,使用
控制面板
为该用户创建一个环境变量(类似
DUMMYVAR=Somedumbthing
的功能在接下来的步骤中非常有效),以管理员身份登录,并从
regedit
中搜索注册表中的
DUMMY
。我可以找到它并用纯文本阅读
一些愚蠢的东西
。您希望您的凭据以这种方式存储吗?使用强加密或
DPAPI
实际上可以保护数据。“安全性”和“易于访问”通常是对立的,这是有充分理由的。我希望管理员用户能够读取所有环境变量。我的意思是注册表本身有一些加密措施。i、 e.如果硬盘被物理窃取,您无法读取存储在硬盘上的环境变量(纯文本)。同样,基于无证据的事实。:-)您是否尝试过使用十六进制编辑器从硬盘恢复Windows注册表文件?我将相信经过验证的真正的加密技术,而不是偶然的机会,谢谢。谢谢你花时间来明确说明这一点。在问这个问题之前,我不应该假设注册表是加密的。不客气。我测试了它,因为我也想知道这是否是个好主意。我仍然认为您可以在那里存储一些数据(可能是包含密码的文件的位置),但肯定不能存储机密。顺便说一句,这个服务器安装了PHP,并且本例中的系统环境变量是使用phpinfo()可见的,因此如果您允许未受信任的用户上载脚本,他们也可以访问环境。