是否可以将硬件RNG中的熵添加到Windows CryptoAPI?

时间:2014-03-03 15:38:29

标签: windows random hardware entropy

我有一个USB硬件随机数生成器(TrueRNG),它看起来像一个USB CDC串口,可以使用rng-tools包的rngd在Linux中为池添加熵。

有没有办法将此串行流提供给Windows熵池,以便当应用程序使用CryptoAPI(CryptGenRandom函数)时,它们将从TrueRNG获取随机数?

我查看了CryptoAPI,似乎无法找到任何允许我将熵添加到操作系统中的内容。

3 个答案:

答案 0 :(得分:4)

根据官方文档,CryptGenRandom可以使用带有数据的可选输入缓冲区作为辅助随机种子,但开发人员必须决定是否要使用它,默认情况下,每次调用CryptGenRandom时都无法配置。

但请注意,现在,开发人员可以/也应该使用来自CNG(Cryptography API:Next Generation)的BCryptGenRandom,它是CryptoAPI的替代品。但BCryptGenRandom不支持任何输入缓冲区作为额外的熵,无论如何从Windows 8及更高版本......

我认为这是微软的安全设计决定。他们不想支持“不受信任的”熵源,因为这对系统至关重要。

这是一个有趣的文档Microsoft Windows 7 Kernel Mode Cryptographic Primitives Library (cng.sys) Security Policy Document,列出了如何构建Windows熵池(我缩短了许多项目以便它可读):

  

通过定期收集随机来填充Windows熵池   来自可信平台模块(TPM)的位(如果存在),以及   通过定期查询以下OS变量的值:

     
      
  • 当前正在运行的进程的进程ID
  •   
  • 当前正在运行的线程的线程ID
  •   
  • 自系统启动以来的32位滴答计数
  •   
  • 当前的当地日期和时间
  •   
  • 当前系统时间信息由[...]
  • 组成   
  • 当前依赖于硬件平台的高分辨率性能计数器值
  •   
  • 有关系统当前物理和虚拟内存使用情况的信息[...]
  •   
  • 系统设备信息由[...]
  • 组成   
  • 本地磁盘信息包括[...]
  •   
  • 当前流程的环境块的哈希值
  •   
  • 某些特定于硬件CPU的循环计数器
  •   
  • 系统文件缓存信息由[...]
  • 组成   
  • 系统处理器电源信息由[...]
  • 组成   
  • 系统页面文件信息由[...]
  • 组成   
  • 系统处理器空闲信息,包括空闲时间
  •   
  • 系统处理器性能信息由[...]
  • 组成   
  • 系统异常信息由[...]
  • 组成   
  • 由[...]
  • 组成的系统后备信息   
  • 系统处理器性能信息由[...]
  • 组成   
  • 系统中断信息由[...]
  • 组成   
  • 系统处理信息由[...]
  • 组成   

它还列出了cng.sys支持的3种方法EntropyRegisterSourceEntropyUnregisterSourceEntropyProvideData

我认为使用它们可以工作,但它们没有在MSDN上记录(自从这篇文档是在2013年编写以来它可能已经改变了,但是在我的Windows 10盒子里,cng.sys有3种方法加上EntropyPoolTriggerReseedForIum 和EntropyRegisterCallback ...),这可能意味着微软不支持它们。

另外,您必须编写内核驱动程序(cng.sys是内核驱动程序),这与安全隐患一致:您需要成为管理员才能安装它。

答案 1 :(得分:1)

您需要安装Microsoft Cryptographic Provider Development Kit (CPDK)。 Crypto API:Next Generation(CNG)的大多数可扩展性都隐藏在那里。获得CPDK后,请参阅bcrypt_provider.h,ncrypt_provider.h和cpdk_help.chm。后者包括一个标题为“实现熵源”的部分,该部分确认了内核驱动程序必须调用EntropyRegisterSource,EntropyProvideData和EntropyUnregisterSource的要求。这样,整个系统就可以从硬件增加的熵中获益。

但这不一定是你唯一的选择。为了使用CNG(BCryptGenRandom)的应用程序的好处,您可以实现随机数生成器提供程序(再次,请参阅CPDK中的CHM文件)并将您的实现注册为系统默认值。

最后,为了使用传统加密API(CAPI)(CryptGenRandom)的应用程序的好处,您可以实现PROV_RSA_FULL类型的加密服务提供程序(CSP)并将其注册为系统默认值。将其作为内置Windows软件CSP的垫片并重定向除CryptGenRandom之外的每个调用。然而,即使是一个垫片,这也是一个沉重的锤子,因为你几乎每个过程都会被装进去。最大的风险是Windows 10中的某些系统进程可能需要Microsoft签名的DLL。如果其中一个尝试加载您,并且加载程序未通过Authenticode签名者检查,则您的系统可能已经被软管。

答案 2 :(得分:-1)

我不知道这是否有帮助,但这里有。 MS正在修复WSL('在Windows上为Ubuntu进行Bash'以供不知道的人使用),以便可以使用USB连接的tRNG(和其他非存储)设备。他们还致力于允许使用Cron作业和其他始终运行的后台服务。一旦他们得到那些运行,你可以使用USB tRNG与那些熵进入系统。