2009-08-10 59 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