【问题标题】:Is a GUID a good key for (temporary) encryption?GUID 是(临时)加密的好密钥吗?
【发布时间】:2011-09-10 04:28:58
【问题描述】:

我正在生成一个加密密钥,以使用Rijndael (AES) encryption algoritm 加密一些敏感数据。我正在使用 guid 作为密钥生成器。这些键够“强”吗?

注意:只敏感20分钟。

【问题讨论】:

  • 让我想起了这一点:blogs.msdn.com/b/oldnewthing/archive/2004/02/11/71307.aspx。严肃地说,您可能希望使用具有不太可预测的模式和格式的工具生成密钥。
  • Raymond 的博文和这个问题唯一的共同点是他们都在谈论 GUID...
  • @Jamie:GUID 不再基于 MAC 地址,并且已经很久没有使用了。阴谋论者认为这是老大哥追踪他们的一种方式。
  • @Jamie:哈哈,对不起!不是我的本意。不过,请尊重阅读 Raymond 的博客。我也抓住一切机会链接到它。如果更多的开发人员阅读它,我们真的会好很多。有些事情(例如那个特定的帖子)仅具有历史意义。但其他东西有实际的应用,任何从事 Win32 编程的人都应该牢记在心。

标签: c# .net encryption guid


【解决方案1】:

没有。可以预测 GUID 密钥,至少是那些由 .NET/WinAPI 生成的密钥。还要记住,GUID 甚至没有真正的 128 位随机性,因为版本号是固定的。这首先为您提供了一个非常弱的密钥。

更糟糕的是,GUID 算法的几个版本都存在可预测性问题。关键是 GUID 不是随机创建的,而是遵循某些规则,使 GUID 几乎不可能发生冲突。

正如 cmets 中所讨论的,GUID V1 存在隐私问题(或者相反,密钥较弱),因为使用 MAC 地址生成它们。使用 GUID V4,仍然有一些方法可以根据下面的(俄罗斯)来源预测序列。

幸运的是,.NET 具有强大的加密随机生成器。 RNGCryptoServiceProvider 是你的朋友:

RNGCryptoServiceProvider _cryptoProvider = new RNGCryptoServiceProvider();
int fileLength = 8 * 1024;
var randomBytes = new byte[fileLength];
_cryptoProvider.GetBytes(randomBytes);

您可能想参考:

How can I generate a cryptographically secure pseudorandom number in C#? -- 显示替代方案,并在评论中给出了维基百科的链接:

http://en.wikipedia.org/wiki/Globally_Unique_Identifier

在那里,据称(根据维基百科,该页面是俄语的)人们可以预测以前和未来生成的数字:

http://www.gotdotnet.ru/blogs/denish/1965/

【讨论】:

  • 这个“可以预见的”笨蛋多年前就被放在了床上。 GUID 是一个安全的随机数
  • @Neil 这取决于它们是如何生成的。一些算法确实使用机器信息,如果你知道的话,你至少会让蛮力攻击更快。
  • 现在有链接 - 实际来源是俄语,而且密码学并非易事。但由于该算法必须满足许多约束条件,因此它不具有加密强度听起来是合理的。
  • @Paul:我指的是“多年前”部分。
  • @Neil:我编辑了我的答案。几年前的部分是 GUID V1,但问题仍然存在,因为 GUID 本来就不是随机的,所以它们必须知道它们以前的状态以防止冲突。所以 GUID V4 仍然是可预测的(尽管不容易)。
【解决方案2】:

,GUID 不是加密安全的。它们遵循极其可预测且有据可查的模式,并且就真正安全的密钥而言,它们相当短。但更重要的是,您这样做是在滥用 GUID。这不是他们的设计目的。它们是全球唯一的标识符。您得到的唯一保证是它们中的每一个都是独一无二的。一个老练的黑客会将逆向工程的儿童游戏变成 GUID。

请改用System.Security.Cryptography namespace 提供的功能。这就是他们的设计目的。阅读cryptographically secure pseudo-random number generators

【讨论】:

  • 正确。 GUID 仅代表 128 位的 信息,与字符串或数字存储格式无关。一个好的密钥应该比这长。
  • +1 因为 GUID 具有特定的唯一性目的。但是,我不认为这是使用 V4 指南的“儿童游戏”(还有更多关于 msdn.microsoft.com/en-us/library/cc246027.aspx 的内容)
  • @Simon:那么,你一定不是一个“老练”的黑客。 ;-) 也许这是夸大其词,但它不是一个特别相关的,所以我让它保持不变。
  • GUID 的实际熵甚至更低,因为至少保留了一个字节(用于版本号)。
【解决方案3】:

我不会使用 GUID 作为密钥来加密数据。查看 UUID 协议的一些实现:UUID 它们可以被预测,因为它们被计算为唯一的,而不是随机的。我会亲自研究敏感数据的“TripleDESCryptoServiceProvider”等对象的 using System.Security.Cryptography 命名空间。

【讨论】:

    【解决方案4】:

    考虑使用这个或等效的随机字符串生成器:http://msdn.microsoft.com/en-us/library/aa379942%28VS.85%29.aspx

    【讨论】:

    • 爱它。我将如何在 C# 中使用它?
    • 是的好问题,因此编辑!我确信 .NET 有等效的库。
    猜你喜欢
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    相关资源
    最近更新 更多