我正在使用 SHA1 加密我的 ID。
但是,即使我輸入相同的 ID,它的哈希值也會不同。
這是我的代碼:
#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, "x", 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;
}
如果我為第一次嘗試和第二次嘗試輸入相同的值,它的哈希值將不同,但第三次嘗試的哈希值將與第二次嘗試相同。
我認為動態分配是一個問題,但我想不出辦法來解決它。
uj5u.com熱心網友回復:
你沒有SHA1正確呼叫:
SHA1(input_ID, 160, hashed_ID_160bits);
第二個引數是要散列的資料的長度。相反,您傳遞的是哈希中的位數。結果,您正在讀取包含在input_ID未初始化記憶體中的字串的末尾,并且可能超出了分配的記憶體段的末尾。這會觸發未定義的行為。
你反而想要:
SHA1(input_ID, strlen(input_ID), hashed_ID_160bits);
uj5u.com熱心網友回復:
SHA1(input_ID, 160, hashed_ID_160bits);
那條線是錯誤的。你總是得到 160 位元組的哈希值。我假設您只需要輸入文本的哈希值,因此請使用該長度:
SHA1(input_ID, strlen(input_ID), hashed_ID_160bits);
SHA1 總是產生 160 位的散列,因此您不需要將 160 作為引數傳遞。如果您想要不同大小的 SHA 哈希,您需要使用不同的函式,記錄在這里,然后當然修改其余代碼以匹配該哈希大小。
malloc為什么你在不同的時間得到不同的哈希值是因為訪問了緩沖區的未初始化部分。這是未定義的行為,因此“任何事情”都可能發生,嘗試弄清楚到底發生了什么通常沒有用,因為它不一定非常確定。如果您想更深入地挖掘,例如可以使用除錯器檢查不同回圈迭代的記憶體地址和內容,以查看究竟發生了什么變化。但是,由于這是未定義的行為,當您嘗試在除錯器下運行它或添加除錯列印時,錯誤代碼的行為不同是眾所周知的。
uj5u.com熱心網友回復:
問題似乎出在您分配的未初始化記憶體中。
malloc為您保留記憶體,但內容是“之前存在的任何內容”。而且由于您不僅要散列字串內容,還要散列整個緩沖區,因此每次都會得到不同的結果。
嘗試使用,在緩沖區calloc上運行或將散列限制為,看看是否有幫助。memsetstrlen(input)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/453564.html
下一篇:使用Bash腳本創建多個作業檔案
