【问题标题】:Creating base64 encoded random security tokens创建 base64 编码的随机安全令牌
【发布时间】:2020-08-29 20:59:43
【问题描述】:

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

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 编码数字列表,那么猜测令牌会有多困难?

【问题讨论】:

  • RandomNumberGenerator.Create() 返回一个加密强度 RNG,因此除非您将其设置得太小,否则无法猜测令牌。

标签: c# random cryptography token


【解决方案1】:
  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 ;
        }   

【讨论】:

  • Random() 对于这个应用程序来说是一个糟糕的选择。添加时间戳使预测输出变得更加容易,甚至是微不足道的。
猜你喜欢
  • 2012-02-09
  • 1970-01-01
  • 2017-01-28
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 2019-05-24
相关资源
最近更新 更多