C# 在源代码中存储加密密钥有多安全?

C# 在源代码中存储加密密钥有多安全?,c#,.net,encryption,cryptography,obfuscation,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,

这个加密类足够安全吗?或者有人能拆开我的二进制文件找到钥匙和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);
  }
}
这类似于和,但两者似乎都没有一个明确的答案(据我所知——我承认在这个话题上是一个完全的初学者)。请告知。:)

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


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

是的,这很容易被破坏。任何了解Reflector(或ILSpy,或dotPeek,或…)等工具的开发人员都可以轻松识别加密功能并找到您的密钥。拥有该程序集的人甚至可以直接调用
解密
,而不必费心提取密钥


它是否足够安全?这要看情况,只有你能回答。如果这是为了授权,就相当于在盒子上贴上一张标签,上面写着“不要复制我的软件”。另一方面,制定一个强大的授权方案对于一个有经验的、坚定的攻击者来说是很难打破的,这是一项艰巨的任务,你可能想考虑一下是否值得这么做。就我个人而言,我会把我的时间花在让软件变得如此棒上,以至于人们会想为它付费,而不是阻止少数坏人在未经许可的情况下使用它。

不,它不安全。即使有混淆,也很容易打破。有人可以很快地制作一个键盘

您可以通过使用公钥加密来解决机密密钥问题,因此程序集中只包含公共部分(私钥由您自己保管)

有人可以用自己的公钥替换这个公钥。。。(制作一个补丁和一个keygen),因此您需要更多的保护代码,例如代码签名会有所帮助

创建一个安全的DRM不是一件容易的工作(实际上在IMO中这是不可能的)。你可以投入更多的时间(让别人来破解它)。因此,您可以:

a) 用简单的方法让诚实的人保持诚实


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

使用现有的许可证制度;不要再发明轮子了。你知道有什么例子吗?一个IV应该总是,总是,总是随机生成的,并且每个信息都是唯一的。如果您对其进行硬编码,则会在密码流中引入巨大的漏洞。@尼克·约翰逊:这是对产品附带的许可文件进行解码(每个许可文件对采购组织来说都是唯一的)。所以我想我必须硬编码,不是吗?我真的不明白它是怎么工作的。@James不,你需要在加密信息前加上前缀IV。如果您不熟悉此类决策的安全含义,那么您应该使用一个库来处理它,而不是自己滚动。