[英]Simple password compare using crypt in C
我從用戶那里讀取了第一個密碼並對其進行了加密。 然后我讀了第二個密碼並加密了。 然后我比較了兩個加密密碼,但比較總是表明它們是相同的。 我把問題縮小到這個:第二次加密后, password
和guess
變量具有相同的值。 這是一個奇怪的錯誤; 任何人都可以提供洞察力和/或修復?
先感謝您。 編碼:
int main(void)
{
char salt[] = "00";
char *password;
char *guess;
password = crypt(getpass("Enter Password1:"), salt);
printf("password = %s\n", password);
guess = crypt(getpass("Enter Password2:"), salt);
printf("password = %s\n", password);
printf("guess = %s\n", guess);
puts(strcmp(guess, password) == 0
? "Access Granted." : "Access Denied.");
return 0;
}
輸出:
Enter Password1:
password = 007XN7q4UF/o6
Enter Password2:
password = 00MqrTyK65aEA
guess = 00MqrTyK65aEA
Access Granted.
根據crypt
的聯機幫助頁,它返回一個指向靜態緩沖區的指針。
你必須復制guess
和password
:
password = strdup(crypt(getpass("Enter Password1:"), salt));
...
guess = strdup(crypt(getpass("Enter Password2:"), salt));
對crypt
返回的值進行復制( strcopy
或strdup
)。
來自crypt
的手冊頁:
返回值指向靜態數據,其內容被每次調用覆蓋。
password = strdup(crypt(getpass("Enter Password1:"), salt));
...
guess = strdup(crypt(getpass("Enter Password2:"), salt));
...
free(guess);
free(password);
或者,您可以使用較少可移植的crypt_r
,它允許您指定包含非靜態緩沖區的結構(如果在堆棧上分配,則不必顯式釋放,如下所示):
crypt_data password_data = { 0 };
crypt_data guess_data = { 0 };
...
password = crypt_r(getpass("Enter Password1:"), salt, &password_data);
...
guess = crypt_r(getpass("Enter Password2:"), salt, &guess_data);
請注意,每個crypt_data
結構雖然消耗大約crypt_data
的內存,但這對您的需求來說crypt_data
過分了; crypt_r
的主要受眾是多線程應用程序,可以同時調用crypt
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.