我为当前正在使用的区块链编写了密码容器。我阅读了一些文章,并试图找到一个可靠的解决方案,但我希望获得有关实施方面的一些反馈,该实施是关于安全性非常重要的部分。
容器使用PKCS5_PBKDF2_HMAC
和EVP_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());
如果你们中的一些人熟悉密码哈希及其安全注意事项,希望您能给我一些反馈,我将很高兴。如果有人也想使用此容器,请告诉我,我将上载完整的源代码。