需要硬编码密码

Zai*_*mir 2 c# encryption passwords winforms

我正在执行此应用程序,它取决于存储在xml文件中的设置.此文件应加密,其中的值由负责创建应用程序设置的人员提供,并用于根据用户安装的版本确定可用的功能选项.

我需要一种方法来存储在我的软件中硬编码的密码,以便能够在运行时解密该文件并读取其中的值以查看用户可以访问的应用程序的哪些功能.

请记住,不应编辑此文件,并将其作为软件的一部分提供.

我没有提供任何代码,因为它更多的是设计问题而不是编码问题.

我知道硬编码密码是愚蠢的,但我没有选择.

Ser*_*rvy 8

如果您将应用程序提供给不值得信任的用户(即这是一个桌面应用程序,而不是用户无法直接访问的[ASP]服务器上运行的代码),那么您无能为力.

如果您将代码提供给将解密配置文件的用户,则在某些时候,他们将能够自己访问该文件.如果你投入时间/精力/金钱,你可能会变得更难,甚至可能更难,但你不能让它变得不可能.以下是他们可以做的一些事情:

  1. 反编译程序并查找password = "12345"代码行.
  2. 监控程序的内存; 看看它何时加载XML文件,并尝试在内存中找到它的解密版本.
  3. 找到您读取解密的XML文件的代码部分,并相应地执行一些操作并更改代码,以便它始终执行任何他们想要的操作,而不管文件中的内容(实际上只是注释掉if检查).

您可以采取一些措施来使上述步骤更难(但并非不可能)包括:

  1. 模糊你的代码.
  2. 签署您的代码.
  3. 做随机无意义的东西以试图混淆是代码嗅探器(例如通过拥有3个文件来玩shell游戏,全部读取它们,然后解密它们,然后实际上没有使用它们中的2个.
  4. 将配置文件发送到您的Web服务进行解密,而不是在本地解密.(这可以通过嗅探网络获取解密结果来解决).
  5. 拥有一个您查询的Web服务,以查看用户是否有权执行您想要的操作(同样,这可以通过嗅探/欺骗网络连接来解决).

现在,有可能实际上阻止用户做"某事",取决于"某事"是什么,而不是给他们首先做的代码.这些(可能;如果编码正确)牢不可破:

  1. 在服务器上完成工作.
    1. 有一个Web服务,可以完成一些敏感的工作.桌面应用程序仅管理UI或其他非敏感任务.如果您这样做,用户只能破坏您提供的代码.
    2. 使整个应用程序成为一个网站,或其他基于服务器的应用程序(即想到MMORPGS),如果没有服务器它根本不起作用; 它几乎完成了所有敏感(和非敏感)的工作.

请注意,唯一真正的解决方案需要在使用应用程序时为所有用户提供互联网连接; 他们无法离线.