我从用户那里读取了第一个密码并对其进行了加密。然后我读了第二个密码并加密了。然后我比较了两个加密密码,但比较总是表明它们是相同的。我将问题缩小到这个:第二次加密后,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.
答案 0 :(得分:5)
根据crypt
的联机帮助页,它返回一个指向静态缓冲区的指针。
您必须同时复制guess
和password
:
password = strdup(crypt(getpass("Enter Password1:"), salt));
...
guess = strdup(crypt(getpass("Enter Password2:"), salt));
答案 1 :(得分:3)
制作strcopy
返回的值的副本(strdup
或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
。