如何模糊字符串常量?

时间:2011-05-16 13:34:03

标签: c# dll obfuscation

我们有一个包含敏感信息的应用程序,我正尽力保护它。敏感信息包括:

  1. 主要算法
  2. 加密/解密算法的密钥
  3. 我一直在研究混淆代码,但它似乎没什么帮助,因为我仍然可以反编译它。但是,我最关心的是,当您对代码进行反编译时,用于加密序列号等的密钥清晰可见,即使它是混淆的。

    有人可以建议我如何保护这些字符串吗?

    我意识到其中一种方法可能是从应用程序本身删除任何解密,虽然这可能部分可能,但有一些功能必须使用加密/解密 - 主要是为了保存配置文件并传递一个“授权”令牌到DLL以执行计算。

7 个答案:

答案 0 :(得分:27)

答案 1 :(得分:24)

如果某人有足够的动力去打破它,那么所有努力都将是徒劳的。即使是最大的软件公司,也没有人能够解决这个问题。

  

我正在尽力保护它

我并不是说这是一个严厉的批评,只是你需要知道你想要实现的目标是不可能的。

混淆是通过默默无闻的安全,它确实有一些好处,因为它会阻止最无能的黑客企图,但主要是浪费的努力可能更好地花在其他开发领域。

在回答您的原始问题时,您将遇到智能编译器的问题,他们可能会自动将字符串拼凑到已编译的应用程序中,从而消除您的一些混淆工作作为编译优化。它也很难维护,所以我会重新考虑你的风险分析模型,也许你会自己解决它可能被破解的事实,如果它有任何价值可能会是。

答案 2 :(得分:6)

我最近阅读了一个非常简单的OP解决方案。

简单地将常量声明为只读字符串,而不是const字符串。那么简单。显然,const变量被写入二进制文件中的堆栈区域,但是以纯文本形式写入,而readonly字符串被添加到构造函数中并写为字节数组而不是文本。

即。如果你搜索它,你将找不到它。

这就是问题,对吧?

答案 3 :(得分:5)

使用自定义算法(security through obscurity?),结合将密钥存储在应用程序中,根本不安全。

如果您要存储某种密码,则可以使用单向散列函数来确保解密数据在代码中的任何位置都不可用。

如果您需要使用对称加密算法,请使用众所周知且经过测试的算法,例如AES-256。但是密钥显然不能存储在代码中。

<强> [编辑]

由于您提到了序列号的加密,我相信您的单向散列函数(如SHA-256)会更好地满足您的需求。

这个想法是将构建时间内的序列号散列到它们的散列表示中,这些表示不能被反转(SHA-256被认为是pretty safe algorithm,比如说MD5)。在运行时,您只需要将相同的哈希函数应用于用户输入,并且仅比较哈希值。这样,攻击者无法获得任何实际的序列号。

答案 4 :(得分:5)

@Tom Gullen给出了正确答案。

我只是提出了一些建议,说明如何让用户更难以访问您的密钥和算法。

至于算法:不要在编译时编译算法,而是在运行时编译。为此,您需要指定一个包含算法方法的接口。该接口用于运行它。然后将算法的源代码添加为加密字符串(嵌入式资源)。在运行时解密它并使用CodeDom将其编译为.NET类。

键:通常的方法是将密钥的扩展部分存储在应用程序的不同位置。将每个部分存储为byte[]而不是string,以便更难找到它们。

如果您的所有用户都有互联网连接:请使用SSL获取算法源代码和密钥。

请注意,所有内容都会在运行时拼凑在一起,任何拥有更多知识的人都可以检查/调试您的应用程序以查找所有内容。

答案 5 :(得分:2)

我认为你不能轻易地混淆字符串常量,所以如果可能的话,不要使用它们:)你可以使用汇编资源,那些你可以加密但你想要的。

答案 6 :(得分:1)

取决于您尝试做什么,但您可以使用非对称加密吗?这样你只需要存储公钥而不需要对它们进行模糊处理。