4

我从用户那里读取了第一个密码并对其进行了加密。然后我读取了第二个密码并对其进行了加密。然后我比较了两个加密密码,但比较总是表明它们是相等的。我将问题缩小到这个:在第二次加密之后,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,它返回一个指向静态缓冲区的指针。

您必须同时复制guesspassword

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

复制(strcopystrdup)返回的值crypt

从手册页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 回答