Estoy usando SHA1 para encriptar mi ID.
Sin embargo, incluso si ingreso la misma ID, se codifica de manera diferente.
Este es mi código:
#include <stdio.h> #include <string.h> #include <openssl/sha.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> char *sha1_hash(char *input_url, char *hashed_url) { unsigned char hashed_160bits[20]; char hashed_hex[41]; int i; SHA1(input_url, 160, hashed_160bits); for(i=0; i < sizeof(hashed_160bits); i++) { sprintf(hashed_hex + i*2, "%02x", hashed_160bits[i]); } strcpy(hashed_url, hashed_hex); return hashed_url; } int main() { char *input_url; char *hashed_url; while(1) { input_url = malloc(sizeof(char)* 1024); hashed_url = malloc(sizeof(char) * 1024); printf("input url> "); scanf("%s", input_url); if (strcmp(input_url, "bye") == 0) { free(hashed_url); free(input_url); break; } sha1_hash(input_url, hashed_url); printf("hashed_url: %s\n", hashed_url); free(hashed_url); free(input_url); } return 0; }
Si ingreso el mismo valor para el primer intento y el segundo intento, se codificará de manera diferente, pero el tercer intento se codificará igual que el segundo intento.
Creo que la asignación dinámica es un problema, pero no puedo pensar en una forma de solucionarlo.
SHA1(input_ID, 160, hashed_ID_160bits);
Esa línea está mal. Siempre obtiene hash para 160 bytes. Supongo que desea el hash solo para el texto de entrada, así que use esa longitud:
SHA1(input_ID, strlen(input_ID), hashed_ID_160bits);
SHA1 siempre produce hash de 160 bits, por lo que no necesita pasar 160 como parámetro. Si desea un tamaño diferente de hash SHA, debe usar una función diferente, documentada aquí , y luego, por supuesto, modificar el resto del código para que coincida con ese tamaño de hash.
La razón por la que obtiene diferentes hashes en diferentes momentos se debe al acceso a una parte no inicializada del búfer malloc
. Este es un comportamiento indefinido, por lo que "cualquier cosa" puede suceder, y generalmente no es útil tratar de averiguar qué sucede exactamente, porque no es necesariamente muy determinista. Si desea profundizar más que eso, podría, por ejemplo, usar un depurador para examinar las direcciones de memoria y el contenido en diferentes iteraciones de bucle para ver qué cambió exactamente. Sin embargo, dado que este es un comportamiento indefinido, es notoriamente común que el código incorrecto se comporte de manera diferente cuando intenta ejecutarlo con el depurador o agregar impresiones de depuración.
No estás llamando a SHA1
correctamente:
SHA1(input_ID, 160, hashed_ID_160bits);
El segundo parámetro es la longitud de los datos a hash. En cambio, está pasando la cantidad de bits en el hash. Como resultado, está leyendo más allá del final de la cadena contenida en input_ID
en la memoria no inicializada y posiblemente más allá del final del segmento de memoria asignado. Esto desencadena un comportamiento indefinido .
En cambio, quieres:
SHA1(input_ID, strlen(input_ID), hashed_ID_160bits);
El problema parece estar en la memoria no inicializada que está asignando.
malloc
reserva memoria para usted, pero el contenido es 'lo que haya estado allí antes'. Y dado que no solo está procesando el contenido de la cadena, sino todo el búfer, obtiene resultados diferentes cada vez.
Intente usar calloc
, ejecute memset
sobre el búfer o limite su hash a strlen(input)
y vea si eso ayuda.