public static class BetterRandom
{
private static readonly ThreadLocal<System.Security.Cryptography.RandomNumberGenerator> crng = new ThreadLocal<System.Security.Cryptography.RandomNumberGenerator>(System.Security.Cryptography.RandomNumberGenerator.Create);
private static readonly ThreadLocal<byte[]> bytes = new ThreadLocal<byte[]>(() => new byte[sizeof(int)]);
public static int NextInt()
{
crng.Value.GetBytes(bytes.Value);
return BitConverter.ToInt32(bytes.Value, 0) & int.MaxValue;
}
public static double NextDouble()
{
while (true)
{
long x = NextInt() & 0x001FFFFF;
x <<= 31;
x |= (long)NextInt();
double n = x;
const double d = 1L << 52;
double q = n / d;
if (q != 1.0)
return q;
}
}
}
2条答案
按热度按时间bweufnob1#
如果您希望使用比
System.Random
更安全的名称空间,那么您肯定希望使用System.Security.Cryptography
名称空间中的内容。下面是Eric Lippert在其精彩的Fixing Random系列中编写的一个方便的实现。
现在您可以轻松创建OTP字符串:
0pizxfdo2#
生成6位数OTP的一种方法是使用加密安全伪随机数生成器(CSPRNG)。CSPRNG是一种随机数生成器,其设计用于抵抗试图预测将生成的数字的攻击者。
一个常用的CSPRNG是Microsoft加密服务提供程序(CSP)随机数生成器。要使用此CSPRNG,可以调用
System.Security.Cryptography.RNGCryptoServiceProvider.GetBytes
方法,传入要生成的字节数。此方法将返回一个字节数组,然后通过取前6个字节并将其转换为十六进制,将其转换为6位字符串。另一个选择是使用
System.Random
类,但只有在确信所使用的种子值是真正随机的并且攻击者无法预测时才应这样做。