【问题标题】:Protect Password From Decompilation保护密码不被反编译
【发布时间】:2012-05-09 11:26:16
【问题描述】:

我有通过预定用户名和密码连接到 SqlServer 的程序。 例如:

static void Main(string[] args)
{
    string UserName, Password;
    UserName = "Name";
    Password = "Pass";

    SqlConnection conn = new SqlConnection("...");
}

如何保护密码不被反编译?

【问题讨论】:

  • 你不能。你能做的最好的就是混淆它,但是使用像 C# 这样的语言,你可以将可执行文件/库反汇编成几乎与它编译的确切代码一样,这不会有多大好处。
  • @WillVousden 任何语言都可以从字节码中反汇编。结果不像反汇编 IL 那样干净,但它仍然可读。这就是加密的用途。
  • @Danny:那么您将加密密钥存储在哪里?
  • @WillVousden 您可以在运行时从安装周围的字节构建解密密钥。
  • @DannyVarod:是的,但它必须根据源代码中的某些规则存储或生成,任何拥有 ILDASM 副本的人都可以轻松获得。

标签: c# .net passwords password-protection


【解决方案1】:

如果此程序将始终在同一台计算机上运行,​​您可以将此信息放在配置文件 and use DPAPI to encrypt it 的 connectionStrings 部分。

【讨论】:

    【解决方案2】:

    加密您的密码是一回事。如果您问我,在您的数据库上拥有一个专门的用户,并且只对数据库对象拥有一组必要的权限,这是另一个更重要的问题。

    【讨论】:

      【解决方案3】:

      首先不要这样做。安全系统旨在保护用户免受试图让用户运行不良代码的攻击者。它并非旨在保护您的程序免受其用户的侵害,而这正是您正在尝试做的事情。

      出于多种原因,将用户名和密码硬编码到可执行文件中是最糟糕的做法。首先,因为它授予拥有您的程序的人访问数据库的权限,而不是获得授权的人。其次,这意味着如果您需要更改用户名或密码,则需要重新发布程序。第三,如果密码确实泄露了,并且只需要泄露一次,会发生什么?您无法将访问权限仅限于攻击者。

      更好的解决方案是要求每个用户都有自己的帐户;让他们输入密码。或者将数据库访问与其他一些身份和授权方案集成,例如 Windows 身份验证或其他。

      【讨论】:

      • 这仍然使数据库保持打开状态,供注册用户以任何方式查看和使用。更好的解决方案是不直接访问数据库 - 远程存储并仅通过特定 API 启用访问。
      • @DannyVarod,这就是数据库服务器能够设置权限的原因。这些可以设置为只允许 X 组中的用户运行一组存储过程 Y 等。有时需要一个特定的 API(可能实现为 SOAP 服务),但有时它是矫枉过正=)
      猜你喜欢
      • 2011-08-29
      • 2010-10-01
      • 2016-10-29
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 2012-03-26
      • 2010-10-22
      • 1970-01-01
      相关资源
      最近更新 更多