0

基于 crypt.c 示例,我有以下代码,但是当我运行它时,password1 在第二次调用 crypt 期间被损坏。谁能发现问题?

对两个请求输入相同的密码应该会导致最后所有三个字符串的值相同。

=================================================

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <crypt.h>
#define _XOPEN_SOURCE
#include <unistd.h>

/*
cc calc1.c -ocalc1 -lcrypt
*/

int main(void) {
    unsigned long seed[2];
    char salt[] = "$1$zhodFRlE$";
    char *password2,*password1,*temp1;
    int i,ok;
    printf("%s is Salt\n",salt);

    password1 = crypt(getpass("Password1 :"), salt);

    printf("Crypt Password1: %s\n",password1);
    temp1 = strdup(password1);
    printf("Crypt temp1: %s\n",temp1);

    password2 = crypt(getpass("Password2 :"),temp1);

    printf("Crypt Password1: %s\n",password1);
    printf("Crypt temp1: %s\n",temp1);
    printf("Crypt Password2: %s\n",password2);
    return 0;
}

==================================================== ===============

4

2 回答 2

1

你的问题是这个功能:

char *crypt(const char *key, const char *salt);

返回一个临时指针,下次调用该函数时将被覆盖。为了不覆盖以前返回的数据,您想要做什么:

char *crypt_r(const char *key, const char *salt,
                 struct crypt_data *data);

反而; 这允许您传入一个包含缓冲区以保存加密密码的结构。有关详细信息,请参阅 crypt 的手册页。

这将处理您消失的密码1。

另外,这是不正确的:“对两个请求输入相同的密码应该导致所有三个字符串最后的值相同。” 通过使用不同的盐,您将获得不同的加密值。

于 2013-05-30T21:17:32.260 回答
0

You pass a different salt value into the second call to crypt() - this will result in different return values even if the passwords are the same.

于 2013-05-30T19:12:07.163 回答