【问题标题】:plain text password in c# web appc# web 应用程序中的纯文本密码
【发布时间】:2014-03-20 18:17:42
【问题描述】:

如果我在我的一个 c# 控制器中有一个纯文本密码(比如连接到 SMTP 邮件服务器),攻击者无法查看此密码(或服务器的其余部分),我说得对吗?侧代码)除非服务器安全被破坏?

我在共享主机上,所以我无法使用 IIS 来加密 Web 配置(据我所知)。如果这是如此糟糕的做法,是否有人对如何最好地解决此问题有任何建议?

【问题讨论】:

  • 任何可以读取您服务器上文件的人都可以读取该密码。这取决于服务器管理员和配置。
  • 好的,谢谢,所以如果我信任我的托管服务提供商,那我可以吗?
  • @mattbloke:一般规则是,从不以纯文本形式存储密码。 从不。如果它们以纯文本形式存储,则它们不安全。期间。
  • @David:如果需要使用密码,别无选择。加密无济于事,因为服务器无论如何都需要解密它。
  • @mattbloke:为了避免硬编码,我会将它们留在配置文件中。控制器 code 根本不需要在服务器上,但是任何字符串值都可以轻松地从编译后的.dll 中提取出来。对于像这样的服务帐户密码,您至少要确保其他任何地方都没有使用相同的密码。 (例如,不要重复使用您的电子邮件密码或银行密码或类似的东西。)网络服务器确实应该保护对这些文件的访问,如果服务器受到破坏,那么攻击者确实拥有该密码。跨度>

标签: model-view-controller passwords


【解决方案1】:

如果这是非常糟糕的做法,是否有人对如何最好地解决此问题有任何建议?

这是一种不好的做法。虽然您无法阻止可以读取服务器(或备份)上的文件的攻击者弄清楚它(如果他们很好的话,很快),您可以强迫他们花费更多的时间和精力来阅读您的代码/反汇编应用程序和您的配置文件。

您可以自己设置 SMTP 密码吗?在您的配置文件中存储非常多的迭代次数(数百万;这只是启动延迟!),一个真正随机的 ** 8 字节盐,以及一个长而随机的“密码”(二进制更好)。在您的代码中,当应用程序启动时,读取这些值,将 8 个真正随机字节的硬编码字符串添加到 salt(“胡椒”),并使用 RFC2898DeriveBytes 类生成实际的 SMTP 密码(您可以使用可能必须使用 Base64 进行编码)。不要要求超过 20 个字节的 RFC2898DeriveByutes 输出;那就是使用 SHA-1 作为本机哈希。您显然需要在更改 SMTP 密码之前执行此操作:)。

无论您是否能够更改 SMTP,您始终可以加密密码,使用上述 RFC2898DeriveBytes 生成一个 128 位密钥以用于 AES-128,例如 AesCryptoServiceProvider 类(如果您使用 . NET 3.5 或更高版本,这是 .NET 中为数不多的 FIPS 140-2 compliant encryption classes 之一。

如果您想要一种方法来处理此问题,以防止简单地读取文件找出密码,您需要查看诸如 HSM(硬件安全模块)或设备外部的其他安全密钥存储提供程序之类的东西。准备好打开你的钱包!

** 在 .NET 中,使用 RNGCryptoServiceProvider 类生成随机字节以供加密使用。

【讨论】:

  • 感谢您非常详细的回答。我会调查一下,我担心这可能超出我目前的技能范围。在不希望寻求答案的情况下,是否有一个很好的资源可以详细介绍上述大部分/所有内容,我可以逐步遵循?...是的,我可以将密码设置为我想要的任何内容
猜你喜欢
  • 2010-09-08
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 2011-09-21
相关资源
最近更新 更多