C# 创建base64编码的随机安全令牌

C# 创建base64编码的随机安全令牌,c#,random,cryptography,token,C#,Random,Cryptography,Token,我读了这个问题,现在有点老了。基于此,这是目前创建随机令牌的可行方法吗?我还发现,似乎使用了相同的方法 private byte[] GetRandomBytes(int size) { using (var randomNumberGenerator = RandomNumberGenerator.Create()) { var randomBytes = new byte[size]; randomNumberGenerator.GetByte

我读了这个问题,现在有点老了。基于此,这是目前创建随机令牌的可行方法吗?我还发现,似乎使用了相同的方法

private byte[] GetRandomBytes(int size)
{
    using (var randomNumberGenerator = RandomNumberGenerator.Create())
    {
        var randomBytes = new byte[size];
        randomNumberGenerator.GetBytes(randomBytes);

        return randomBytes;
    }
}

...

var randomBytes = GetRandomBytes(size);
var token = Convert.ToBase64String(randomBytes);
我打算将这些令牌用作URL中的一次性令牌,用于双重选择加入和登录等多种目的。令牌的生存期取决于使用情况,但对于例如登录,它很短,例如5分钟。没有涉及任何密码,只有通过电子邮件发送给用户的“神奇链接”


受保护的解决方案不需要最前沿的保护,但我希望猜到一个令牌并进入其中会相对困难。如果很难猜到令牌,并且由于我在n个时间段后使令牌过期,那么这是一种可行的方法吗?如果某人已经有一个预定义的Base64编码数字列表,那么猜测令牌有多困难?

Random()
对于这个应用程序来说是一个糟糕的选择。添加时间戳使预测输出变得更加容易,甚至可能是微不足道的。
RandomNumberGenerator.Create()
返回一个加密强度RNG,因此除非将其设置得太小,否则无法猜测令牌。
  public string generateCipher()
        {
            Random random = new Random();
            var rand = new Random();
            var bytes = new byte[32];
            rand.NextBytes(bytes);

            string symPass = 
        Convert.ToBase64String(bytes).Substring(1,32);
            var timestamp = DateTime.Now.ToFileTime();
            var resd= timestamp / 100;

            string cipher = symPass+timestamp/100;


            return cipher ;
        }