【发布时间】:2018-11-26 23:59:26
【问题描述】:
我想随机生成唯一且安全的字符串,并且我想随着时间的推移去做。我想为我的使用选择尽可能短的长度(足够大,以至于随机尝试很有可能失败)。我也希望这个过程很快。使用下面的代码并测试它的唯一性,重复发生的时间比我预期的要早。不知道有没有问题。
P.S.:使用池来生成数字是否安全?
P.P.S:我不想在字母表中添加“-”和“_”。值得去掉吗?
string Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
string Random(int length,string alphabet)
{
StringBuilder result = new StringBuilder();
using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
for (int i = 0; i < length; i++)
{
byte[] buffer = new byte[sizeof(uint)];
rng.GetBytes(buffer);
uint num = BitConverter.ToUInt32(buffer, 0);
result.Append(alphabet[(int)(num % (uint)alphabet.Length)]);
}
}
return result.ToString();
}
【问题讨论】:
-
也许对您的代码运行拼写检查可能会有所帮助。看了一下,代码根本不会运行。
-
duplicates occur sooner than I expected.你什么时候期待他们的?它们是什么时候发生的? -
这感觉像是一个 XY 问题 - meta.stackexchange.com/questions/66377/what-is-the-xy-problem。 为什么你想这样做?
-
“短”和“安全”是通常不能很好地结合在一起的两件事。任何足够短的东西也可以很容易地被暴力破解和/或预测。更重要的是,您不希望通过具有难以猜测的名称来确保事物的安全,您希望通过根本无法访问它们来确保它们的安全。如果您使用 16 个随机字节并将它们转换为 32 个字符的十六进制字符串并完成它,您将拥有 128 位的随机性。这当然足以防止碰撞。
Guid.NewGuid()也是如此,尽管这在密码学上并不安全。