2012-11-15 21 views
3

我從用戶讀取第一個密碼並對其進行加密。然後我讀取第二個密碼並加密。然後我比較了兩個加密的密碼,但比較始終表明它們是相同的。我將問題縮小到這個範圍:在第二次加密之後,passwordguess變量具有相同的值。這是一個奇怪的錯誤;任何人都可以提供見解和/或修復?在C中使用crypt的簡單密碼比較

預先感謝您。的代碼:

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. 

回答

5

根據crypt的手冊頁,它返回一個指向靜態緩衝區的指針。

你必須既guesspassword複製:

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

謝謝!這解決了它。我以爲我排除了getpass()作爲罪魁禍首,但當時肯定有一個額外的錯誤。 – Noah

3

使由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結構約消耗的內存,雖然,這是過度的滿足您的需要128kB的; crypt_r的主要受衆是可同時呼叫crypt的多線程應用程序。