Я использую библиотеку CryptoPP для хеширования некоторых паролей. Примерно в 1 из 10 случаев происходит сбой в строке DeriveKey ниже с segfault.
Даже при использовании фиксированных параметров сбои по-прежнему кажутся случайными. Мне интересно, может быть, мне нужен «\ 0» в конце моих строк. Или, может быть, буфер вывода должен быть инициализирован нулем или что-то в этом роде?
В любом случае, вот код.
#include <cryptopp/aes.h>
#include <cryptopp/algparam.h>
#include <cryptopp/filters.h>
#include <cryptopp/modes.h>
#include <cryptopp/sha.h>
#include <cryptopp/pwdbased.h>
int main()
{
CryptoPP::PKCS5_PBKDF2_HMAC<CryptoPP::SHA256> pbkdf2;
CryptoPP::byte salt[16];
CryptoPP::byte key[32];
/* Hard coded for testing purposes */
Common::podFromHex("00f8807a289655b2a8e38cda00182a32", salt);
/* Hard coded for testing purposes */
std::string password = "a";
std::cout << "Salt: " << Common::podToHex(salt) << std::endl;
std::cout << "Salt size: " << sizeof(salt) << std::endl;
std::cout << "Password: " << password.data() << std::endl;
std::cout << "Password size: " << password.size() << std::endl;
/* Rare segfault on this line */
pbkdf2.DeriveKey(
key, sizeof(key), 0, (CryptoPP::byte *)password.data(),
password.size(), salt, sizeof(salt), Constants::PBKDF2_ITERATIONS
);
}
Кажется, все инициализировано правильно - операторы печати каждый раз дают мне одно и то же:
Salt: 00f8807a289655b2a8e38cda00182a32
Salt size: 16
Password: a
Password size: 1
Кроме того, хешированный пароль можно использовать, когда он не segfault. Позже я использую шифрование AES, и я могу полностью расшифровать файл, и все данные соответствуют ожиданиям.
Кстати, исходный код для получения ключа можно найти здесь: https://www.cryptopp.com/docs/ref/pwdbased_8h_source.html#l00235
Спасибо.
-O1
. Если вы наблюдаете множество находок Valgrind в-O1
, возможно, у вас есть некоторые проблемы, которые нужно исправить. См. также Краткое руководство по началу работы с Valgrind | Подготовка программы. ({Некоторые|многие} выводы в-O2
и-O3
являются ложноположительными). - person jww   schedule 08.11.2018