在C# .NET WCF中生成OTP 6位数pin的方法是什么?(不使用Random())

wbrvyc0a  于 2022-11-19  发布在  .NET
关注(0)|答案(2)|浏览(134)

我想在我的C# .NET应用程序中生成一个OTP 6位PIN。但是,出于安全考虑,我听说使用Random()包来执行此操作可能不是最合适的。是否有其他方法可用?

bweufnob

bweufnob1#

如果您希望使用比System.Random更安全的名称空间,那么您肯定希望使用System.Security.Cryptography名称空间中的内容。
下面是Eric Lippert在其精彩的Fixing Random系列中编写的一个方便的实现。

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;
        }
    }
}

现在您可以轻松创建OTP字符串:

string otp = (BetterRandom.NextInt() % 1000000).ToString("000000");
0pizxfdo

0pizxfdo2#

生成6位数OTP的一种方法是使用加密安全伪随机数生成器(CSPRNG)。CSPRNG是一种随机数生成器,其设计用于抵抗试图预测将生成的数字的攻击者。
一个常用的CSPRNG是Microsoft加密服务提供程序(CSP)随机数生成器。要使用此CSPRNG,可以调用System.Security.Cryptography.RNGCryptoServiceProvider.GetBytes方法,传入要生成的字节数。此方法将返回一个字节数组,然后通过取前6个字节并将其转换为十六进制,将其转换为6位字符串。
另一个选择是使用System.Random类,但只有在确信所使用的种子值是真正随机的并且攻击者无法预测时才应这样做。

相关问题