Первая попытка авторизации на C++

Сегодня впервые попробовал написать программку, в которой должна проходить авторизация (неважно к чему, в данном случае, важен сам факт авторизации).
Кто может что посоветовать по сабжу? C++ учу 2, максимум, 3 месяца уже (в школе был QBasic и Паскаль).
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    string ra, login, pass, rpass, rlogin, clogin, cpass;
    cout << "Hello!" << endl << "register/authorize(r/a): ";
    cin >> ra;
    if (ra == "r")
    {
        cout << "login: ";
        cin >> rlogin;
        cout << "password: ";
        cin >> rpass;
        ofstream flogin("login.txt");
        flogin << rlogin;
        flogin.close();
        ofstream fpass("pass.txt");
        fpass << rpass;
        fpass.close();
    };
    if (ra == "a")
    {
        cout << "...reading..." << endl;
        ifstream flogin("login.txt");
        ifstream fpass("pass.txt");
        while (!flogin.eof() & !fpass.eof())
        {
            flogin >> clogin;
            fpass >> cpass;
        };
        cout << "login: ";
        cin >> login;
        cout << "password: ";
        cin >> pass;
        fpass.close();
        flogin.close();
        if (login == clogin & pass == cpass)
        {
            cout << "ready!" << endl;
        }
        else if (login != clogin)
         {
            cerr << "Error: invalid login" << endl;
            system("pause");
        }
        else if(pass != cpass)
        {
            cerr << "Error: invalid password" << endl;
            system("pause");
        };
    };
    if (ra != "a" & ra != "r")
    {
        cerr << "Fatal error: invalid value" << endl;
        system("pause");
    };
    system("pause");
}


как ни странно, всё это у меня компильнулось и, даже, работает :3

P.S. Про то, что пасс и логин хранятся в файлах формата txt, да и ещё в незашифрованном виде, можно не писать - про это и так знаю.

Оставить комментарий

Комментарии:

 

ftc | 2011-08-21 13:15:37

Из минусов, которые явно бросаются в глаза:
1) При вводе пароля ничего не скрывается - не слишком безопасно (даже если пароль хранить в незашифрованном виде, лучше если при вводе он отображаться не будет). Как пример - любая форма авторизации через http: пароль все равно передается по сети в открытом виде ;-)
2) Если в логине или пароле есть пробелы, будет весело... :-)
Ответить.

     

    4Never | 2011-08-21 14:03:06

    1) а как можно скрыть пасс тогда?
    2) угу. Я далеко не в первый раз с такой проблемой сталкиваюсь. Стринги, в этом плане, как-то не радуют. :(

    апд.: если разберусь со пробелами, то у меня появятся шансы победить в "войне" с шифровкой. Я в начале июня наваял ключик шифрования. Простенький, но мне хватит. Пробовал писать энкодер для этого ключа (опять же, доизвращался со стрингами в С++ так, что из введённого текста шифровался только последний символ).

    Редактировано 2011-08-21 14:09:06.
    Ответить.

       

      zurg | 2011-08-21 19:03:11

      Если пароль вводится в консоли, то в С (навернои в С++) есть функция getpass("Бла-Бла, текст информирующий, что щаз надо пароль вводить") вроде.
      Ответить.

         

        4Never | 2011-08-22 09:28:45

        ok, thanks :)
        попробую.

        апд.: попробовал. Не получилось. Загуглил. там написано, что гетпасс идёт под уникс и не идёт под винду.

        Редактировано 2011-08-22 09:52:26.
        Ответить.

         

       

      ftc | 2011-08-22 09:36:59

      По поводу пробелов имеет смысл поизучать функцию getline класса istream. Она до перевода строки читает. Правда для шифрования такой вариант не подойдет - надо читать/писать в бинарном режиме. Это можно сделать посимвольно например так (для чтения):
      string s = "";
      FILE* fin = fopen("file.bin", "rb");
      int c = getc(fin);
      while (c != EOF)
      {
          s += c;
          c = getc(fin);
      }
      fclose(fin);
      

      Кстати, здесь есть фича в том, что c имеет тип int, хотя казалось бы символы надо читать в char. Это связано с тем, что getc() возвращает код символа от 0 до 255, а EOF - константа, равная -1. Если читать символ в char и сравнивать с EOF, то символ с кодом 255 прочитать будет увы нельзя.
      <div>
      После этого в s будет весь файл в бинарном режиме. В частности переводы строк под виндой будут идти как два символа (с кодами 13 а потом 10).
      С записью аналогично: открываем в бинарном режиме и пишем. И да, в этом случае библиотека cstdio на мой взгляд удобнее.</div>

      Редактировано 2011-08-22 09:49:15.
      Ответить.

       

     

 

skydweller | 2012-12-04 00:16:16

1) разбить программу на самодостаточные логические куски (функции)
2) реализовать машину состояний для мониторин состояния системы
3) работать не с паролями, а с хэшами

Редактировано 2012-12-04 00:16:30.
Ответить.

     

    4Never | 2012-12-04 03:13:14

    Уже больше года прошло с того времени, когда я написал этот пост.
    Спасибо.
    Но ваши советы уже неактуальны для меня. Извините.
    Хотя на момент написания я даже не был знаком с функциональным программированием. В то время мне это было бы очень интересно.
    Ответить.