0

crypt.c の例に基づいて、次のコードを作成しましたが、実行すると、crypt への 2 回目の呼び出しで password1 が破損します。誰でも問題を見つけることができますか?

両方の要求に同じパスワードを入力すると、最後の 3 つの文字列すべてで同じ値が返されます。

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

#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 の man ページを参照してください。

これで、消える password1 が処理されます。

これとは別に、これは正しくありません。「両方のリクエストに同じパスワードを入力すると、末尾の 3 つの文字列すべてが同じ値になるはずです。」別のソルトを使用すると、別の暗号化された値が得られます。

于 2013-05-30T21:17:32.260 に答える
0

crypt() への 2 番目の呼び出しに異なるソルト値を渡します。これにより、パスワードが同じであっても、異なる戻り値が返されます。

于 2013-05-30T19:12:07.163 に答える