2010-10-19 4 views
6

This question ist zum Erstellen eines SHA-1-Hash aus einem Array von Daten in C mithilfe der OpenSSL-Bibliothek.Gibt es eine Standardmethode, einen SHA1-Hash als C-String darzustellen, und wie konvertiere ich dazu?

Es gibt ein Array von 20 Bytes zurück, das den Hash enthält. Gibt es eine Standardmethode für die Darstellung dieser Daten in String-Form, nicht binär?

Wenn ja, gibt es in OpenSSL selbst eine Funktion zum Konvertieren in dieses Zeichenfolgenformat?

Wenn nicht, wie soll es gemacht werden? Natürlich kann ich mir meine eigene Kodierung ausdenken, benutze base64 oder was auch immer, aber gibt es ein kanonisches Format?

Antwort

12

Normalerweise werden Hashes als eine Folge von hexadezimalen Ziffern dargestellt (natürlich zwei pro Byte). Sie können den Code schreiben, um so etwas zu schreiben leicht ein ostringstream mit den richtigen Modifikatoren:

#include <string> 
#include <sstream> 
#include <iomanip> 

std::string GetHexRepresentation(const unsigned char * Bytes, size_t Length) 
{ 
    std::ostringstream os; 
    os.fill('0'); 
    os<<std::hex; 
    for(const unsigned char * ptr=Bytes;ptr<Bytes+Length;ptr++) 
     os<<std::setw(2)<<(unsigned int)*ptr; 
    return os.str(); 
} 
+1

Dank und sogar ein ziemlich C++ Beispiel für die C++ Programmierer gibt. Gute Arbeit! –

+1

Im Crypto-Kontext ist base64 eine viel gebräuchlichere textuelle Repräsentation für binäre Daten (z. B. Hashes) als hexadezimal. –

+2

Für allgemeine und lange binäre Daten ja, aber ich habe kurze Daten und Hashes gesehen (die in der Regel kurz genug sind) fast immer in Hexadezimal ausgedrückt. –

3

Der üblicher Weg Hashes zu vertreten ist als hexadezimale Zeichenkette.
In C können Sie printf("%02x", byte) verwenden, um eine hexadezimale Darstellung jedes Bytes zu erhalten.

Ein Beispiel für MD5, sollte es für SHA leicht anpassen:

http://en.literateprograms.org/MD5_sum_(C,_OpenSSL)

+4

'$ byte'? Hast du in letzter Zeit viel Perl geschrieben? ;) –

+0

Lol für das $ Byte. Ich habe gestimmt, aber habe bereits weggegeben, dem ersten Kerl zu akzeptieren. –

+0

Sorry, es ist eine schlechte PHP-Gewohnheit :) – Archimedix

0

Privacy Enhanced Mail (oder PEM) schien den Standard für die Speicherung von Textdarstellungen von Krypto-Daten einzustellen. PEM speichert den tatsächlichen binären Chunk in Base64, hat aber auch eine Textkopfzeile und -fußzeile. Hier

+1

PEM definiert Standardformate für die Speicherung von Schlüsseln und Zertifikaten in Dateien - und innerhalb eines Zertifikats wird ein Hash in der Tat Base-64-codiert - aber ein Hash für sich allein wird in der Regel nur in Hex angezeigt. Wenn das has ein Schlüsselfingerabdruck ist, wird es üblicherweise als Paare von Hexadezimalziffern angezeigt, die durch Doppelpunkte getrennt sind (siehe beispielsweise RFC4716). – dajames

2

ist ein Beispiel für C:

//function 
void convertSHA1BinaryToCharStr(const unsigned char * const hashbin, char * const hashstr) { 
    for(int i = 0; i<20; ++i) 
    { 
    sprintf(&hashstr[i*2], "%02X", hashbin[i]); 
    } 
    hashstr[40]=0; 
} 

//Example call. hashbin is the 20byte hash array. 
char hashstr[41]; 
convertSHA1BinaryToCharStr(hashbin, hashstr); 
printf("%s\n", hashstr); 
Verwandte Themen