簡體   English   中英

在C中使用crypt進行簡單密碼比較

[英]Simple password compare using crypt in C

我從用戶那里讀取了第一個密碼並對其進行了加密。 然后我讀了第二個密碼並加密了。 然后我比較了兩個加密密碼,但比較總是表明它們是相同的。 我把問題縮小到這個:第二次加密后, passwordguess變量具有相同的值。 這是一個奇怪的錯誤; 任何人都可以提供洞察力和/或修復?

先感謝您。 編碼:

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的聯機幫助頁,它返回一個指向靜態緩沖區的指針。

你必須復制guesspassword

password = strdup(crypt(getpass("Enter Password1:"), salt));
...
guess = strdup(crypt(getpass("Enter Password2:"), salt));

crypt返回的值進行復制( strcopystrdup )。

來自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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM