Berechnen und print-SHA256 hash einer Datei mit OpenSSL
Ich versuche zu schreiben, Sie eine C-Funktion mit OpenSSL/libcrypto berechnen Sie den SHA256-Summe einer Datei. Ich stützt meinen code auf Adam Lamer c++ Beispiel hier.
Hier ist mein code:
int main (int argc, char** argv)
{
char calc_hash[65];
calc_sha256("file.txt", calc_hash);
}
int calc_sha256 (char* path, char output[65])
{
FILE* file = fopen(path, "rb");
if(!file) return -1;
char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
SHA256_Init(&sha256);
const int bufSize = 32768;
char* buffer = malloc(bufSize);
int bytesRead = 0;
if(!buffer) return -1;
while((bytesRead = fread(buffer, 1, bufSize, file)))
{
SHA256_Update(&sha256, buffer, bytesRead);
}
SHA256_Final(hash, &sha256);
sha256_hash_string(hash, output);
fclose(file);
free(buffer);
return 0;
}
void sha256_hash_string (char hash[SHA256_DIGEST_LENGTH], char outputBuffer[65])
{
int i = 0;
for(i = 0; i < SHA256_DIGEST_LENGTH; i++)
{
sprintf(outputBuffer + (i * 2), "%02x", hash[i]);
}
outputBuffer[64] = 0;
}
Das problem ist....werfen Sie einen Blick auf die berechneten Summen unten ein Beispiel für die Datei:
Known good SHA256: 6da032d0f859191f3ec46a89860694c61e65460d54f2f6760b033fa416b73866
Calc. by my code: 6dff32ffff59191f3eff6affff06ffff1e65460d54ffff760b033fff16ff3866
Ich auch bekommen * stack smashing detected * wenn der code fertig ausgeführt.
Erkennt jemand, was ich falsch mache?
Dank!
Ich habe Prototypen deklariert.
warum const int bufSize ist fest mit der Größe von 32768 ? es könnten auch mehr oder weniger
warum const int bufSize ist fest mit der Größe von 32768 ? es könnten auch mehr oder weniger
InformationsquelleAutor dan6470 | 2011-10-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht aus wie es gibt eine Menge von '0xff' Blöcke in Ihrem Ausgang, und die entsprechenden Bausteine in das gute Saiten die hohe bit gesetzt ... vielleicht ein Zeichen Erweiterung problem irgendwo.
Nicht machen:
unsigniert, wie:
helfen? (Vor allem in der Signatur
sha256_hash_string
.)Mein Kommentar zu little-endian Typ war falsch, also habe ich es gelöscht ... Adam hatte die richtige Erklärung über die 8 bytes, die ausgedruckt werden jedes mal, wenn der Eingang negativ war. Dies ist ein gutes Beispiel von, warum, wenn Sie sich mit "Byte" und nicht "string " Zeichen", die Sie verwenden sollten 'unsigned char' (oder uint8 oder einer seiner Varianten). Die nackten "char" vorbehalten sein sollte-ASCII-Zeichen.
InformationsquelleAutor P.T.
Sind Sie Ausdruck eines unterzeichnet
char
als integer. Wenn das byte negativ ist, es wird konvertiert, um einesigned int
(default argument promotions im Aufrufsprintf
), und dann wird konvertiert in einunsigned int
(über die%x
Formatbezeichner) und ausgedruckt.So, das byte
A0
ist -96 als vorzeichenbehaftetes byte, die umgewandelt wird, um -96 alssigned int
, die 0xFFFFFFA0 in hex, so wird es ausgedruckt FFFFFFA0.Um dies zu beheben, Fall ist jedes byte zu einem
unsigned char
vor dem Druck:Sie sind immer die Warnung über den " stack-smashing, denn es gibt ein vorzeichenbehaftetes byte in der Nähe des Ende der hash, also bist du schreiben der 8 Byte FFFFFFB7 bei offset 58 wenn Sie nur schreiben 2 bytes. Dies führt zu einer buffer overflow, die zufällig entdeckt werden, weil hier der compiler wahrscheinlich eingefügt guard-Bereich-oder Sicherheits-cookie in dem Stapel, bevor Sie den Rückgabewert, und es wurde erkannt, dass das guard-Bereich wurde versehentlich geändert.
InformationsquelleAutor Adam Rosenfield