GUID是(临时)加密的好钥匙吗?

时间:2011-06-07 15:22:58

标签: c# .net encryption guid

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

注意:它只对20分钟敏感。

4 个答案:

答案 0 :(得分:19)

没有。可以预测GUID键,至少是由.NET / WinAPI生成的键。还要记住,GUID甚至没有真正的128位随机性,因为版本号是固定的。这首先给你一个非常弱的关键。

更糟糕的是,GUID算法的几个版本具有可预测性。关键是GUID不是随机创建的,但它们遵循某些规则,使GUID几乎不可能发生碰撞。

正如评论中所讨论的,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/

答案 1 :(得分:16)

,GUID在加密方面不安全。它们遵循极其可预测且记录良好的模式,就真正安全的密钥而言,它们相当短。但更重要的是,你这样做是在滥用GUID。这不是他们的设计目标。它们是全球唯一的标识符。您获得的唯一保证是每个唯一。一个老练的黑客会让孩子玩逆向工程成为GUID。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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