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

C# GUID是(临时)加密的好密钥吗?,c#,.net,encryption,guid,C#,.net,Encryption,Guid,我正在生成一个加密密钥来加密一些敏感数据。我正在使用guid作为密钥生成器。这些钥匙够结实吗 注意:它仅在20分钟内敏感。否。可以预测GUID键,至少可以预测由.NET/WinAPI生成的GUID键。还要记住,GUID甚至没有真正的128位随机性,因为版本号是固定的。这首先会给你一个非常弱的键 更糟糕的是,GUID算法的几个版本存在可预测性问题。关键是guid不是随机创建的,但是它们遵循某些规则,使得guid实际上不可能发生冲突 正如在评论中所讨论的,GUID V1存在隐私问题(或者,反过来说,

我正在生成一个加密密钥来加密一些敏感数据。我正在使用guid作为密钥生成器。这些钥匙够结实吗


注意:它仅在20分钟内敏感。

否。可以预测GUID键,至少可以预测由.NET/WinAPI生成的GUID键。还要记住,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);
您可能需要参考:

--显示备选方案,并在注释中提供指向Wikipedia的链接:

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


考虑使用这个或等效的随机字符串生成器:

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

,guid在加密方面不安全。它们遵循一种非常可预测且有良好文档记录的模式,而且就真正安全的密钥而言,它们相当短。但更重要的是,这样做是在滥用guid。这不是他们设计的目的。它们是全局唯一的标识符。你能得到的唯一保证就是每一个都是独一无二的。一个老练的黑客会把孩子玩的反向工程变成一个指南


请改用提供的功能。这就是他们设计的目的。请仔细阅读。

让我想起了这一点:。严肃地说,你可能希望使用一种模式和格式不太可预测的工具生成密钥。你可能想看看Raymond的博文和这个问题之间唯一的共同点是,他们都在谈论GUID…@Jamie:GUID不再基于MAC地址,很长一段时间都没有了。阴谋论者认为这是老大哥追踪他们的一种方式。@Jamie:哈哈,很抱歉!这不是我的本意。不过,请尊重雷蒙德的博客。我也抓住每一个机会链接到它。如果有更多的开发人员阅读,我们的境况会好得多。有些东西(比如那个特殊的帖子)只具有历史意义。但是其他东西都有实际的、现实世界的应用程序,任何一个从事Win32编程的人都应该把它放在心上。guid是一个安全的随机变量number@Neil但这取决于它们是如何产生的。有些算法确实使用了机器信息,如果你知道的话,至少可以让暴力攻击更快。现在有了链接——实际来源是俄语,加密不是一件容易的事。但是,由于算法必须满足许多约束条件,因此它的加密性不强听起来很合理。@Paul:这就是我所指的“几年前”部分。@Neil:我编辑了我的答案。几年前的部分是guidv1,但问题仍然存在,因为GUID本来就不是随机的,所以它们必须知道以前的状态以防止冲突。所以GuidV4仍然是可预测的(尽管不容易)。喜欢它。我如何在C#中使用它?是的,这是一个好问题,因此需要编辑!我确信.NET.Correct有相当的库。GUID仅表示128位信息,而不考虑字符串或数字存储格式。一个好的键应该比这个长。+1,因为GUID有一个特定的唯一性目的。然而,我不认为这是V4 guid的“儿童游戏”(更多信息)@Simon:那么,你一定不是一个“老练”的黑客。;-)也许这有点夸张,但这并不是一个特别相关的问题,所以我就不说了。GUID的实际熵甚至更低,因为至少保留了一个字节(用于版本号)。