dev*_*xer 10 c# security authentication cryptography guid
我的最终目标是创建一个唯一且无法猜测/预测的URL.此URL的目的是允许用户执行验证其电子邮件地址和重置密码等操作.这些URL将在设定的时间内过期(目前设置为24小时).
我最初是Guid
为了这个目的而使用的,但我现在明白这是介于"很好"和"非常不安全"之间,取决于你听的专家.所以,我想我会加强我的代码,为了以防万一.起初我以为我只是坚持使用a Guid
,但是从随机字节而不是Guid.NewGuid()
工厂方法生成它.这是我提出的方法:
public static Guid GetRandomGuid()
{
var bytes = new byte[16];
var generator = new RNGCryptoServiceProvider();
generator.GetBytes(bytes);
return new Guid(bytes);
}
Run Code Online (Sandbox Code Playgroud)
我不太清楚当你使用new Guid(bytes)
而不是Guid.NewGuid()
,但是我认为所有这个方法都会生成一个随机字节数组并将其存储在Guid
数据结构中.换句话说,它不再保证是独一无二的,它只能保证是随机的.
由于我的网址必须既独特又随机,这似乎不是一个可靠的解决方案.我现在想,我应该将我的URL基于一个唯一ID(可以是Guid
或者,如果可用,数据库自动增加的id)和生成的随机序列的组合RNGCryptoServiceProvider
.
问题
什么是生成验证/密码重置URL的最佳方法,该URL既保证唯一又极难/无法预测/猜测?
我应该通过将唯一字符串与随机字符串连接来构建我的URL吗?
.NET Framework是否具有内置方法,可以轻松生成可用于URL 的唯一且随机(不可预测)的序列?
如果没有,是否有一个很好的解决方案可用开源?
更新
如果有人有类似的要求,我目前正在使用以下方法:
public static string GenerateUniqueRandomToken(int uniqueId)
// generates a unique, random, and alphanumeric token
{
const string availableChars =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
using (var generator = new RNGCryptoServiceProvider())
{
var bytes = new byte[16];
generator.GetBytes(bytes);
var chars = bytes
.Select(b => availableChars[b % availableChars.Length]);
var token = new string(chars.ToArray());
return uniqueId + token;
}
}
Run Code Online (Sandbox Code Playgroud)
如果您发现此问题,请发表评论.
归档时间: |
|
查看次数: |
5986 次 |
最近记录: |