Угадай пароль, почему мой пароль не похож на настоящий хешированный пароль? - PullRequest
0 голосов
/ 06 ноября 2018

Я работал над программой угадывания пароля, и теперь я пытался выяснить, как заставить ее угадывать пароль, который хэшируется. Моя проблема в том, что вывод моего угаданного пароля не похож на хешированный пароль. Мне было интересно, может ли кто-нибудь указать мне правильное направление.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <crypt.h>
#include <sys/random.h>

#define BUFFERSIZE 10000

const char saltchars[]="abcdefghikjlmnopqrstuvWxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890+@£[]}";
static const int saltcharsSize = sizeof(saltchars) -1;
int counter = 100;
char saltCopy[13];
char passwordCopy[22];

Я инициализирую алфавит и некоторые глобальные переменные для функций.

void crack(char* string, int index, int maxSize) {
    for (int i = 0; i < saltcharsSize; ++i) {
        char* guessPassword = crypt(string, saltCopy);

        if(strcmp(guessPassword, passwordCopy) == 0) {
            printf("Found password: %s\n", string);
        }
        string[index] = saltchars[i];

        if (index == maxSize -1) {
            printf("%s\n", guessPassword);
        }
        else crack(string, index + 1, maxSize);
    }
}

void crackRecursive(int maxLength) {
    char* buffer = malloc(maxLength + 1);

    for (int i = 1; i <= maxLength; ++i) {
        memset(buffer, 0, maxLength + 1);
        crack(buffer, 0, i);
    }
    free(buffer);
}

здесь я пытаюсь попросить его зашифровать пароль, используя ту же соль, и сравнить его с копией.

void readDictionary(char* file) {
    FILE *filePointer = fopen(file, "r");

    char buffer[BUFFERSIZE];

    while(fgets(buffer, BUFFERSIZE -1, filePointer) != NULL && counter != 0) {
        char* guessPasswordNew = crypt(buffer, saltCopy);

        if(strcmp(guessPasswordNew, passwordCopy) == 0){
            printf("found password: %s\n", buffer);
        }
        counter--;
    }
    fclose(filePointer);
    free(filePointer);
    printf("\nEnd of program\n");
}

здесь я читаю файл в своем словаре и пытаюсь угадать, является ли оно одним из слов в файле. Та же процедура при угадывании пароля здесь.

int cryptPassword(char* password){
    char salt[13]="$1$abcdefgh$";
    getrandom(salt+3,8,0);
    for(unsigned int i=3;i<11;i++){
        salt[i]=saltchars[salt[i] & 0x3f];
    }
    printf("password is: %s\n", password);
    printf("salt is: %s\n", salt);
    strcpy(saltCopy, salt);
    char* encrypted=crypt(password,salt);
    strcpy(passwordCopy, encrypted);
    printf("hashed password is: %s\n", encrypted);
    free(encrypted);
    return 0;
}

это шифрование, оно просто для установки соли, а затем с помощью «crypt» для шифрования пароля с солью.

int main(int argc, char *argv[]) {
    cryptPassword("earlybird");
    crackRecursive(2);
    readDictionary("dictionary.txt");
}

наконец, это основной метод, в котором я устанавливаю пароль «earlybird», который находится в файле dictionary.txt. Я также пробовал с «аА», и это не сработало.

Методы распечатывают все, что я хочу, трещина печатает «aa», а затем «ab» и продолжает перебирать алфавит, который я указала, до конца. Словарь читается правильно. Конечно, это только когда я говорю ему напечатать строку в «crack» и «buffer» в readDictionary.

Я подозреваю, что с солью я совершаю какую-то ошибку, так как похоже, что в хешированном пароле есть соль впереди, а мои предположения - нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...