Задачка Написать программу, которая будет запрашивать пароль

Тема в разделе "Учимся кодить на задачках", создана пользователем X-Shar, 1 окт 2015.

↑ ↓
  1. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.810
    Симпатии:
    427
    Пол:
    Мужской
    Репа:
    +961 / 152 / -29
    Jabber:
    Skype:
    ICQ:

    638294628

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

    Но вот ещё задача:

    Напишите программу, которая будет «спрашивать» правильный пароль, до тех пор, пока он не будет введен. Правильный пароль пусть будет «Пароль».

    Решение:

    Вообще решать можно по разному, но я сделал при помощи бесконечного цикла, такой приём часто используют кто кодит для микроконтроллеров, зацикливают main, а сама программа уже выполняется по прирываниям...

    Тут-же всё просто:

    Код:
     static void Main(string[] args)
      {
      
    string Parol "Пароль"//Правильный пароль
      
    string UserParol;
      do
      {

      
    Console.Write("Скажите пароль: ");
      
    UserParol Console.ReadLine();

      if (
    Parol == UserParol)
      {
      
    Console.Write("Пароль верен !");
      break;
      }
      else
      {
      
    Console.Write("Пароль не верен, попробуйте ещё раз !\n");
      }
      }
      while (
    true);

      
    Console.ReadKey();
      }
    Единственное я всегда пишу while (1), но в С# что-то несканало, пришлось сделать while (true) что в общем-то одно и тоже...

    Ну и далее сревнение, в случае правильного ответа, выход их цикла, иначе будет постоянно спрашивать пароль !смех-смех!!!

    upload_2015-10-1_15-19-58.
     
    • Мне нравится Мне нравится x 3
  2. 0x0 VIP
    0x0
    Ответить в чате

    VIP

    Регистрация:
    01.09.2016
    Сообщения:
    14
    Симпатии:
    19
    Пол:
    Мужской
    Репа:
    +19 / 0 / -0
    Jabber:
    Вот, кстати, в случае паролей, лучше сразу упомянуть, что для безопасности с ними надо работать через SecureString :)
     
  3. rain.hf Житель форума
    rain.hf
    Ответить в чате

    Форумчанин

    Регистрация:
    08.12.2015
    Сообщения:
    134
    Симпатии:
    111
    Репа:
    +121 / 3 / -6
    Код:
    #include <iostream>
    #include <string>
    #include <locale>
    
    using namespace std;
    
    bool password_is_valid(string password)
    {
        string valid_pass = "ru-sf.ru";
        if (valid_pass == password)
            return true;
        else
            return false;
    }
    
    void get_pass()
    {
        string user_pass;
        cout << "Введите пароль: ";
        getline(cin, user_pass);
        if (!password_is_valid(user_pass)) {
            cout << "Неверный пароль!" << endl;
            get_pass();
        }
        else {
            cout << "Доступ разрешен." << endl;
        }
    }
    
    int main()
    {
        setlocale(LC_ALL, "Russian");
        get_pass();
        system("pause");
        return 0;
    }
    
     
    • Мне нравится Мне нравится x 2
  4. 0x0 VIP
    0x0
    Ответить в чате

    VIP

    Регистрация:
    01.09.2016
    Сообщения:
    14
    Симпатии:
    19
    Пол:
    Мужской
    Репа:
    +19 / 0 / -0
    Jabber:
    Немного проапргейдим решение, добавим использование SecureString.
    Основная идея в том, что нельзя сохранять пароль в строке, так как GC его не сразу прибьёт после использования, и на какое-то время пароль еще будет доступен в памяти, и если следом выполняется вредоносный код, то он может получить доступ к этому паролю.
    Так же не красиво, когда пароль вводится открытым текстом в консоли.
    Пароль в комментарии к массиву байт хеша :)

    Код:
       private static void Main(string[] args)
            {
                var md5 = MD5.Create();
                int count = 0;
                int maxCount = 5;
                do
                {
                    if (count > maxCount)
                    {
                        Console.WriteLine("Проспитесь!");
                        Console.ReadKey();
                        return;
                    }
                    if (count++ > 0)
                    {
    
                        Console.WriteLine("Пароль не верен, попробуйте ещё раз \n");
                    }
                    Console.Write("Введите пароль: \n");
                   
    
                } while (!Passwd.SequenceEqual(HashSecureString(GetPassword(), bytes => md5.ComputeHash(bytes))));
    
                Console.WriteLine("Свершилось!!!");
                Console.ReadKey();
    }
    
    public static SecureString GetPassword()
            {
                var pwd = new SecureString();
                while (true)
                {
                    ConsoleKeyInfo i = Console.ReadKey(true);
                    if (i.Key == ConsoleKey.Enter)
                    {
                        break;
                    }
                    else if (i.Key == ConsoleKey.Backspace)
                    {
                        if (pwd.Length > 0)
                        {
                            pwd.RemoveAt(pwd.Length - 1);
                            Console.Write("\b \b");
                        }
                    }
                    else
                    {
                        pwd.AppendChar(i.KeyChar);
                        Console.Write("*");
                    }
                   
                }
                Console.Write("\n");
                return pwd;
            }
            //Pizdec
            private static byte[] Passwd = new byte[] { 59, 209, 17, 65, 32, 125, 141, 46, 8, 140, 141, 237, 149, 175, 121, 137 };
            private static byte[] HashSecureString(SecureString input, Func<byte[], byte[]> hash)
            {
                var bstr = Marshal.SecureStringToBSTR(input);
                var length = Marshal.ReadInt32(bstr, -4);
                var bytes = new byte[length];
    
                var bytesPin = GCHandle.Alloc(bytes, GCHandleType.Pinned);
                try
                {
                    Marshal.Copy(bstr, bytes, 0, length);
                    Marshal.ZeroFreeBSTR(bstr);
    
                    return hash(bytes);
                }
                finally
                {
                    for (var i = 0; i < bytes.Length; i++)
                    {
                        bytes = 0;
                    }
    
                    bytesPin.Free();
                }
            }
     
    • Мне нравится Мне нравится x 2

Поделиться этой страницей