RNGCryptoServiceProvider 已过时

Gol*_*avo 46 .net c# asp.net .net-6.0

我需要使用随机数字和字母生成令牌。但是,错误消息告诉我使用 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();
    }
Run Code Online (Sandbox Code Playgroud)

如何更改上面的代码以使用未过时的包?

SVa*_*Dev 67

RandomNumberGenerator你可以这样使用:

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

using (var rng = RandomNumberGenerator.Create())
{
     rng.GetBytes(randomNumber);
     refreshToken = Convert.ToBase64String(randomNumber);
}
Run Code Online (Sandbox Code Playgroud)

结果示例:fHu4SOyv03PhHvqWx5WGmI5xQFnH00CmLCV3IYJd5Dw=

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

  • 仅供像我一样关心的人参考,RandomNumberGenerator 位于 System.Security.Cryptography 命名空间中,并被记录为提供加密的强随机性。https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.randomnumbergenerator.getbytes?view=net-7.0 (9认同)