tags:

views:

84

answers:

3

This question is about how to create an SHA-1 hash from an array of data in C using the OpenSSL library.

It returns an array of 20 bytes, containing the hash. Is there some standard way of representing that data in string form, not binary?

If so, is there a function in OpenSSL itself to convert to said string format?

If not, how should it be done? Of course, I can dream up my own encoding, use base64 or what not, but is there some canonical format?

+3  A: 

Usually hashes are represented as a sequence of hexadecimal digits (naturally, two per byte). You can write the code to write such thing easily using an ostringstream with the right modifiers:

#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();
}
Matteo Italia
Thanks, and even a pretty C++ example for the C++ programmers out there. Nice work!
Amigable Clark Kant
In the crypto context, base64 is a far more common textual representation for binary data (Such as hashes) than hexadecimal.
Chris Becke
For general and long binary data yes, but I've seen short data and hashes (which are usually short enough) almost always expressed in hexadecimal.
Matteo Italia
+3  A: 

The standard way of representing hashes is as hexadecimal strings.
In C, you can use printf("%02x", byte) to get a hex representation of each byte.

An example for MD5, should be easy to adapt it for SHA:

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

Archimedix
`$byte`? Did you write much Perl lately? ;)
larsmans
Lol for the $byte. I upvoted, but already gave away accept to the first guy.
Amigable Clark Kant
Sorry, it's a bad PHP habit :)
Archimedix
A: 

Privacy Enhanced Mail (or PEM) seemed to set the standard for the storage of text representations of crypto data. PEM stores the actual binary chunk in Base64, but has a text header and footer too.

Chris Becke
PEM defines standard formats for storing keys and certificates in files - and within a certificate a hash will indeed be base-64 encoded - but a hash on its own is usually just displayed in hex. If the has is a key fingerprint it is commonly displayed as pairs of hex digits separated by colons (see e.g. RFC4716)
dajames