在源代码中存储加密密钥的安全性如何?

时间:2011-10-16 16:11:08

标签: c# .net encryption cryptography obfuscation

此加密类是否足够安全?或者有人可以反汇编我的二进制文件来找到密钥和IV吗?我正在使用它来删除许可证文件,因此它不容易被破坏是非常重要的。

internal static class Encryptor
{
  // Actual values are put here in my source
  private static readonly byte[] Key = { 0, 0, 0, 0, 0, 0, 0, 0 };
  private static readonly byte[] Iv = { 0, 0, 0, 0, 0, 0, 0, 0 };

  internal static String Encrypt(string source)
  {
    var des = new DESCryptoServiceProvider();
    var enc = des.CreateEncryptor(Key, Iv);
    var b = Encoding.ASCII.GetBytes(source);
    var encId = enc.TransformFinalBlock(b, 0, b.Length);
    return Convert.ToBase64String(encId);
  }

  internal static string Decrypt(string encrypted)
  {
    var des = new DESCryptoServiceProvider();
    var dec = des.CreateDecryptor(Key, Iv);
    var b = Convert.FromBase64String(encrypted);
    var decId = dec.TransformFinalBlock(b, 0, b.Length);
    return Encoding.ASCII.GetString(decId);
  }
}

这类似于this questionthis one,但似乎都没有明确的答案(据我所知 - 我承认自己是这个主题的完全初学者)。请指教。 :)

3 个答案:

答案 0 :(得分:6)

是的,这很容易被打破。任何具有Reflector(或ILSpy,或dotPeek,或......)等工具知识的开发人员都可以轻松识别加密功能并找到密钥。拥有程序集的人甚至可以直接调用Decrypt,而无需提取密钥。

它足够安全吗?这取决于,只有你能回答这个问题。如果这是用于许可,则相当于在盒子上贴上“不要复制我的软件”。另一方面,为经验丰富且坚定的攻击者制定一个难以破解的强大许可方案是一项艰巨的任务,您可能需要考虑是否值得付出努力。就个人而言,我会花时间让软件变得如此棒,以至于人们会想要付出代价,而不是阻止少数坏人使用未经许可的软件。

答案 1 :(得分:3)

不,这不安全。即使是混淆,也很容易打破。有人可以很快地制作 keygen

您可以使用公钥加密解决密码密钥问题,因此只有公共部分才会包含在程序集中(并且您将私钥保留给自己)。

OTOH有人可以用它自己替换这个公钥......(制作补丁 keygen 。)所以你需要更多来保护你的代码,例如代码签名会有所帮助。

创建安全的DRM并非易事(实际上IMO不可能)。你可以投入比花费更多的时间(让其他人破解它)。所以你可以:

a)使用一个简单的保持诚实的人诚实;

b)创建或购买(比你自己的便宜)一些复杂的解决方案,但不是100%安全 - 但这可以给你一些额外的安全时间来销售你的应用程序;

答案 2 :(得分:-1)

很容易从编译的程序集中窃取密钥 您需要使用非对称加密(RSA)。

接下来,您将询问如何阻止人们修改程序集以放入自己的公钥,或者删除整个许可证检查。