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