CryptGenRandom和CNG BCryptGenRandomAPI之间的区别

Difference between CryptGenRandom and CNG BCryptGenRandom APIs

本文关键字:区别 之间 BCryptGenRandomAPI CNG CryptGenRandom      更新时间:2023-10-16

我们的一款产品目前正在使用CryptGenRandom API生成随机数。最近,我偶然发现了Cryptography API:下一代(CNG),它提供了一个新的API BCryptGenRandom(在bcrypt.h中)。根据MSDN中提供的描述,这两个API都符合Windows Vista Service Pack 1(SP1)及更高版本中的NIST SP800-90标准。

  1. 如果我使用默认的Microsoft提供程序,那么这两个API在随机数生成过程中有什么区别吗
  2. 如果没有任何差异,我是否应该改用CNG API,因为CNG是CryptoAPI的长期替代品

关于您的第一个问题,不,正如您所指出的,根据MSDN,两个API使用相同的伪随机数生成器算法。可能更相关的是要指出,两个API都使用相同的Windows内核熵源来提供PRNG。

关于第二个问题,这更有趣,因为它提出了一个问题,即主机是否有更高质量的RNG作为第三方附加组件(例如硬件安全模块HSM)。硬件RNG可以通过CNG(BCryptGenRandom)、传统CAPI(Crypto API、CryptGenRandom])和/或作为内核模式熵源来公开。如果前两种情况中有一种,但不是两者都有,那么只有当你的应用程序调用特定的RNG API时,它才会受益。但是,如果硬件RNG是作为内核熵源安装的,那么无论哪种方式,您的应用程序都会受益。

这些是否重要,更多的是你的应用程序的性质以及它通常是如何使用的问题。如果加密硬件不太可能成为部署故事的一部分,那么我认为没有什么理由更改您的代码。但是,如果你的产品和加密硬件往往出现在同一台主机上,你的客户将从你点亮这一功能中受益。