C# 此代码生成的ID有多安全?
我正在生成一个用于我的应用程序的ID,用户可以在其中相互连接。为了识别,我使用了一个ID,有点像teamviewer。我希望它既独特又加密安全/难以猜测。因此,我生成了一个GUID,以及8字节的安全数据,并将它们简单地连接起来。我的问题是,这个ID专门针对暴力攻击有多安全?ID示例:dKNqrkHImQ9A9ulu8DOvYDLS3x2U8k0d 我的代码:C# 此代码生成的ID有多安全?,c#,cryptography,base64,guid,C#,Cryptography,Base64,Guid,我正在生成一个用于我的应用程序的ID,用户可以在其中相互连接。为了识别,我使用了一个ID,有点像teamviewer。我希望它既独特又加密安全/难以猜测。因此,我生成了一个GUID,以及8字节的安全数据,并将它们简单地连接起来。我的问题是,这个ID专门针对暴力攻击有多安全?ID示例:dKNqrkHImQ9A9ulu8DOvYDLS3x2U8k0d 我的代码: public static string MakeBase64ID() { int postkeylength = 8; //by
public static string MakeBase64ID()
{
int postkeylength = 8; //bytes
byte[] prekey = CreateCryptographicallySecureGuid().ToByteArray();
byte[] postkey = CryptoRandomByteArr(postkeylength);
byte[] ID = new byte[prekey.Length + postkeylength];
Array.Copy(prekey, ID, prekey.Length);
Array.Copy(postkey, 0, ID, prekey.Length, postkey.Length);
return Convert.ToBase64String(ID);
}
public static Guid CreateCryptographicallySecureGuid()
{
return new Guid(CryptoRandomByteArr(16));
}
public static byte[] CryptoRandomByteArr(int length)
{
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buffer = new byte[length];
rng.GetBytes(buffer);
return buffer;
}
它包含64位加密随机性。这取决于野蛮的强迫速度,这是多么安全。如果以每秒100万次的速度完成,则需要
2^64/1e6/86400/365=584942
年。这是非常安全的
如果暴力强迫必须通过互联网,那么速度可能也会下降到每秒100次尝试
64位比大多数密码更安全
从实际的角度来看,我也喜欢这个方案。这是一个很好的生成无法猜测的ID的系统。感谢Uwe Keim在格式化方面的帮助。您可以使用Byte[]->Guid->Byte[],只需将
postkeylength=24
作为一个整体删除Guid,它将执行完全相同的操作。Guid不会为您做任何特别的事情。它只是一种数据类型,您可以临时路由16字节的随机数据。您还可以将其保存在字节数组中。只有在调用Guid.NewGuid()时,指南才是唯一的。如果在同一字节数组中传递两次,它将生成同一guid两次。@ScottChamberlain guid.NewGuid()是v4 guid,严格意义上说它不是唯一的。它只是16个随机字节,就像OP.ok.cool生成的一样。我不确定,因为GUID设计为唯一的,而不是安全/随机的。所以我不知道这是否是一个弱点,或者仅仅增加8个字节就足够了。也谢谢你说你喜欢这个方案,我自己也想到了,即使我重新发明了轮子PWhy 64位,如果它包含24个随机字节(因此,192位)?guid中的第一个位的随机性不能计算在内,guid设计为唯一的,而不是安全的@EvkAnd如果你看第一个函数@zaph的名字,它是base64