【问题标题】:Is it possible to add entropy from a hardware RNG to the Windows CryptoAPI?是否可以将硬件 RNG 的熵添加到 Windows CryptoAPI?
【发布时间】:2014-03-03 15:38:28
【问题描述】:

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

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

我查看了 CryptoAPI,似乎找不到任何可以让我将熵添加到操作系统的东西。

【问题讨论】:

    标签: windows random hardware entropy


    【解决方案1】:

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

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

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

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

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

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

    并且还列出了 cng.sys 支持的 EntropyRegisterSourceEntropyUnregisterSourceEntropyProvideData 3 种方法。

    我想使用这些可以工作,但它们没有记录在 MSDN 上(自 2013 年编写此文档以来,它可能已经改变,但在我的 Windows 10 机器上,cng.sys 有 3 种方法加上 EntropyPoolTriggerReseedForIum 和 EntropyRegisterCallback...),这可能意味着它们不受 Microsoft 支持。

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

    【讨论】:

    • 谢谢。如果没有其他人可以提供有关实施的更多详细信息,您将获得积分。不能像连接到 /dev/random 一样简单...
    【解决方案2】:

    您需要安装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 的 shim,并重定向除 CryptGenRandom 之外的每个调用。然而,即使作为一个垫片,这也是一个沉重的锤子,因为你将被加载到几乎每个过程中。最大的风险是 Windows 10 中的某些系统进程可能需要 Microsoft 签名的 DLL。如果其中一个尝试加载您,并且加载程序未通过 Authenticode 签名者检查,则您的系统可能已被冲洗。

    【讨论】:

      【解决方案3】:

      我不知道这是否有帮助,但是就这样吧。 MS 正在修复 WSL(对于那些不知道的人来说,'Bash on Ubuntu on Windows'),以便可以使用 USB 连接的 tRNG(和其他非存储)设备。他们还致力于允许使用 Cron 作业和其他始终在后台运行的服务。一旦它们运行起来,您就可以使用 USB tRNG 来获取熵进入系统。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-14
        相关资源
        最近更新 更多