GUID是(临时)加密的好钥匙吗?
我正在生成一个加密密钥,用Rijndael(AES)加密算法加密一些敏感数据。 我正在使用guid作为密钥生成器。 这些钥匙“足够”吗?
注意:它只对20分钟敏感。
不能。可以预测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);
您可能想参考:
如何在C#中生成加密安全的伪随机数? – 显示替代方案,并在评论中,给出了维基百科的链接:
http://en.wikipedia.org/wiki/Globally_Unique_Identifier
在那里,它声称(根据维基百科,页面是俄语),人们可以预测生成的前一个和未来的数字:
不 ,GUID在加密方面不安全。 它们遵循极其可预测且记录良好的模式,就真正安全的密钥而言,它们相当短。 但更重要的是,你这样做是在滥用GUID。 这不是他们的设计目标。 它们是全球唯一标识符 。 你得到的唯一保证是每一个都是独一无二的 。 一个老练的黑客会让孩子玩逆向工程成为GUID。
请改用System.Security.Cryptography
命名空间提供的function。 这就是他们的设计目标。 阅读加密安全的伪随机数生成器 。
我不会使用GUID来加密数据的密钥。 看看UUID协议的一些实现: UUID可以被预测,因为它们被计算为唯一的,而不是随机的。 我将研究使用System.Security.Cryptography命名空间来获取敏感数据的“TripleDESCryptoServiceProvider”等对象。
考虑使用这个或等效的随机字符串生成器: http : //msdn.microsoft.com/en-us/library/aa379942%28VS.85%29.aspx