2010-10-19 20 views
6

This question trata sobre cómo crear un hash SHA-1 a partir de una matriz de datos en C usando la biblioteca OpenSSL.¿Existe una forma estándar de representar un hash SHA1 como una cadena C, y cómo puedo convertirlo a él?

Devuelve una matriz de 20 bytes, que contiene el hash. ¿Hay alguna forma estándar de representar esos datos en forma de cadena, no binaria?

Si es así, ¿hay una función en OpenSSL para convertir a dicho formato de cadena?

De lo contrario, ¿cómo debería hacerlo? Por supuesto, puedo soñar con mi propia codificación, usar base64 o lo que no, pero ¿hay algún formato canónico?

Respuesta

12

Normalmente los hashes se representan como una secuencia de dígitos hexadecimales (naturalmente, dos por byte). Puede escribir el código para escribir tal cosa fácilmente utilizando un ostringstream con los modificadores adecuados:

#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

Gracias, e incluso un ejemplo bastante C++ para programadores por ahí el C++. ¡Buen trabajo! –

+1

En el contexto de cifrado, base64 es una representación textual mucho más común para datos binarios (como hashes) que hexadecimal. –

+2

Para datos binarios generales y largos, sí, pero he visto datos cortos y hash (que suelen ser lo suficientemente cortos) casi siempre expresados ​​en hexadecimal. –

3

La forma estándar de representar valores hash es como cadenas hexadecimales.
En C, puede usar printf("%02x", byte) para obtener una representación hexadecimal de cada byte.

Un ejemplo de MD5, debe ser fácil de adaptar para SHA:

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

+4

'$ byte'? ¿Escribiste mucho Perl últimamente? ;) –

+0

Lol por $ byte. Subí, pero ya cedí para aceptar al primero. –

+0

Disculpe, es un hábito PHP malo :) – Archimedix

0

Privacidad Enhanced Mail (PEM) parecían establecido el estándar para el almacenamiento de representaciones de texto de los datos criptográficos. PEM almacena el fragmento binario real en Base64, pero también tiene un encabezado y un pie de página de texto.

+1

PEM define formatos estándar para almacenar claves y certificados en archivos, y dentro de un certificado, un hash será codificado en base 64, pero un hash en sí mismo usualmente solo se muestra en hexadecimal. Si el has es una huella dactilar clave, comúnmente se muestra como pares de dígitos hexadecimales separados por dos puntos (ver, por ejemplo, RFC4716) – dajames

2

Aquí se muestra un ejemplo para 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); 
Cuestiones relacionadas