1

我正在开发一个管理敏感数据的安全应用程序,所以我需要某种安全登录机制。我正在使用 Qt 库(C++ 版本),到目前为止,当用户从我的应用程序创建帐户时,我找不到提供此 [加密安全伪随机数生成器] 来获取 Salt 的函数。我知道应该如何将密码存储在数据库中,并且似乎在制作新盐时必须使用 CSPRNG。我找了很久,试图找到一种在 Qt 中做到这一点的方法,但我刚刚得出结论,没有办法单独在 Qt 中做到这一点。而是至少有一个跨平台的 C++ 方法来做到这一点?我可以包含一个库,但我更喜欢它是 LGPL,所以如果我将来选择开发专有/闭源应用程序,我仍然可以使用相同的方法。一些额外的信息是我现在不太可能使用 SQL(MSSQL Express 服务器),所以我添加了 SQL 标记。如果有帮助的话,我可能也会使用 QSslSocket(用于客户端/服务器之间的加密)。如果您能对此有所启发,我将不胜感激!

4

3 回答 3

5

如果您认为您需要一个加密安全的 PRNG 来生成盐,那么我必须告诉您,您不了解盐是什么以及它如何工作以及为什么工作以及它对哪些类型的攻击有用。

salt 必须以明文形式存储在加盐密码的哈希值旁边这一简单事实应该表明,您实际上并不需要用于 salt 的加密安全 PRNG - 或任何 PRNG。坦率地说,您可以拥有一个简单的 64 位数字,每次需要新盐时,您都会将其加一,它与加密安全 PRNG 生成的盐一样安全。

于 2012-11-19T21:57:52.253 回答
2

OpenSSL 中的加密库具有“实现加密安全伪随机数生成器 (PRNG)”的 rand函数。

OpenSSL 已经存在了 10 多年,并且仍在积极开发中。

这是 OpenSSL许可证

于 2012-11-19T21:11:03.000 回答
2

标准库提供了<random>其中包括std::random_device,旨在提供对非确定性 RNG 的访问。不能保证提供加密 pRNG,因此您必须检查您关心的平台。

libc++ 默认使用 /dev/urandom,它是 OS X (Yarrow) 和 Linux 上的加密 pRNG(它使用可以耗尽的熵池,您可能希望告诉 random_device 使用“/dev/random”代替) .

libstdc++ IIRC 根据宏使用“/dev/urandom”或者是确定性 pRNG。

从 VS2012 开始的 VC++ 提供了一个非确定性的std::random_device. 早期版本是确定性的。

由于某些实现random_device是确定性的,您可能希望改用 Boost 的 random_device 实现。在 linux 和 OS X 上它默认使用“/dev/urandom”,在 Windows 上它使用加密服务提供者“MS_DEF_PROV”。

于 2012-11-19T21:49:13.513 回答