• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

290
Views
¿Por qué tiene un hash diferente cuando se ingresa el mismo valor? Cª

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.

about 3 years ago · Santiago Trujillo
3 answers
Answer question

0

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.

about 3 years ago · Santiago Trujillo Report

0

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);
about 3 years ago · Santiago Trujillo Report

0

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.

about 3 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error