4

ユーザーから最初のパスワードを読み取り、暗号化しました。次に、2 つ目のパスワードを読み取り、暗号化しました。次に、2 つの暗号化されたパスワードを比較しましたが、比較すると、常に等しいことが示されます。私は問題をこれに絞り込みました: 2 回目の暗号化の後、変数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.
4

2 に答える 2

6

のマンページによるとcrypt、静的バッファへのポインタを返します。

との両方をコピーする必要がありguessますpassword

password = strdup(crypt(getpass("Enter Password1:"), salt));
...
guess = strdup(crypt(getpass("Enter Password2:"), salt));
于 2012-11-15T00:44:05.143 に答える
3

によって返された値のコピー (strcopyまたは) を作成します。strdupcrypt

のマンページから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

于 2012-11-15T00:43:55.067 に答える