Форум
ПОИСК ПО ФОРУМУ
Портал
ПОИСК ПО ФОРУМУ
Авторы
Что нового
Медиа
Поиск медиа
Архив
Пользователи
Сейчас на форуме
Поиск сообщений в профиле
ПОИСК
Вход
Регистрация
Что нового
ПОИСК ПО ФОРУМУ
Меню
Вход
Регистрация
Установить приложение форума
Установить
Уменьшение отступа
Обратная связь
(info@ru-sfera.pw)
Форум
Программирование
Учимся кодить на задачках
Написать программу, которая будет запрашивать пароль
JavaScript отключён. Для полноценно использования нашего сайта, пожалуйста, включите JavaScript в своём браузере.
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно.
Необходимо обновить браузер или попробовать использовать
другой
.
Ответить в теме
Сообщение
<blockquote data-quote="0x0" data-source="post: 141125" data-attributes="member: 15178"><p>Немного проапргейдим решение, добавим использование SecureString. </p><p>Основная идея в том, что нельзя сохранять пароль в строке, так как GC его не сразу прибьёт после использования, и на какое-то время пароль еще будет доступен в памяти, и если следом выполняется вредоносный код, то он может получить доступ к этому паролю. </p><p>Так же не красиво, когда пароль вводится открытым текстом в консоли.</p><p>Пароль в комментарии к массиву байт хеша :)</p><p></p><p>[CODE] private static void Main(string[] args)</p><p> {</p><p> var md5 = MD5.Create();</p><p> int count = 0;</p><p> int maxCount = 5;</p><p> do</p><p> {</p><p> if (count > maxCount)</p><p> {</p><p> Console.WriteLine("Проспитесь!");</p><p> Console.ReadKey();</p><p> return;</p><p> }</p><p> if (count++ > 0)</p><p> {</p><p></p><p> Console.WriteLine("Пароль не верен, попробуйте ещё раз \n");</p><p> }</p><p> Console.Write("Введите пароль: \n");</p><p> </p><p></p><p> } while (!Passwd.SequenceEqual(HashSecureString(GetPassword(), bytes => md5.ComputeHash(bytes))));</p><p></p><p> Console.WriteLine("Свершилось!!!");</p><p> Console.ReadKey();</p><p>}</p><p></p><p>public static SecureString GetPassword()</p><p> {</p><p> var pwd = new SecureString();</p><p> while (true)</p><p> {</p><p> ConsoleKeyInfo i = Console.ReadKey(true);</p><p> if (i.Key == ConsoleKey.Enter)</p><p> {</p><p> break;</p><p> }</p><p> else if (i.Key == ConsoleKey.Backspace)</p><p> {</p><p> if (pwd.Length > 0)</p><p> {</p><p> pwd.RemoveAt(pwd.Length - 1);</p><p> Console.Write("\b \b");</p><p> }</p><p> }</p><p> else</p><p> {</p><p> pwd.AppendChar(i.KeyChar);</p><p> Console.Write("*");</p><p> }</p><p> </p><p> }</p><p> Console.Write("\n");</p><p> return pwd;</p><p> }</p><p> //Pizdec</p><p> private static byte[] Passwd = new byte[] { 59, 209, 17, 65, 32, 125, 141, 46, 8, 140, 141, 237, 149, 175, 121, 137 };</p><p> private static byte[] HashSecureString(SecureString input, Func<byte[], byte[]> hash)</p><p> {</p><p> var bstr = Marshal.SecureStringToBSTR(input);</p><p> var length = Marshal.ReadInt32(bstr, -4);</p><p> var bytes = new byte[length];</p><p></p><p> var bytesPin = GCHandle.Alloc(bytes, GCHandleType.Pinned);</p><p> try</p><p> {</p><p> Marshal.Copy(bstr, bytes, 0, length);</p><p> Marshal.ZeroFreeBSTR(bstr);</p><p></p><p> return hash(bytes);</p><p> }</p><p> finally</p><p> {</p><p> for (var i = 0; i < bytes.Length; i++)</p><p> {</p><p> bytes[i] = 0;</p><p> }</p><p></p><p> bytesPin.Free();</p><p> }</p><p> }[/CODE]</p></blockquote><p></p>
[QUOTE="0x0, post: 141125, member: 15178"] Немного проапргейдим решение, добавим использование SecureString. Основная идея в том, что нельзя сохранять пароль в строке, так как GC его не сразу прибьёт после использования, и на какое-то время пароль еще будет доступен в памяти, и если следом выполняется вредоносный код, то он может получить доступ к этому паролю. Так же не красиво, когда пароль вводится открытым текстом в консоли. Пароль в комментарии к массиву байт хеша :) [CODE] 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(); } }[/CODE] [/QUOTE]
Проверка
Ответ
Форум
Программирование
Учимся кодить на задачках
Написать программу, которая будет запрашивать пароль
Верх
Низ