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

鲍勃·特威

如果这是一个愚蠢而明显的问题,请原谅我,但是我在搜寻正确的资源时遇到了麻烦。我不是安全专家,并且正在努力了解如何正确执行此操作。

这是场景。我有一个内部的服务器上的内部应用程序:不是东西,会永远走出去客户现场。该应用程序具有用于与安全Web服务进行通信的用户名和密码对的数据库。我不需要对同事保密这些密码,但是我想保护它们,以防服务器受到攻击和数据被盗。

传统上,他们会撒盐和哈希。我原则上理解这是一个过程,但这取决于用户输入密码,然后可以针对存储的哈希值对密码进行验证。对我来说不是这样。

因此:到处搜索各种解决方案,这些解决方案使用固定的“密码”来保护字符串。这是一个示例,https://stackoverflow.com/a/10177020/271907,这是另一个https://stackoverflow.com/a/10366194/188474

但是,据我所知,这两种方法都无法提供有用的解决方案。该“密码”将必须存储在某个地方,以便我的应用程序执行其工作。如果我将其硬编码到应用程序中,则可以对其进行反向工程。如果我将其加密并放在单独的文件中,则可以使用彩虹表将其窃取并算出。

我考虑使用reg_iis来按照使用ASPNET_REGIIS加密Web Config来加密密钥,但是老实说,这让我更加困惑。我什至不确定这些加密的配置文件是否可以在计算机之间移植,或者我是否必须在开发与测试以及实时运行之间重新加密。我也不知道它们的安全性:AFAIK的某处必须有一个钥匙,如果有钥匙,它可能会被破坏。

为了进一步弄清水,我找到了不使用键的答案:https : //stackoverflow.com/a/10176980/271907但是作者承认这已经过时了,我不知道结果的安全性。

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

基思

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

您可以通过不将解密密钥存储在代码中来增加难度,但是无论您在何处放置解密密钥,都有可能破坏代码的黑客也可以访问它可以访问的任何内容。

即使您的应用程序安全性是坚不可摧的,您的密码在数据库中仍然是纯文本,如果遭到破坏,则会暴露出许多用户。

话虽如此-这是一个仅限内部使用的低风险系统。最好的做法可能是让老板知道相对风险与适当安全性的成本,并让他们进行明确的业务电话(并承担任何未来的责任)。

做到这一点而又不会在安全性上留下漏洞唯一方法是使用单向算法对密码进行哈希处理和添加盐分。当前的密码是纯文本,这一事实不成问题-有很多方法可以推动用户对其进行加密,但是最简单的方法就是为他们进行加密:下次用户登录时,如果他们具有纯文本密码加密它。然后,经过适当的等待(取决于用户登录的频率),删除旧密码并对照新哈希进行检查。

黄金法则是:如果存储密码,则必须以无法撤消的方式对它们进行哈希处理

唯一的另一种选择是完全不进行身份验证-使用NTLM或AD或OAuth获得一些其他服务来对用户进行身份验证,而只是信任该源。


相反,如果您要保护应用程序使用的凭据,那么您会遇到类似的问题,但重点会转移。如果主机受到威胁,您仍然不能采取很多措施来避免暴露,但是大多数攻击只会将目标文件作为攻击目标。

如果将所有连接详细信息都保留在一个中,web.config或者appsettings.json由于破坏这些文件可能会暴露您的SQL Server或其他服务密码,则可能会出现问题

您可以在这里使用ASPNET_REGIIS它-它使您可以添加IIS可以访问的秘密配置,但是该秘密配置不会与Web文件一起以纯文本格式保存。

在.NET core中,有新功能Microsoft.Extensions.SecretManager.Tools可以执行相同的操作。

两者都为任何应用程序凭证添加了一层保护,否则这些凭证将以纯文本格式存储在磁盘上。攻击者必须破坏计算机才能攻击他们,而不仅仅是文件。

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

但是,您实际上只需要在实时环境中提供额外的保护-在开发或测试沙箱中,您可以只使用纯文本配置,然后使用实时服务器上的加密设置覆盖详细信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在没有用户输入的情况下中断cin while循环

如何在没有用户名的情况下正确实现UserDetailsService?

如何在没有用户交互的情况下初始化全屏

C ++如何仅在一定时间内读取输入?我可以在没有用户按Enter的情况下这样做吗?

如何在没有用户提示UWP C#的情况下添加到日历

如何在没有用户交互的情况下安装Microsoft Edge扩展?

在没有用户输入的情况下从组件更改ngModel时,不会触发ngModelChange

如何在没有用户干预的情况下执行G Suite域范围的授权?

如何在没有用户交互的情况下禁用wifi辅助

如何在没有用户交互的情况下以编程方式构建VI?

如何在没有用户输入的情况下从控制器触发angucomplete-alt的remote-api-handler?

如何在没有用户名和密码的情况下生成access_token

如何在没有用户交互的情况下显示模式QDialog?

在没有用户的情况下创建会话

防止python脚本在没有用户输入任何可选参数的情况下运行

如何在没有用户的情况下获得访问权限

如何在没有用户输入的情况下在外壳脚本中添加PPA?

如何在Xna中使用int在没有用户输入的情况下左右移动字段

如何在没有用户确认的情况下使用force adb进行备份?

如何在没有用户密码的情况下打开Fedora?

laravel 4:如何在没有用户名和密码的情况下登录用户

如何在没有用户输入的情况下使用书签?

我们如何在没有用户输入的情况下创建和关闭UIAlertController?(迅速)

如何在没有用户(只有root)的情况下登录通用Linux发行版?

如何在没有用户通过的情况下获取“ ID”

如何在没有用户输入的情况下对字符串进行拼写检查?

如何在没有用户实例的情况下获取 Active Directory 用户对象类的属性名称?

如何在没有用户输入的情况下使用服务帐户使用 Bigrquery 在 Google Big Query 中进行身份验证

SSIS PGP 解密 - 如何在没有弹出窗口的情况下输入密码?