C# 此代码生成的ID有多安全?

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

我正在生成一个用于我的应用程序的ID,用户可以在其中相互连接。为了识别,我使用了一个ID,有点像teamviewer。我希望它既独特又加密安全/难以猜测。因此,我生成了一个GUID,以及8字节的安全数据,并将它们简单地连接起来。我的问题是,这个ID专门针对暴力攻击有多安全?ID示例:dKNqrkHImQ9A9ulu8DOvYDLS3x2U8k0d

我的代码:

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