Я написал контейнер паролей для блокчейна, над которым я сейчас работаю.Я прочитал несколько статей и попытался найти надежное решение, но я хотел бы получить отзыв о том, что реализация является очень важной частью безопасности.
Контейнер хеширует пароль, используя 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());
Если некоторые из вас знакомы с хешированием пароля и его безопасностьюсоображения, я был бы рад, если вы можете дать мне некоторую обратную связь.Если кто-то также хочет использовать этот контейнер, просто дайте мне знать, и я загрузлю полный исходный код.