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

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

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

根据官方文档,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熵池(我缩短了很多项,因此它是可读的):

The Windows entropy pool is populated by periodically gathering random
bits from the Trusted Platform Module (TPM) when present,as well as
by periodically querying the values of the following OS variables:

  • The process ID of the currently running process
  • The thread ID of the currently running thread
  • A 32-bit tick count since the system boot
  • The current local date and time
  • The current system time of day information consisting of […]
  • The current hardware-platform-dependent high-resolution performance-counter value
  • The information about the system’s current usage of both physical and virtual memory […]
  • The system device information consisting of […]
  • The local disk information including […]
  • A hash of the environment block for the current process
  • Some hardware cpu-specific cycle counters
  • The system file cache information consisting of […]
  • The system processor power information consisting of […]
  • The system page file information consisting of […]
  • The system processor idle information consisting of Idle Time
  • The system processor performance information consisting of […]
  • The system exception information consisting of […]
  • The system look-aside information consisting of […]
  • The system processor performance information consisting of […]
  • The system interrupt information consisting of […]
  • The system process information consisting of […]

它还列出了cng.sys支持的3种方法EntropyRegisterSource,EntropyUnregisterSource和EntropyProvideData.

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

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

是否可以将硬件RNG中的熵添加到Windows CryptoAPI?的更多相关文章

  1. windows – 如何在node.js中监听剪贴板事件?

    我希望能够在node.js中监听剪贴板事件.我已经在java中使用了Windows键盘钩子……所以我已经对这个主题有点熟悉了.当我使用Ubuntu10.10作为我的主要操作系统时,我对UbuntuDesktop解决方案最感兴趣.有什么想法吗?非常感谢提前,约亨我建议您查看node-clipboardmodule并使用回调不断监听剪贴板的更改.就像是:

  2. windows-installer – 无提示Windows Installer安装程序,无需自动重启

    目前我有一个MSI执行重大升级,它发布为:我的问题是关于特定属性REBOOT=ReallySuppress:这是否意味着它不会重新启动系统,但会在用户手动重启系统时进行适当的更改?或者它会忽略那些需要重启系统的东西?

  3. 为Windows编写跨平台(32位和64位兼容)程序(如.NET中的AnyCPU)

    Windows最初不了解.NET框架,因此WindowsPELoader无法在PE头中查找CLR头的任何额外功能;必须通过某种内核模式扩展添加此功能.但.NET框架似乎没有安装这样的东西……这显然是可能的,这让我想尝试编写一个原生的跨平台EXE……编辑:作为旁注,请考虑如何在64位WindowsPE环境中运行32位可执行文件…

  4. windows – 为什么我的WINVER 4 .exe在W98SE下运行?

    我需要为运行Windows98SE的遗留系统构建我的应用程序.(系统涉及特殊硬件,不可能进行操作系统升级.)我的开发环境是VisualC;该应用程序是vanillaANSIC,结果是WIN32控制台应用程序.我知道在VisualStudio2008中对旧版Windows的支持完全被删除了,所以我使用的是VisualStudio2005(我在上一代WindowsXP笔记本电脑上仍然使用它).我有条件

  5. 如何使用常规Windows C/C++ API查询进程的线程数

    有没有办法使用标准WindowsC/C++API查询当前为特定进程运行的线程数?

  6. Windows上的可执行模块是否有理想的大小?

    在思考了我所看到的事情后,我留下了这些问题:>使用小的.exe是否有优势,即使应用程序的最终大小都大得多?>如果是这样,开始将应用程序分解为单独的模块的大小是多少?大型可执行文件可能具有较少的共享库,这意味着应用程序可能比使用共享库的应用程序更加占用内存.如果您希望系统具有最小的内存占用,则需要共享库.一个大的exe可能更自包含,这可能使更容易保持稳定的部署.

  7. windows-services – 使用本地系统以外的帐户配置Windows服务时,“允许服务与桌面交互”选项不可用

    我想配置Windows服务,以便允许与桌面交互,而不管它配置为运行的帐户.怎么实现呢?这是一个很好的问题!

  8. windows – DLL和注册表有什么问题?

    我正在观看WWDC2009主题演讲,有人说有关Windows7/Vista的东西让我感到好奇……该发言者声称7仍然是一个糟糕的操作系统,因为它仍然使用相同的技术,如DLL和注册表.他的说法有多准确,OSX的做法有多么不同?即使osx也动态加载了库吗?我猜注册表的东西可能有一些重量..任何人都可以向我解释每个操作系统策略的差异吗?

  9. Nant在Windows Vista 64上

    我想知道是否有人在WindowsVista64位版本上成功运行Nant.它一直在失败设置道具:[sysinfo]在sys.下设置系统信息属性建筑失败属性名称“sys.env.CommonProgramFiles(x86)”无效.是的,它有效.默认情况下,NAnt是为32位构建的.因此,必须记住在32位命令提示符或PowerShell中运行它.我在Vista64计算机上运行PowerShell(x8

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

    我有一个USB硬件随机数发生器,它看起来像一个USBCDC串口,可以用它在Linux中使用rng-tools软件包的rngd向池中添加熵.有没有办法将此串行流提供给Windows熵池,以便当应用程序使用CryptoAPI时,它们将从TrueRNG获取随机数?我想这是微软的安全设计决定.他们不想支持“不受信任”的熵源,因为这对系统至关重要.这是一个有趣的文档MicrosoftWindows7KernelModeCryptographicPrimitivesLibrarySecurityPolicyDocum

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部