Rare Absturz mit Crypto ++ PBKDF2 :: DeriveKey ()

stimmen
1

Ich verwende die CryptoPP Bibliothek einige Passwörter Hash. Über 1 in 10-mal, stürzt es auf der DeriveKey Linie unten, mit einem segfault.

Selbst wenn feste Parameter verwenden die Abstürze scheinen immer noch zufällig. Ich frage mich, ob ich vielleicht einen ‚\ 0‘ am Ende meiner Strings benötigen. Oder vielleicht muss der Ausgangspuffer Null initialisiert werden, oder was?

Wie auch immer, hier ist der Code.

#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
);
}

Alles scheint richtig initialisiert - die print-Anweisungen geben Sie mir die genau die gleiche Sache jedes Mal:

Salt: 00f8807a289655b2a8e38cda00182a32
Salt size: 16
Password: a
Password size: 1

Außerdem - das Hash-Passwort ist verwendbar, wenn es nicht segfault. Ich bin mit AES-Verschlüsselung später, und ich kann perfekt die Datei entschlüsseln und alle Daten wie erwartet.

Der Quellcode für derive Schlüssel ist hier zu finden, übrigens: https://www.cryptopp.com/docs/ref/pwdbased_8h_source.html#l00235

Vielen Dank.

Veröffentlicht am 07/11/2018 um 23:36
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
3

Ich hazarding eine Vermutung, aber saltnicht NULL beendet. Das Programm wird wahrscheinlich über das 16. Element des zugreifenden saltArray:

std::cout << "Salt: " << Common::podToHex(salt) << std::endl;

Im Folgenden führt mehrmals ohne Probleme. Es ist Ihr Programm weniger die Anrufe an die gemeinsame Bibliothek.

Der Aufruf von std::memcpynur nimmt das am weitesten links stehenden 16-Bytes des Strings. Es ist nicht die Umwandlung. (Ich wollte nur den Anruf zu dem Gemeinsamen entfernen).

$ cat test.cxx

#include "cryptlib.h"
#include "filters.h"
#include "sha.h"
#include "hex.h"
#include "files.h"
#include "pwdbased.h"

#include <string>
#include <iostream>
#include <cstring>

int main()
{
    using namespace CryptoPP;

    PKCS5_PBKDF2_HMAC<SHA256> pbkdf2;

    byte salt[16], key[32];

    /* Hard coded for testing purposes */
    // Common::podFromHex("00f8807a289655b2a8e38cda00182a32", salt);
    std::memcpy(salt, "00f8807a289655b2a8e38cda00182a32", 16);

    /* Hard coded for testing purposes */
    std::string password = "a";

    // std::cout << "Salt: " << Common::podToHex(salt) << std::endl;
    std::cout << "Salt: ";
    StringSource(salt, sizeof(salt), true, new HexEncoder(new FileSink(std::cout)));
    std::cout << 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, (byte *)password.data(),
        password.size(), salt, sizeof(salt), 10000 /*Constants::PBKDF2_ITERATIONS*/
    );

    std::cout << "Key: ";
    StringSource(key, sizeof(key), true, new HexEncoder(new FileSink(std::cout)));
    std::cout << std::endl;

    return 0;
}

Kompiliert und ausgeführt mit:

$ g++ -DNDEBUG -g2 -O3 test.cxx -o test.exe ./libcryptopp.a
$ ./test.exe
Salt: 30306638383037613238393635356232
Salt size: 16
Password: a
Password size: 1
Key: F88BA6947B802C66F7E7A2BC0099AFD92C81DC293E3CC48C2DA3FA75E27ECE6B
Beantwortet am 08/11/2018 um 05:12
quelle vom benutzer

stimmen
0

Ich landete diese Fixierung. Es war eigentlich nicht wegen irgendeines des Code oben aufgeführt, aber es war, weil ich eine Funktion mit diesem Aufruf in einem Signal-Handler.

Da dies nahm eine ganze Weile zu laufen (mit 500.000 Iterationen) schien es, hier jedes Mal zu Abstürzen, aber es war eigentlich nicht auf diese Linie.

Ich landete Fixierung eine bool Flag in der Signalbehandlungsroutine Spiegel und einen separaten Thread aufweisen, die Flagge zu beobachten. Wenn das Flag gesetzt wurde, nannte es die destructor, was wiederum die normale Abschaltung Fluss ausgelöst, so dass alle meine Threads zum Herunterfahren und korrekt speichern.

Beantwortet am 13/11/2018 um 03:18
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more