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

Кто просматривает этот контент: "Тема" (Всего пользователей: 0; Гостей: 1)

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
5 616
Репутация
181
Jabber
#1
Я не знаю на сколько кому эти задачи нужны, дело в том их целесообразно решать, после прочтения соответствующих уроков, которых куча, а копипастом заниматься нехочу...

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

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

Решение:

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

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

CODE:
 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.png
 

0x0

VIP
VIP
Регистрация
01.09.2016
Сообщения
11
Репутация
8
Jabber
#2
Вот, кстати, в случае паролей, лучше сразу упомянуть, что для безопасности с ними надо работать через SecureString :)
 

rain.hf

Житель форума
Форумчанин
Регистрация
08.12.2015
Сообщения
133
Репутация
111
#3
Код:
#include <iostream>
#include <string>
#include <locale>

using namespace std;

bool password_is_valid(string password)
{
    string valid_pass = "ru-sfera.org";
    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;
}
 

0x0

VIP
VIP
Регистрация
01.09.2016
Сообщения
11
Репутация
8
Jabber
#4
Немного проапргейдим решение, добавим использование 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[i] = 0;
                }

                bytesPin.Free();
            }
        }
 

igorekvp

Пользователь
Первый уровень
Регистрация
15.03.2019
Сообщения
1
#5
Немного проапргейдим решение, добавим использование 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[i] = 0;
                }

                bytesPin.Free();
            }
        }
Немного проапргейдим решение, добавим использование 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[i] = 0;
                }

                bytesPin.Free();
            }
        }
А где лежит сам пароль???
 

virt

Уважаемый пользователь
Форумчанин
Регистрация
24.11.2016
Сообщения
474
Репутация
158
Jabber
#6
Код:
private static byte[] Passwd = new byte[] { 59, 209, 17, 65, 32, 125, 141, 46, 8, 140, 141, 237, 149, 175, 121, 137 };
Да и если речь пошла про безопасность, то лучше хранить не сам пароль, а его хеш, например md5.

Так и делается в нормальных системах, но там не md5 а посерьезней алгоритмы, смысл такой, что пароль реально не хранится, а проверяются хеши и если хакер украдет например базу паролей, то не будет знать пароли пользователей.)))
 
Вверх