PKCS5_PBKDF2_HMAC密码哈希

时间:2019-01-04 13:15:01

标签: c++ openssl passwords

我为当前正在使用的区块链编写了密码容器。我阅读了一些文章,并试图找到一个可靠的解决方案,但我希望获得有关实施方面的一些反馈,该实施是关于安全性非常重要的部分。

容器使用PKCS5_PBKDF2_HMACEVP_sha512对密码进行哈希处理。哈希和盐的大小在实现中是固定的。

using hash_t = std::array<uint8_t, 64>;
using salt_t = std::array<int32_t, 64 / 8>;

每次从零开始创建密码容器,以纯文本形式提供密码或使用令人满意的密码进行验证时,该容器都会使用新的随机配置进行更改。

boost::random::random_device rng;
rng.generate(m_salt.begin(), m_salt.end());
boost::random::uniform_int_distribution<uint32_t> dist{std::numeric_limits<uint16_t>::max(),
                                                       2u * std::numeric_limits<uint16_t>::max()};
m_iterations = dist(rng);

因此,每当提供有效密码时,迭代次数和迭代次数都会更改。实际的哈希计算如下所示:

hash_t hash;
PKCS5_PBKDF2_HMAC(password.data(), static_cast<int>(password.size()),
                  reinterpret_cast<const uint8_t *>(m_salt.data()), static_cast<int>(m_salt.size()),
                  static_cast<int>(m_iterations), EVP_sha512(), static_cast<int>(hash.size()), hash.data());
return hash;

最后,使用std::equal比较了两个散列。

return std::equal(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());

如果你们中的一些人熟悉密码哈希及其安全注意事项,希望您能给我一些反馈,我将很高兴。如果有人也想使用此容器,请告诉我,我将上载完整的源代码。

0 个答案:

没有答案