Qt / C ++中的密码安全伪随机数生成器(跨平台)

时间:2012-11-19 21:04:29

标签: c++ sql qt password-encryption

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

3 个答案:

答案 0 :(得分:4)

如果你你需要一个加密安全的PRNG来生成盐,那么我必须告诉你,你不明白盐是什么,它是如何以及为什么有效,以及它是针对哪种攻击是有用的。

盐必须以明文的形式存储在盐腌密码的哈希旁边这个简单的事实应该让你不需要加密的安全PRNG盐 - 或任何PRNG物。坦率地说,你可以拥有一个简单的64位数字,每当你需要一个新的盐时它会增加一个,它就像加密安全的PRNG生成的盐一样安全。

答案 1 :(得分:1)

OpenSSL中的加密库具有rand个功能,可以“实现加密安全的伪随机数生成器(PRNG)”。

OpenSSL已存在超过10年,并且仍在积极开发中。

这是OpenSSL license

答案 2 :(得分:1)

标准库提供<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”。