是否有可能从硬件RNG添加熵到Windows CryptoAPI?

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

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

我已经通过CryptoAPI看,似乎无法find任何东西,使我可以添加到操作系统的熵。

根据官方文档,CryptGenRandom可以使用一个可选的输入缓冲区,数据用作辅助随机种子,但开发人员必须决定使用它,默认情况下,每次调用CryptGenRandom都不能配置。

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

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

这里是一个有趣的文档Microsoft Windows 7内核模式加密基元库(cng.sys)安全策略文档列出了如何构建Windows熵池(我已经缩短了许多项目,所以它是可读的):

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

  • 当前正在运行的进程的进程ID
  • 当前正在运行的线程的线程ID
  • 系统启动后的32位滴答计数
  • 当前的本地日期和时间
  • 目前的系统时间信息由[…]
  • 目前依赖硬件平台的高分辨率性能计数器的价值
  • 有关系统当前使用物理和虚拟内存的信息
  • 系统设备信息由[…]
  • 本地磁盘信息包括[…]
  • 当前进程的环境块的散列
  • 一些硬件CPU专用的周期计数器
  • 系统文件缓存信息由[…]
  • 系统处理器功率信息由[…]
  • 系统页面文件信息由[…]
  • 系统处理器空闲信息由空闲时间组成
  • 系统处理器性能信息由[…]
  • 系统异常信息由[…]
  • 系统外观信息由[…]
  • 系统处理器性能信息由[…]
  • 系统中断信息由[…]
  • 系统过程信息由[…]

还列出了EntropyProvideData支持的3种方法EntropyRegisterSourceEntropyUnregisterSource和EntropyProvideData。

我想这些工作可以使用,但是它们没有记录在MSDN上(自从2013年这个文档编写以来,它可能已经发生了变化,但是在我的Windows 10中,cng.sys有3个方法加上EntropyPoolTriggerReseedForIum和EntropyRegisterCallback …) ,这可能意味着它们不被Microsoft支持。

另外你必须编写一个内核驱动程序(cng.sys是一个内核驱动程序),这与安全含义是一致的:你需要成为一个管理员来安装它。

您需要安装Microsoft加密提供程序开发工具包(CPDK) 。 Crypto API:下一代(CNG)的大部分可扩展性都隐藏在那里。 获得CPDK后,请参阅bcrypt_provider.h,ncrypt_provider.h和cpdk_help.chm。 后者包含一个标题为“实现熵源”的小节,它确认了内核驱动程序必须调用EntropyRegisterSource,EntropyProvideData和EntropyUnregisterSource的要求。 那样的话,整个系统将从你的硬件增加的熵中受益。

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

最后,为了使用传统Crypto API(CAPI)(CryptGenRandom)的应用程序,您可以实现PROV_RSA_FULL类型的加密服务提供程序(CSP)并将其注册为系统默认值。 把它作为内置Windows软件CSP的填充,并重定向除CryptGenRandom以外的每个调用。 然而,即使作为一个垫片,这是一个沉重的锤子,因为你将被装载到几乎每个进程。 最大的风险是Windows 10中的一些系统进程可能需要Microsoft签名的DLL。 如果其中一个尝试加载你,并且加载程序没有通过Authenticode签名者检查,那么你的系统可能被洗劫一空。

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