在 ASP.NET SessionID threadsafe 中使用 RNGCryptoServiceProvider

本文关键字:RNGCryptoServiceProvider threadsafe ASP NET SessionID | 更新日期: 2023-09-27 18:31:38

下面是 ASP.NET 中创建会话ID的实现(我已经释义了)。

编辑(RNG 是共享的):

static _randgen = new RNGCryptoServiceProvider(); 
string GetSessionId()
{
    var buffer = new byte [15];
    //fill the buffer with random bytes
    randgen.GetBytes(buffer);
    //turn the bytes into a string of letters and numbers (no unsafe chars)
    string encoding = Encode(buffer);
    return encoding; 
}

关于RNGCryptoServiceProvider.GetBytes的文档说它是线程安全的,但是不清楚这意味着什么样的线程安全。它只是保证没有死锁还是保证两个线程会得到不同的值?是否存在 2 个请求将拉取相同会话 ID 的竞争条件?

在 ASP.NET SessionID threadsafe 中使用 RNGCryptoServiceProvider

虽然 GetBytes 是线程安全的(没有死锁,没有共享结果),但使用它并不意味着每次的结果都不同。

每次调用 GetBytes 时,它都是一个全新的随机结果。这意味着随机的它也可能是重复的。

授予 15 个字节,这是不太可能的一面,但它可能会发生。

由于在 GetSessionId 函数内创建了一个新的 RNGCryptoServiceProvider 对象,因此多个线程无法访问它。

编辑:这意味着如果两个或多个线程使用其函数,它不会崩溃。它不保证任何唯一性(一个或多个线程),但会生成加密强度高的随机字节。

相关文章:
  • 没有找到相关文章