RNGCryptoServiceProvider已过时。

41

我需要使用随机数字和字母生成一个令牌。然而,错误信息告诉我要使用RandomNumberGenerator,但它只会给我产生随机数字,这对我没有帮助。

错误信息

'RNGCryptoServiceProvider'已过时:'RNGCryptoServiceProvider已过时。要生成随机数,请改用RandomNumberGenerator静态方法之一。'

当前使用的代码

    private static string RandomString()
    {
        int length = 256;
        const string valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
        StringBuilder res = new StringBuilder();
        using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
        {
            byte[] uintBuffer = new byte[sizeof(uint)];

            while (length-- > 0)
            {
                rng.GetBytes(uintBuffer);
                uint num = BitConverter.ToUInt32(uintBuffer, 0);
                res.Append(valid[(int)(num % (uint)valid.Length)]);
            }
        }
        return res.ToString();
    }

我该如何修改上面的代码,以使用一个不过时的包?

1个回答

61

您可以像这样使用RandomNumberGenerator

var randomNumber = new byte[32];
string refreshToken = "";

using (var rng = RandomNumberGenerator.Create())
{
     rng.GetBytes(randomNumber);
     refreshToken = Convert.ToBase64String(randomNumber);
}

结果示例:fHu4SOyv03PhHvqWx5WGmI5xQFnH00CmLCV3IYJd5Dw=

只需根据您的情况进行调整。


1
这个是线程安全的吗? - Learner
8
提醒任何关心此事的人,就像我一样,RandomNumberGenerator位于System.Security.Cryptography命名空间中,并且被记录为提供具有密码学强度的随机性。https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.randomnumbergenerator.getbytes?view=net-7.0 - SteveC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接