Fox*_*Fox 7 .net c# asp.net cryptography
我正在构建一个Web服务,需要我生成自定义会话和随机密码等.
我想知道是否制作静态类并为整个网站使用1个静态RNGCryptoServiceProvider实例是个好主意?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); } }
}
Run Code Online (Sandbox Code Playgroud)
CLR中基于CSP的RNG只是CryptGenRandom的一个包装器.与所有CSP函数一样,它们围绕HCRYPTPROV上下文句柄工作.如果我没记错的话,提供者在进入"上下文"时所做的第一件事就是获得一个保护"上下文"的关键部分.因此虽然该函数最有可能在线程之间保持稳定,但您确实应该为每个线程使用单独的一个来避免争用.
更新
根据MSDN杂志,CLR 可能使用实例缓冲区而不是堆栈缓冲区,这使得RNGCryptoServiceProvider在未来的实现中不会跨线程安全:
请注意,正如当前在.NET Framework 2.0中实现的那样,RNGCryptoServiceProvider的无参数构造函数会创建线程安全实例.因此,我们可以创建我们的私有成员而不是私有静态成员,并且这样做不必为每个CryptoRandom实例创建新的RNGCryptoServiceProvider实例.但是,此线程安全性目前尚未记录,也不会以任何方式纳入类的合同或接口.鉴于此,我们并未依赖它来实施.
请注意,此用法与本机API线程安全无关,缓冲区问题是CLR包装器问题.此外,如果您使用带有byte []的RNGCryptoServiceProvider构造函数,那么肯定是不安全的.
1)如果它是加密安全的,它应该是,那么这种猜测应该是不可行的.
2)在旁注中,我建议在静态属性annd中删除JIT实例化,而不是执行以下操作:
protected static readonly RandomNumberGenerator _rng = new RNGCryptoServiceProvider();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2877 次 |
| 最近记录: |