在C#中生成唯一的*和*随机URL

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)

如果您发现此问题,请发表评论.

Jos*_*osh 5

Guid并不是一个安全功能.创建Guid的标准没有声称它是多么安全,或者猜测是多么容易/多难.它只是声称它的独特性.

如果您尝试使用Guid来保护系统,那么您将没有安全的系统.