Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在没有用户输入密码的情况下在C#中加密和解密敏感信息_C#_Security_Encryption - Fatal编程技术网

如何在没有用户输入密码的情况下在C#中加密和解密敏感信息

如何在没有用户输入密码的情况下在C#中加密和解密敏感信息,c#,security,encryption,C#,Security,Encryption,如果这是一个愚蠢而明显的问题,请原谅,但我在谷歌搜索正确的资源时遇到了麻烦。我不是一名安全专家,我正在努力理解如何正确地进行这项工作 下面是一个场景。我在一个内部服务器上有一个内部应用程序:它永远不会出现在客户端站点上。此应用程序有一个用户名和密码对数据库,用于与安全web服务对话。我没有必要对同事保密这些密码,但我想保护它们,以防服务器受到攻击和数据被盗 传统上人们会把它们腌成盐,然后把它们炸成碎片。这是一个原则上我理解的过程,但它取决于用户输入密码,然后可以根据存储的哈希进行验证。我不是这样

如果这是一个愚蠢而明显的问题,请原谅,但我在谷歌搜索正确的资源时遇到了麻烦。我不是一名安全专家,我正在努力理解如何正确地进行这项工作


下面是一个场景。我在一个内部服务器上有一个内部应用程序:它永远不会出现在客户端站点上。此应用程序有一个用户名和密码对数据库,用于与安全web服务对话。我没有必要对同事保密这些密码,但我想保护它们,以防服务器受到攻击和数据被盗

传统上人们会把它们腌成盐,然后把它们炸成碎片。这是一个原则上我理解的过程,但它取决于用户输入密码,然后可以根据存储的哈希进行验证。我不是这样的

所以:到处搜索有各种各样的解决方案,它们使用固定的“密码短语”来保护字符串。这是一个例子,这是另一个

然而,据我所知,在我的情况下,这两种方法都不能提供有用的解决方案。“通行短语”必须存储在某个地方,我的应用程序才能工作。如果我将其硬编码到应用程序中,它可以进行反向工程。如果我对它进行加密并将其放入一个单独的文件中,它可能会被窃取,并使用彩虹表进行计算

我曾考虑使用reg_iis按照加密密钥,但老实说,这让我更加困惑。我甚至不确定这些加密的配置文件是否可以在机器之间移植,或者是否必须在dev和test以及live之间重新加密。我也不知道它们有多安全:好吧,某个地方一定有钥匙,如果有钥匙,它可能会被打碎

为了使水更加浑浊,我找到了一个答案,这个答案不用钥匙。然而,作者承认这已经过时了,我不知道结果有多安全


有没有什么明智的方法来解决这个问题,而不在安全性的某个地方留下漏洞?

任何解密密码以检查密码的解决方案从根本上来说都是不安全的,因为您的应用程序必须始终知道如何进行解密

不将解密密钥存储在代码中可能会让事情变得更难,但无论您将其放在何处,可能会危害您的代码的黑客可能也可以访问它可以访问的任何内容

即使您的应用程序安全性坚如磐石您的密码在数据库中仍然是纯文本,如果密码被泄露,那么您的许多用户都会被暴露

这就是说,这是一个只有内部的、低风险的系统。你最好的做法可能是让你的老板知道相对风险与适当安全的成本,让他们明确地打电话(并承担未来的任何责任)

要做到这一点而不在安全性上留下漏洞,唯一的方法是使用单向算法对密码进行哈希和盐析。当前密码是纯文本的事实不应该是一个问题——有很多方法可以促使用户对其进行加密,但最简单的方法就是为他们进行加密:下次他们登录时,如果他们有纯文本密码,就对其进行加密。然后在适当的等待(取决于用户登录的频率)后,删除旧密码并检查新的哈希

黄金法则是:如果你存储密码,你必须以一种你无法逆转的方式对密码进行散列

唯一的其他选择是根本不进行身份验证—使用NTLM或AD或OAuth获得其他服务来验证用户,而只需信任该源


相反,如果您希望保护应用程序本身使用的凭据,那么您也会遇到类似的问题,但重点会转移。如果主机受损,您仍然无法避免暴露,但大多数攻击只针对文件

如果您的所有连接详细信息都保存在
web.config
appsettings.json
中,则可能会出现问题,因为泄露这些文件可能会暴露您的SQL server或其他服务密码

这是您可以使用的地方-它允许您添加IIS可以访问的秘密配置,但该配置不会以明文形式保存在web文件中

在.NETCore中,有一种新的方法可以做同样的事情

这两种方法都为任何应用程序凭据添加了一层保护,否则这些凭据将以明文形式存储在磁盘上。攻击者必须破坏机器才能攻击它们,而不仅仅是文件

在这两种情况下,这些配置详细信息不再是可移植的-您必须在每台服务器上重新设置(并重新加密)


但是,您只需要在live-in开发或测试沙盒中提供额外的保护。您只需使用纯文本配置,然后在live server上使用加密设置覆盖详细信息。

“此应用程序有一个用户名和密码对数据库,用于与安全web服务进行对话。”-因此,您必须能够访问明文密码,以便将用户名\密码发送到您想要与之交谈的任何web服务?您能否澄清此上下文?“此应用程序有一个用户名和密码对数据库,用于与安全的web服务对话。我不需要对同事保密这些密码”它是否以纯文本和静态值的形式存储在数据库中?这个问题与用户密码无关。这是关于保护服务帐户凭据的,这是一个根本不同的问题。@Xander我已经修改了答案。