CryptGenRandom和CNG BCryptGenRandomAPI之间的区别
Difference between CryptGenRandom and CNG BCryptGenRandom APIs
我们的一款产品目前正在使用CryptGenRandom API生成随机数。最近,我偶然发现了Cryptography API:下一代(CNG),它提供了一个新的API BCryptGenRandom(在bcrypt.h中)。根据MSDN中提供的描述,这两个API都符合Windows Vista Service Pack 1(SP1)及更高版本中的NIST SP800-90标准。
- 如果我使用默认的Microsoft提供程序,那么这两个API在随机数生成过程中有什么区别吗
- 如果没有任何差异,我是否应该改用CNG API,因为CNG是CryptoAPI的长期替代品
关于您的第一个问题,不,正如您所指出的,根据MSDN,两个API使用相同的伪随机数生成器算法。可能更相关的是要指出,两个API都使用相同的Windows内核熵源来提供PRNG。
关于第二个问题,这更有趣,因为它提出了一个问题,即主机是否有更高质量的RNG作为第三方附加组件(例如硬件安全模块HSM)。硬件RNG可以通过CNG(BCryptGenRandom)、传统CAPI(Crypto API、CryptGenRandom])和/或作为内核模式熵源来公开。如果前两种情况中有一种,但不是两者都有,那么只有当你的应用程序调用特定的RNG API时,它才会受益。但是,如果硬件RNG是作为内核熵源安装的,那么无论哪种方式,您的应用程序都会受益。
这些是否重要,更多的是你的应用程序的性质以及它通常是如何使用的问题。如果加密硬件不太可能成为部署故事的一部分,那么我认为没有什么理由更改您的代码。但是,如果你的产品和加密硬件往往出现在同一台主机上,你的客户将从你点亮这一功能中受益。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- & 和 * 之间的区别
- std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
- 析构函数和'delete'之间的区别
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- OpenMP #pragma omp for v/s #pragma omp parallel for 之间的区别?
- S() 与 S{} 之间的区别?