密码随机的独特字符串

Juh*_*gas 4 c# random cryptography unique

答案中,发布了以下代码,用于创建唯一的随机字母数字字符串.有人可以向我澄清他们在这段代码中是如何确保它们的独特性以及它们在多大程度上是独一无二的?如果我在不同的场合重新运行这种方法,我还会得到独特的字符串吗?

或者我只是误解了答案,这些根本没有生成唯一的密钥,只是随机的?

我已经在对该答案的评论中询问了这一点,但用户似乎处于非活动状态.

    public static string GetUniqueKey()
    {
        int maxSize = 8;
        char[] chars = new char[62];
        string a;
        a = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
        chars = a.ToCharArray();
        int size = maxSize;
        byte[] data = new byte[1];
        RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
        crypto.GetNonZeroBytes(data);
        size = maxSize;
        data = new byte[size];
        crypto.GetNonZeroBytes(data);
        StringBuilder result = new StringBuilder(size);
        foreach (byte b in data)
        { result.Append(chars[b % (chars.Length - 1)]); }
        return result.ToString();
    }   
Run Code Online (Sandbox Code Playgroud)

Guf*_*ffa 6

代码中没有任何内容可以保证结果是唯一的.要获得唯一值,您必须保留所有先前的值,以便检查重复项,或使用更长的代码,以便实际上不可能重复(例如GUID).该代码包含少于48位的信息,这比GUID的128位少得多.

该字符串只是随机的,虽然使用了加密强度随机生成器,但这会受到随机数据生成代码的影响.代码中存在一些问题:

  • 创建一个char数组,它被丢弃并替换为另一个.
  • 一个字节的随机数据阵列根本没有明显的原因,因为它不用于任何东西.
  • 使用该GetNonZeroBytes方法代替GetBytes方法,这会给字符的分布增加一个偏差,因为代码不会处理缺少零值的任何问题.
  • modulo(%)运算符用于将随机数减少到所使用的字符数,但随机数不能均匀地分成字符数,这也会增加字符分布的偏差.
  • chars.Length - 1用来代替chars.Length数字减少时,这意味着字符串中只能出现61个预定义的62个字符.

虽然这些问题很小,但在处理密码强度随机性时它们很重要.

代码的一个版本,它会生成一个没有这些问题的字符串,并为代码提供足够的信息,使其被认为是实际上唯一的:

public static string GetUniqueKey() {
  int size = 16;
  byte[] data = new byte[size];
  RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
  crypto.GetBytes(data);
  return BitConverter.ToString(data).Replace("-", String.Empty);
}
Run Code Online (Sandbox Code Playgroud)