2009-08-10 41 views
5

我建設,需要我生成自定義會話和隨機密碼等static RNGCryptoServiceProvider - 生成會話和隨機密碼的安全性和線程安全性?

我在想,如果做一個靜態類和使用1個靜態RNGCryptoServiceProvider實例整個網站是一個好主意,web服務? 1.它是來自多個http請求實例的線程安全嗎? 2.安全嗎?如果我允許某人在很短的時間內生成很多會話,是否可以計算出RNG的狀態並預測下一次會話?

在我的服務中,其他用戶知道什麼時候有人登錄,並且我最初在創建會話時創建了一個新的RNGCryptoServiceProvider,但是我擔心的是,如果這是基於當前日期時間,理論上只能有人要經過幾千次會話才能「猜測」另一個用戶的會話,如果他們大概知道他們第二次登錄的話。

public static class random 
{ 
    private static RandomNumberGenerator _rng; 
    protected static RandomNumberGenerator rng 
    { 
     get 
     { 
      if (_rng == null) _rng = new RNGCryptoServiceProvider(); 
      return _rng; 
     } 
    } 
    public static byte[] Bytes(int number) 
    { 
     var value = new byte[number]; 
     rng.GetBytes(value); 
     return value; 
    } 
    public static byte Byte { get { return Bytes(1)[0]; } } 
    public static int Int { get { return BitConverter.ToInt32(Bytes(4), 0); } } 
    public static long Long { get { return BitConverter.ToInt64(Bytes(8), 0); } } 
} 

回答

5

1)如果是加密的安全,它應該是,那麼這種猜測的不應該是可行的。

2)在一個側面說明,我建議在靜態屬性中刪除JIT實例annd而不是做以下幾點:

protected static readonly RandomNumberGenerator _rng = new RNGCryptoServiceProvider(); 
8

在CLR的CSP基於RNG是隻是一個包裝圍繞CryptGenRandom。像所有CSP功能一樣,它們圍繞着HCRYPTPROV上下文句柄工作。如果我沒有記錯,提供者在進入「上下文」時做的第一件事就是獲取保護「上下文」的關鍵部分。因此,儘管這個函數在線程中很可能是穩定的,但您應該爲每個線程使用一個單獨的函數以避免爭用。

更新

根據這一MSDN Magazine的CLR 可以使用實例緩衝區,而不是堆一個,使得跨線程的RNGCryptoServiceProvider不安全未來實現:

需要注意的是,如目前在 .NET Framework 2.0, 無參數構造函數 RNGCryptoServiceProvider創建 thr ead安全實例。因此,我們可以 已經創建了私有成員 ,而不是一直是私有靜態 成員,並在這樣做不必 爲 CryptoRandom的每個實例創建一個新的RNGCryptoServiceProvider 實例。但是,這個 線程安全目前不是 記錄,也不是以任何方式將 轉換成類的合同或 接口。鑑於此,我們沒有 依靠它來實施。

請注意,此用法與本機API線程安全無關,緩衝區問題是CLR包裝問題。另外,如果使用需要一個字節[]的RNGCryptoServiceProvider構造函數,則肯定是不安全的

+0

+1瞭解重要細節。 – 2009-08-11 11:27:33

+3

從.NET 3.5開始,'RNGCryptoServiceProvider'類是線程安全的:請參閱https://msdn.microsoft.com/en-us/library/5f45t420%28v=vs.90%29.aspx(但不在Silverlight中)。 – 2015-12-01 20:13:28

-1
[ThreadStatic] protected static readonly RandomNumberGenerator _rng = new RNGCryptoServiceProvider(); 

ThreadStaticAttribute應確保每個線程都得到自己的。

+1

您不能擁有ThreadStatic對象的初始化器,它會導致問題:https://confluence.jetbrains.com/display/ReSharper/%27ThreadStaticAttribute%27+usage – 2015-02-07 20:01:50