2013-05-30 3 views
0

На основании примера crypt.c У меня есть следующий код, но когда я его запускаю, пароль1 повреждается во время второго вызова в крипте. Может ли кто-нибудь обнаружить проблему?Потеря данных в функции склепа в C

Ввод одного и того же пароля для обоих запросов приведет к тому же значению для всех трех строк в конце.

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

#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; 
} 

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

+0

Что такое 'crypt()' определение, когда оно возвращает NULL **? ** –

+1

@GrijeshChauhan - [crypt() man page] (http://linux.die.net/man/3/crypt) – Mike

+0

Ahaa .. Стандартная функция Спасибо @Mike! –

ответ

1

Ваша проблема в том, что эта функция:

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

возвращает временный указатель, который будет перезаписан при следующем вызове этой функции. Что вы хотите сделать, чтобы не перезаписывать ранее возвращенные данные:

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

вместо этого; это позволяет вам передать структуру, содержащую буфер для хранения зашифрованного пароля. Для получения дополнительной информации см. Справочную страницу для склепа.

Это позаботится о вашем исчезающем пароле1.

Отдельно это неверно: «Ввод того же пароля для обоих запросов приведет к тому же значению для всех трех строк в конце». Используя другую соль, вы получите другое зашифрованное значение.

+0

Вот почему мой «temp1», который является strdup, сохраняет свои данные целыми? – sybaseguru

+0

Если я правильно вас понимаю, да. Strdup копирует пароль1 в temp1 * перед * его паролем 1, перезаписываемым вторым вызовом 'crypt'. – wilsonmichaelpatrick

0

Вы передаете другое значение соли во второй вызов crypt() - это приведет к разным значениям возврата даже если пароли одинаковы.

+0

Не совсем - вы заметите, что соль появляется в начале зашифрованного пароля - делится на $ по спецификации. – sybaseguru

+0

Проблема не в разных значениях, но полная потеря значения в пароле1 - я искал утечки памяти, но безрезультатно. – sybaseguru

 Смежные вопросы

  • Нет связанных вопросов^_^