Я сравниваю две переменные с одинаковым значением, но он говорит, что они разные - PullRequest
1 голос
/ 23 июня 2019

Ну, меня попросили немного поработать с SHA-256. Я должен получить имя пользователя и пароль от пользователя (в консоли), изменить пароль на хэш-значение SHA-256 и закрыть файл (двоичный файл). Затем я должен прочитать его снова, получить его данные и сравнить его с новыми пользовательскими данными, проверяя, совпадают ли они или нет. Простая система входа в систему с использованием хеширования SHA-256. Дело в том, что я пишу случайное имя пользователя и пароль, но когда я пытаюсь сравнить их позже на втором этапе, это не удается. Часть SHA-256 идет прямо из исходного кода, это не было целью этого назначения.

Я попытался изменить все свои массивы char на strings, used, strcpy, strcpy_s и strncpy (на всякий случай) и другие, но, похоже, это не сработало. Большая часть кода поступает непосредственно из SHA-256 (мой учитель прислал его), но я все равно выложу его здесь

Я помещаю весь код в pastebin (он довольно длинный): https://pastebin.com/W9jxsbK6

Я не знаю, как правильно редактировать в этом текстовом поле, поэтому, пожалуйста, используйте ссылку для вставки в корзину.

struct Credentials {
char user[10];
char password[256];};

int main() {
Credentials c;
char user2[10];
char password2[256];
string test;
fstream file;

int opc;
do{
    cout << "Menu:" << endl;
    cout << "1.Create new user and password" << endl;
    cout << "2.Validate user and password" << endl;
    cin >> opc;
    switch(opc){
    case 1:
        cout << "Type the user name" << endl;
        cin >> user2;
        strcpy_s(c.user, sizeof user2, user2);
        cout << "Type the password" << endl;
        cin >> password2;
        test = SHA256::digestString(password2).toHex();
        strcpy_s(c.password, sizeof test, test.c_str());           

        file.open("credentials.dat",ios::out|ios::binary);
        if(!archivo){
            cout<<"Error...\n";
        return -1;
        }

        file.write((char*)&c,sizeof(c));
        file.close();

        break;

    case 2:
        cout << "Type user name" << endl;
        cin >> user2;
        cout << "Type password" << endl;
        cin >> password2;
        file.open("credentials.dat",ios::in|ios::binary);
        if(!file){
            cout<<"Error...\n";
        return -1;
        }

        if(file.read((char*)&c,sizeof(Credentials))){
            if(c.user == user2 && SHA256::digestString(password2).toHex() == c.password){
                cout << endl << endl << "User validated" << endl;
            }else{
                cout << endl << endl << "Error" << endl;
            }
        }
    }

} while (opc > 0 && opc < 3);
cin.ignore();
return 0;

}

1 Ответ

0 голосов
/ 24 июня 2019

if (c.user == user2)

Поскольку user2 является массивом символов, а Credentials::user также является массивом символов, эта строка не соответствует сравнению двухсимвольных массивов. Эта строка сравнивает два указателя, а не содержимое массивов.

Используемая функция: strcmp , или, если вы хотите сравнить конкретно N символов, функция будет strncmp.

#include <cstring>
//...
if ( strcmp(c.user, user2) == 0)
{
   // strings are equal
}

Теперь, если бы c.user и / или user2 были std::string, тогда использование == для сравнения работало бы. Вот почему использование std::string гораздо более интуитивно понятно, чем использование массивов символов в этом отношении - такие операции, как ==, на самом деле работают, как и ожидалось.

...