C# баг — C# консоль. Ввод пароля.


Содержание

C# баг — C# консоль. Ввод пароля.

Уроки Windows Forms C++/C#

Реализация ввода пароля в MVS C++/C#

В данном уроке вы узнаете, как создать панель ввода пароля, в которой при вводе вместо вводимых знаков отображаются звёздочки ‘*’. Если вам не нравятся звёздочки, то вы можете задать любой другой символ. Данная функция называется “PasswordChar”. Давайте создадим проект, в котором в текстовое поле надо будет ввести условный пароль, после нажатия на кнопку появится окно сообщений и покажет какой пароль был написан. Для этого создайте новый проект в приложении в «Windows Forms» и перенесите на форму из панели инструментов “textBox”, “button” и “pictureBox”. В свойствах “pictureBox” выберите «BackgroundImage” и поставьте вот это изображение, если вы не знаете как загрузить изображение – обязательно изучите предыдущий урок :

Так же вы можете изменить цвет формы и «textbox». Вот что должно получатся:

Так же сделаем так, что бы текст вводился из середины поля. Перейдём к коду, чтобы вместо вводимыз отображался только один какой-то символ вызывается свойство «textBox»«PasswordChar», вот полный код проекта:

#pragma endregion private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) < this->Text = «Ввод пароля»; textBox1->PasswordChar = ‘*’; textBox1->TextAlign = HorizontalAlignment::Center; // пишем текст из середины button1->Text = «Ввод»; > private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) < MessageBox::Show(textBox1->Text, «Вы ввели:»); > >; >

Обеспечение ввода пароля в C # основного DotNet консольного приложения

долгое время Lurker здесь, наконец, имея вопрос, что я не вижу. Я пишу на C # консольное приложение в ядре Dotnet и пытаюсь разрешить пользователю ввести пароль, и заботится о безопасности, в частности, памяти демпинга.

После: Пароль маскирования консольное приложение мое понимание , что пароль хранится в виде строковой переменной может попадать через дамп памяти ( эталонного ).

SecureString обычно будет путь здесь , но , кажется, не будет поддерживаться в Dotnet ядра .

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

Некоторые комментарии: 1) Прежде всего, помните, что безопасность не будет решена в одном приложении. Для кого-то с полным доступом к машине нет (почти) ничего вы можете сделать, чтобы сохранить пароль действительно безопасным.

(Fun упражнения: Как бы вы проверить подлинность пароля без сохранения пароля в памяти у всех?)

2) SecureString только дает вам больший контроль над продолжительностью жизни пароля в памяти, что позволяет определить, когда он уходит. Нормальная строка не может длиться очень долго в памяти, даже до выхода из программы, так как он не уходит до сбора мусора. SecureString позволяет Явно стереть ее, но она до сих пор существует в памяти до сих пор.

3) Используя свой собственный массив символов является хорошей идеей, но я мог бы использовать список, поскольку он позволяет переменную длину, или, может быть, даже LinkedList, потому что он распространяет символы в памяти. Shrug. Обратитесь к # 1 и рассмотрим, какие атаки вы защищаете пароль от.

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

Обучение C#

Формула программиста

Работая с этим сайтом, Вы даете согласие на использование файлов Cookie.

Класс Console для работы с консолью

Заголовок окна консоли

Ввод-вывод

Наиболее часто используемыми являются методы чтения и записи информации.
Для вывода информации в окно консоли используются два основных метода

  • Write() — для вывода информации без перевода строки;
  • WriteLine() — для вывода информации с переводом строки.

В качестве аргумента этим функциям может передаваться текстовая строка для вывода, а также объект других стандартных типов данных, который по умолчанию будет преобразован к строковому представлению.

Для ввода текстовой информации из окна консоли используются методы

  • ReadLine() , который считывает строку текста из входного потока;
  • Read() – считывает следующий символ из входного потока.

Также для ввода информации в консоли может использоваться метод ReadKey() , который очень часто используется в конце программы для задержки окна консоли.

Метод ReadKey() возвращает значение символа или нажатой функциональной клавиши, преобразованное к формату структуры ConsoleKeyInfo .
Структура ConsoleKeyInfo , в свою очередь, содержит 3 поля:

  • Key — ключ консоли, представленный текущим ConsoleKeyInfo объекта;
  • KeyChar — знак Юникода, представленный текущим ConsoleKeyInfo объекта;
  • Modifiers — побитовое значение, указывающее на одновременное удержание клавиш Alt, Ctrl, Shift при нажатии клавиши.

По умолчанию нажатая клавиша отображается в окне консоли, но отображение можно отключить, передав функции ReadKey() единственный аргумент с логическим значением true .
Рассмотрим пример вывода в консоль значений считанной клавиши до нажатия клавиши Esc.

namespace MyProgram
<
class Program
<
static void Main( string [] args)
<
Console .Title = «Работа с консолью» ;
ConsoleKeyInfo key;
do
<
key = Console .ReadKey( true );
if ((key.Modifiers & ConsoleModifiers .Alt) != 0)
Console .Write( «Alt + » );
if ((key.Modifiers & ConsoleModifiers .Shift) != 0)
Console .Write( «Shift + » );
if ((key.Modifiers & ConsoleModifiers .Control) != 0)
Console .Write( «Ctrl + » );
Console .WriteLine(key.Key.ToString() + » » + key.KeyChar.ToString());
> while (key.Key != ConsoleKey .Escape);

Цветовое оформление консоли

Для изменения цветового оформления консоли используются следующие свойства класса Console :

  • BackgroundColor — для изменения фона под символами;
  • ForegroundColor — для изменения цвета самих символов.

Для того чтобы изменить цвет фона всего консольного окна необходимо установить требуемое значение параметра BackgroundColor и вызвать метод Clear() — очистка окна консоли.
Следующий пример перебирает и выводит на экран названия всех 16 цветов, используемых при работе с консолью.

Размер окна и буфера консоли

По умолчанию размер окна консоли составляет 80 символов в ширину и 25 символов в высоту. Но этот размер можно изменить с помощью методов

  • WindowWidth – ширина окна консоли;
  • WindowHeight – высота окна консоли.

Однако кроме размеров окна консоли существует понятие размеров буфера консоли, который задается с помощью свойств

  • BufferWidth – ширина буфера;
  • BufferHeight – высота буфера.

Чтобы узнать значения этих свойств по умолчанию, выведем их в окно консоли


Изменение видимых размеров окна позволяет увеличить или уменьшить его в процессе выполнения программы. Если размер буфера превышает размер видимого окна, то у окна появляются полосы прокрутки, позволяющие просматривать все содержимое буфера.
Например, вывод 100 символов ‘*’ и вертикальной черты ‘|’ в стандартном окне консоли будет выглядеть так:

Если мы увеличим размер буфера для ширины строки, то появится нижняя полоса прокрутки, и весь текст уместится в одну строку.

Аналогичным образом при выводе в окно консоли числа строк, превышающего размер буфера, сохранятся только последние выведенные строки в количестве, равном BufferHeight .

Перемещение курсора в окне консоли

Для перемещения курсора в окне консоли могут использоваться свойства

  • CursorLeft – задает или считывает позицию курсора слева в буферном окне;
  • CursorTop – задает или считывает позицию курсора сверху в буферном окне.

Для задания позиции курсора сразу по двум координатам используется метод SetCursorPosition(left, top) .
Пример вывода символов в различных позициях курсора. Для наглядности между выводом символов введена задержка 200 мс.

Цукерберг рекомендует:  Хочешь узнать, сколько раз скачали файл с твоего сайта

using System;
using System.Threading;
namespace MyProgram
<
class Program
<
static void Main( string [] args)
<
int [] x = new int [] < 2, 2, 3, 3, 4, 5, 5, 6, 6,
9, 9, 9, 9, 9,
12, 12, 12, 12, 12, 13, 13, 14, 14, 14,
17, 17, 17, 17, 17, 18, 18, 18, 19, 19,
22, 22, 22, 22, 22, 23, 23, 24, 24, 24, 24, 24,
27, 27, 28, 28, 28, 29, 29,
32, 32, 32, 32, 32, 33, 34, 34, 34, 34, 34,
37, 37, 37, 37, 38, 38, 39, 39, 39, 39,
42, 42, 42, 42, 42, 43, 43, 44, 44, 44,
47, 47, 47, 47, 47, 48, 48, 49>;
int [] y = new int [] < 2, 3, 4, 5, 6, 5, 4, 3, 2,
1, 3, 4, 5, 6,
2, 3, 4, 5, 6, 2, 6, 3, 4, 5,
2, 3, 4, 5, 6, 2, 4, 6, 2, 6,
2, 3, 4, 5, 6, 2, 6, 2, 3, 4, 5, 6,
3, 6, 2, 4, 6, 2, 5,
2, 3, 4, 5, 6, 4, 2, 3, 4, 5, 6,
3, 4, 5, 6, 2, 4, 3, 4, 5, 6,
2, 3, 4, 5, 6, 2, 4, 3, 5, 6,
2, 3, 4, 5, 6, 2, 4, 3>;

Console .BackgroundColor = ConsoleColor .Blue;
Console .ForegroundColor = ConsoleColor .White;
for ( int i=0; i Console .SetCursorPosition(x[i], y[i]);
Console .Write( «*» );
Thread .Sleep(200);
>
Console .ReadKey();
>
>
>

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

Автор: Вставская Елена Владимировна

Console. Read Key Метод

Определение

Получает следующий нажатый пользователем символ или функциональную клавишу. Obtains the next character or function key pressed by the user.

Перегрузки

Получает следующий нажатый пользователем символ или функциональную клавишу. Obtains the next character or function key pressed by the user. Нажатая клавиша отображается в окне консоли. The pressed key is displayed in the console window.

Получает следующий нажатый пользователем символ или функциональную клавишу. Obtains the next character or function key pressed by the user. Нажатая клавиша может быть отображена в окне консоли. The pressed key is optionally displayed in the console window.

ReadKey()

Получает следующий нажатый пользователем символ или функциональную клавишу. Obtains the next character or function key pressed by the user. Нажатая клавиша отображается в окне консоли. The pressed key is displayed in the console window.

Возвраты

Объект, описывающий константу ConsoleKey и символ Юникода (при наличии), соответствующий нажатой клавише консоли. An object that describes the ConsoleKey constant and Unicode character, if any, that correspond to the pressed console key. Этот объект ConsoleKeyInfo также описывает в битовой комбинации значений ConsoleModifiers, нажимались ли клавиши-модификаторы (одна или несколько) Shift, Alt или Ctrl одновременно с клавишей консоли. The ConsoleKeyInfo object also describes, in a bitwise combination of ConsoleModifiers values, whether one or more Shift, Alt, or Ctrl modifier keys was pressed simultaneously with the console key.

Исключения

Свойство In перенаправлено из потока, отличного от консоли. The In property is redirected from some stream other than the console.

Примеры

Одним из наиболее распространенных ReadKey() способов использования метода является остановка выполнения программы до тех пор, пока пользователь не нажмет клавишу и приложение не завершит работу или не отобразит дополнительное окно информации. One of the most common uses of the ReadKey() method is to halt program execution until the user presses a key and the app either terminates or displays an additional window of information. В следующем примере ReadKey() метод используется для ожидания нажатия пользователем клавиши ВВОД перед завершением работы приложения. The following example uses the ReadKey() method to wait for the user to press the Enter key before terminating the app.

Обратите внимание, что эта ReadKey перегрузка метода по умолчанию отображает все отображаемые клавиши, которые пользователь нажимает на консоль. Note that this overload of the ReadKey method by default echoes any displayable keys that the user presses to the console. Чтобы подавить их, вызовите ReadKey метод intercept с аргументом true . To suppress them, call the ReadKey method with an intercept argument of true .

В следующем примере ReadKey() метод используется для вывода сведений о том, какой ключ пользователь нажал. The following example uses the ReadKey() method to display information about which key the user pressed.

Комментарии

Метод ожидает, то есть блокирует поток, ReadKey выдающий метод, пока не будет нажата клавиша со знаком или функцией. ReadKey The ReadKey method waits, that is, blocks on the thread issuing the ReadKey method, until a character or function key is pressed. Символ или клавиша может быть нажата в сочетании с одним или несколькими клавишами-модификаторами Alt, CTRL или Shift. A character or function key can be pressed in combination with one or more Alt, Ctrl, or Shift modifier keys. Однако нажатие клавиши-модификатора сама по себе не ReadKey приведет к возврату метода. However, pressing a modifier key by itself will not cause the ReadKey method to return.

В зависимости от приложения может потребоваться использовать ReadKey метод в сочетании KeyAvailable со свойством. Depending on your application, you might want to use the ReadKey method in conjunction with the KeyAvailable property.

Метод считывает данные с клавиатуры, даже если стандартные входные данные перенаправляются в файл SetIn с методом. ReadKey The ReadKey method reads from the keyboard even if the standard input is redirected to a file with the SetIn method.

Дополнительно

ReadKey(Boolean)

Получает следующий нажатый пользователем символ или функциональную клавишу. Obtains the next character or function key pressed by the user. Нажатая клавиша может быть отображена в окне консоли. The pressed key is optionally displayed in the console window.

Параметры

Определяет, следует ли отображать нажатую клавишу в окне консоли. Determines whether to display the pressed key in the console window. Значение true , чтобы не отображать нажатую клавишу; в противном случае — значение false . true to not display the pressed key; otherwise, false .

Возвраты


Объект, описывающий константу ConsoleKey и символ Юникода (при наличии), соответствующий нажатой клавише консоли. An object that describes the ConsoleKey constant and Unicode character, if any, that correspond to the pressed console key. Этот объект ConsoleKeyInfo также описывает в битовой комбинации значений ConsoleModifiers, нажимались ли клавиши-модификаторы (одна или несколько) Shift, Alt или Ctrl одновременно с клавишей консоли. The ConsoleKeyInfo object also describes, in a bitwise combination of ConsoleModifiers values, whether one or more Shift, Alt, or Ctrl modifier keys was pressed simultaneously with the console key.

Исключения

Свойство In перенаправлено из потока, отличного от консоли. The In property is redirected from some stream other than the console.

Примеры

Одним из наиболее распространенных ReadKey способов использования метода является остановка выполнения программы до тех пор, пока пользователь не нажмет клавишу и приложение не завершит работу или не отобразит дополнительное окно информации. One of the most common uses of the ReadKey method is to halt program execution until the user presses a key and the app either terminates or displays an additional window of information. В следующем примере ReadKey(Boolean) метод используется для ожидания нажатия пользователем клавиши ВВОД перед завершением работы приложения. The following example uses the ReadKey(Boolean) method to wait for the user to press the Enter key before terminating the app. Обратите внимание, что если пользователь нажмет какой-либо другой ключ, он не будет отображаться на консоли. Note that, if the user presses any other key, it is not echoed to the console.

В следующем примере ReadKey(Boolean) метод используется для отображения сведений о нажатой пользователем клавише без вывода этого ключа на консоль. The following example uses the ReadKey(Boolean) method to display information about the key pressed by a user without echoing that key to the console.

Комментарии

Метод ожидает, то есть блокирует поток, ReadKey выдающий метод, пока не будет нажата клавиша со знаком или функцией. ReadKey The ReadKey method waits, that is, blocks on the thread issuing the ReadKey method, until a character or function key is pressed. Символ или клавиша может быть нажата в сочетании с одним или несколькими клавишами-модификаторами Alt, CTRL или Shift. A character or function key can be pressed in combination with one or more Alt, Ctrl, or Shift modifier keys. Однако нажатие клавиши-модификатора сама по себе не ReadKey приведет к возврату метода. However, pressing a modifier key by itself will not cause the ReadKey method to return.

Цукерберг рекомендует:  Как подключить скрипт python к html - Как подключить скрипт python к html

Если параметр имеет значение true , нажатая клавиша перехватывается и не отображается в окне консоли; в противном случае нажатая клавиша отображается. intercept If the intercept parameter is true , the pressed key is intercepted and not displayed in the console window; otherwise, the pressed key is displayed.

В зависимости от приложения может потребоваться использовать ReadKey метод в сочетании KeyAvailable со свойством. Depending on your application, you might want to use the ReadKey method in conjunction with the KeyAvailable property.

Метод считывает данные с клавиатуры, даже если стандартные входные данные перенаправляются в файл SetIn с методом. ReadKey The ReadKey method reads from the keyboard even if the standard input is redirected to a file with the SetIn method.

C# баг — C# консоль. Ввод пароля.

Группа: Пользователи
Сообщений: 71
С нами с: 30-November 06

Есть задача! Нужно сделать логин в систему, тоесть пользователь вводит логин и пароль, понятно, что пароль не должны видеть :) вот и задача сделать так что бы место букв который вводить пользователь вводились » * «

П.С. Все это происходит в консоли !

Средствами языка этого сделать нельзя, но через интеропы можно:

[DllImport(«kernel32», SetLastError=true)]
private static extern IntPtr GetStdHandle(IntPtr whichHandle);

[DllImport(«kernel32», SetLastError=true)]
private static extern bool GetConsoleMode(IntPtr handle, out uint mode);

[DllImport(«kernel32», SetLastError=true)]
private static extern bool SetConsoleMode(IntPtr handle, uint mode);

private static readonly IntPtr STD_INPUT_HANDLE = new IntPtr(-10);
private const int ENABLE_LINE_INPUT = 2;
private const uint ENABLE_ECHO_INPUT = 4;

private static string GetSecret() <
// turn off console echo
IntPtr hConsole = GetStdHandle(STD_INPUT_HANDLE);
uint oldMode;
if (!GetConsoleMode(hConsole, out oldMode)) <
throw new ApplicationException(«GetConsoleMode failed»);
>
uint newMode = oldMode &

(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT);
if (!SetConsoleMode(hConsole, newMode)) <
throw new ApplicationException(«SetConsoleMode failed»);
>
int i;
StringBuilder secret = new StringBuilder();
Console.Write(«Enter password: «);
while (true) <
i = Console.Read();
if (i == 13) // break when
break;
secret.Append((char) i);
Console.Write(«*»);
>
Console.WriteLine();
// restore console echo and line input mode
if (!SetConsoleMode(hConsole, oldMode)) <
throw new ApplicationException(«SetConsoleMode failed»);
>
return secret.ToString();
>

Куда это и как вставить я думаю найти не сложно

C# консоль для выполнения простых «скриптов»

Вы когда нибудь выполняли массовое переименовывание файлов, или какую-нибудь другую, кажущуюся банально лёгкой, но рутинную задачу? Ни разу не создавали bat’ники, но знаете C#?

Находясь в похожей ситуации, в течение 15 минут было создано довольно простое приложение которое похоже на консоль, но которое понимает C#.

Приложение работает по принципу запоминания кода, и выполнения полученного скрипта. Поддерживается выполнение скрипта из файла, который появляется в директории с приложением при первом выполнении.

Были добавлены базовые команды, которые требуются для создания скрипта через консоль и его выполнения:
!show — показывает запомненный скрипт целиком
!del — удаляет последнюю строку в скрипте
!clear — стирает скрипт
!run — выполнит скрипт и сохранит его содержимое в файл «script.cs»
!runsc — выполнит скрипт из файла «script.cs» (для случая если вы редактируете файл текстовым редактором)

Исходник Program.cs (собственно всего приложения):

using System ;
using System.CodeDom.Compiler ;
using System.Collections.Generic ;
using System.IO ;
using System.Reflection ;
using System.Text ;
using Microsoft.CSharp ;

namespace SharpConsole
<
class Program
<
const string header = @»
using System;
using System.IO;
using System.Net;
using System.Threading;
using System.Collections.Generic;

namespace CScript
<
public class Script
<
public static void ScriptMethod()
<
» ;
const string footer = @»
>
>
>» ;

static void Main ( string [ ] args )
<
Console. Title = «SharpConsole» ;
Console. WriteLine ( «Welcome to SharpConsole v0.1. Type !help for help.» ) ;

List string > code = new List string > ( ) ;
while ( true )
<
Console. Write ( «csharp> » ) ;
string line = Console. ReadLine ( ) ;
switch ( line )
<
case «!run» :
<
string program = FormatSources ( code ) ;
File. WriteAllText ( «script.cs» , program ) ;
ExecuteScript ( program ) ;
>
break ;
case «!show» :
<
Console. WriteLine ( ) ;
Console. WriteLine ( FormatSources ( code ) ) ;
Console. WriteLine ( ) ;
>
break ;
case «!del» :
code. RemoveAt ( code. Count — 1 ) ;
break ;
case «!clear» :
<
code = new List string > ( ) ;
Console. WriteLine ( «Done.» ) ;
>
break ;
case «!runsc» :
<
string script = File. ReadAllText ( «script.cs» ) ;
ExecuteScript ( script ) ;
>
break ;
case «!help» :
<
string [ ] commands = new string [ ]
<
«1. Type your code and it will be added in script» ,
«2. !show will shows your code» ,
«3. !del remove last line from your code» ,
«4. !clear remove all lines from your code» ,
«5. !run will run script in memory and writes it in script.cs» ,
«6. !runsc will run script.cs» ,
«Have fun! :)» ,
> ;
foreach ( var str in commands )
Console. WriteLine ( str ) ;
>
break ;
default :
<
code. Add ( » » + line ) ;
>
break ;
>

private static void ExecuteScript ( string program )
<
var CSHarpProv >= CSharpCodeProv >CreateProvider ( «CSharp» ) ;
CompilerParameters compilerParams = new CompilerParameters ( )
<
GenerateExecutable = false ,
GenerateInMemory = true ,
> ;
compilerParams. ReferencedAssemblies . AddRange ( new string [ ]
<
«System.dll» ,
«System.Core.dll» ,
«System.Net.dll» ,
> ) ;
var compilerResult = CSHarpProv >CompileAssemblyFromSource ( compilerParams, program ) ;
if ( compilerResult. Errors . Count == 0 )
<
Console. WriteLine ( «Executing. » ) ;
try
<
compilerResult. CompiledAssembly . GetType ( «CScript.Script» ) . GetMethod ( «ScriptMethod» ) . Invoke ( null , null ) ;
Console. WriteLine ( «Done.» ) ;
>
catch ( Exception e )
<
Console. WriteLine ( e. InnerException . Message + «rn» + e. InnerException . StackTrace ) ;
>
>
else
<
foreach ( var oline in compilerResult. Output )
Console. WriteLine ( oline ) ;
>
>

private static string FormatSources ( List string > code )
<
string program = header ;
StringBuilder sb = new StringBuilder ( program ) ;


foreach ( var sc in code )
<
sb. AppendLine ( sc ) ;
>
sb. AppendLine ( footer ) ;
return sb. ToString ( ) ;
>
>
>

По умолчанию, при выполнении скрипта, к сборке подключаются 3 референса:

compilerParams. ReferencedAssemblies . AddRange ( new string [ ]
<
«System.dll» ,
«System.Core.dll» ,
«System.Net.dll» ,
> ) ;

Но вы можете добавить другие для ваших нужд.

Надеюсь это будет кому-нибудь полезно! Буду рад ответить на вопросы.

Заставка 6. Ввод пароля с заданным числом попыток.

Комментарий: допустим, для получения доступа к системе пользователь должен ввести правильный пароль. В приведенном ниже приложении пользователю предоставляется для этого три попытки. Выход из цикла происходит, если пользователь введет правильный пароль или исчерпает количество попыток. Пароль чувствителен к регистру символов.

Добавим в проект еще одну форму (Form2) и выставим свойство Startposition = CenterScreen. На вторую форму добавим кнопку buttonl (выход из программы) и напишем ее код:

Внешний вид приложения представлен на рис. 249.

Рис. 249. Внешний вид первой формы

Рис. 250. Окно в случае неправильного ввода пароля В листинге 224 приведен код процедуры, отвечающий за решение задачи. Листинг 224

public partial class Forml : Form <

private void buttonl_Click(object sender, EventArgs e)

string my = «student»; //пароль для входа int Max_Try = 3; //количество попыток int tries = 1; string passwd = » «;

Защита ввода пароля в C# dotnet core console app

Долгое время здесь у меня появился вопрос, который я не вижу. Я пишу консольное приложение C# в ядре dotnet и пытаюсь разрешить пользователю вводить пароль, и меня беспокоит безопасность, особенно сброс памяти.

После: Password masking console application мое понимание, что пароль хранится в виде строковой переменной может попадать через дамп памяти (reference).

SecureString, как правило, должен быть здесь, но, похоже, не поддерживается в dotnet core.

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

Создан 13 апр. 17 2020-04-13 20:26:25 Polymergraphy

AFAIK в массиве все равно будет выделено постоянное пространство памяти, – Vignesh.N 13 апр. 17 2020-04-13 20:37:24

в каком у вас есть задание? Кто что делает? – Neil McGuigan 13 апр. 17 2020-04-13 21:25:03

@NeilMcGuigan не был уверен, насколько этот контекст поможет. Цель этого приложения — запустить LDAP-запрос, чтобы вывести список объектов AD, и я прошу пользователя/пароль связать соединение. Хотя я лично считаю это более низким риском, чем сохранение учетных данных/передача их между устройствами, это потенциально может быть выполнено ИТ-администратором с ценными учетными данными, поэтому я хотел бы выполнить мою должную осмотрительность здесь. – Polymergraphy 13 апр. 17 2020-04-13 22:40:35

Цукерберг рекомендует:  Интернет-маркетинг - Как интернет-маркетологу получить опыт

Кто будет атаковать? Где они? – Neil McGuigan 13 апр. 17 2020-04-13 22:47:24

@NeilMcGuigan Может быть, было бы проще, если бы я сказал, что это начинается с другого направления. Если бы это было стандартное приложение .NET, я бы использовал SecureString здесь и назову его днем, поэтому мы могли бы повторно сформулировать это как: насколько дополнительный риск представляет собой код выше, представленный с использованием SecureString? Насколько мне известно, самое большое различие заключается в том, что SecureString шифрует в памяти, что делает его более защищенным от дампа памяти. Я здесь? Является ли этот риск неизбежным без воссоздания SecureString? – Polymergraphy 14 апр. 17 2020-04-14 19:30:59

2 ответа

Некоторые комментарии: 1) Прежде всего, помните, что безопасность не будет решена в одном приложении. Для кого-то, у кого есть полный доступ к машине, вы почти ничего не можете сделать, чтобы защитить пароль по-настоящему.

(Fun упражнения: Как бы вы проверить подлинность пароля без сохранения пароля в памяти у всех?)

2) SecureString только дает вам больший контроль над продолжительностью жизни пароля в памяти, что позволяет определить, когда это уходит. Нормальная строка может длиться очень долгое время в памяти, даже до выхода программы, поскольку она не исчезает до сбора мусора. SecureString позволяет вымыть его, но он до сих пор сохраняется в памяти.

3) Использование собственного массива символов — хорошая идея, но я мог бы использовать список, потому что он допускает переменную длину или, может быть, даже LinkedList, потому что он распространяет символы в памяти. Shrug. Обратитесь к № 1 и рассмотрите, какие атаки вы защищаете.

Создан 13 апр. 17 2020-04-13 21:30:06 Ray Fischer

Первый абзац — это ключ. Любая уязвимость, которую вы можете определить, которая требует, чтобы злоумышленник имел неограниченный физический доступ к машине, на которой запущена программа, не является уязвимостью, о которой вы должны беспокоиться как программист. Это не проблема безопасности кода или данных; это проблема физической безопасности.Так называемая «безопасность белого ящика», идея о том, что злоумышленник может наблюдать за всем, что делает компьютер и по-прежнему не может взломать систему безопасности, как известно, трудно и, по мнению некоторых, является невозможной. – KeithS 19 апр. 17 2020-04-19 22:08:04

Оцените этот ответ и комментарий. Я понимаю, что сценарий, который меня беспокоит, может привести к тому, что компьютер будет скомпрометирован, и ничего не сможет его спасти. Безопасность — это просто массивный зверь, в котором я очень новичок, и в основном хотел проверить здравомыслие, что я не выполняю эквивалент кодирования здесь «пароль, пост-он застрял на мониторе». Спасибо. – Polymergraphy 21 апр. 17 2020-04-21 19:17:31

Я когда-то работал в Microsoft. У них есть политика, ТОЛЬКО люди в команде безопасности могут работать над безопасностью, потому что в компьютерной безопасности так много ошибок, что неподготовленные люди, скорее всего, создадут катастрофичные бэкдоры. Не чувствуйте себя плохо, если вы не знаете поле, и очень хорошо задавать вопросы. – Ray Fischer 21 апр. 17 2020-04-21 20:29:18

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

Создан 19 апр. 17 2020-04-19 22:01:32 Colin Laws


Windows имеет проверенные алгоритмы хэширования, но это не более безопасно, потому что вам все еще нужен хэш-код в памяти. – Ray Fischer 21 апр. 17 2020-04-21 20:32:37

Да, вы правы. Алгоритм хеширования понадобится параметр, который просто указывает на место в памяти. Я не совсем уверен, как вы можете защитить память приложения, если буквально все пространство памяти не было защищено с помощью некоторого уровня шифрования, где все сохраненные данные зашифровываются до достижения памяти. – Colin Laws 21 апр. 17 2020-04-21 23:33:15

Возможно, вы можете сохранить ключевой файл, с которым вы сравниваете ввод. Я действительно не понимаю, как вы можете помешать пользователю получить доступ к памяти. Единственным другим вариантом, который я вижу, является использование какого-либо типа аутентификатора, который обращается к мобильному устройству, или вы можете просто сохранить некоторые SSH-ключи на машине. Но в этот момент любая вредоносная программа с правами администратора или пользователем будет иметь доступ к вашим SSH-ключам. Это кадровая проблема, а не проблема с программным обеспечением. – Colin Laws 21 апр. 17 2020-04-21 23:47:51

Фактически операционная система защищает память. Невозможно, чтобы одна программа могла получить доступ к памяти другой программы, если ей не были предоставлены значительные разрешения, и если вы предоставляете программам такие разрешения, то именно там лежит ваша реальная ошибка безопасности. – Ray Fischer 22 апр. 17 2020-04-22 02:23:21

C# Console Application авторизации через web forms и парсинг

Требуется код на C# Console Application в котором будет реализована возможность
авторизации через web forms на стороннем сайте с дальнейшем парсингом отдельных
страниц и скачиванием PDF файлов.

Алгоритм исполнения приложения:
1) заходим на сайт https://login.mts.ru/amserver/UI/Login ;
2) вводим логи и пароль;
3) парсим баланc;
4) отображаем баланс в экране в консоле;
5) переходим по ссылке https://ihelper.nw.mts.ru/selfcare/doc-detail-report.aspx ;
6) устанавливаем период 01.07.2015 по 23.07.2015;
7) нажимаем кнопку «Далее»;
8) выбираем «в Личный кабинет»;
9) нажимаем кнопку «Далее»;
10) выбираем «PDF»;
11) нажимаем кнопку «Далее»;
12) нажимаем кнопку «Заказать»;
13) переходим по ссылке https://ihelper.nw.mts.ru/selfcare/doc-view.aspx ;
14) скачиваем на локальный в диск файл (в каталог c:\tmp\[название скаченного файла]) «Детализация разговоров за период c 01.07.2015 no 23.07.2015».

Все действия совершаются внутри консольного приложения. Логин и пароль доступа будет
заранее записан внутри кода C#. Пользователь только запускает приложение и получает
результат в виде отображения баланса на экране консоли и скаченный файл в
соответствующем каталоге.

PS. При частой проверке баланса, сайт МТС иногда запрашивает capcha. Будте пожалуйста
аккуратней с этим. Отображение и фиксирование capcha в коде не требуется.

huobazi / gist:1039424

/// summary >
/// Gets the console secure password.
/// summary >
/// returns > returns >
private static SecureString GetConsoleSecurePassword ( )
<
SecureString pwd = new SecureString ( );
while ( true )
<
ConsoleKeyInfo i = Console . ReadKey ( true );
if ( i . Key == ConsoleKey . Enter )
<
break ;
>
else if ( i . Key == ConsoleKey . Backspace )
<
pwd . RemoveAt ( pwd . Length — 1 );
Console . Write ( » \b \b » );
>
else
<
pwd . AppendChar ( i . KeyChar );
Console . Write ( » * » );
>
>
return pwd ;
>
/// summary >
/// Gets the console password.
/// summary >
/// returns > returns >
private static string GetConsolePassword ( )
<
StringBuilder sb = new StringBuilder ( );
while ( true )
<
ConsoleKeyInfo cki = Console . ReadKey ( true );
if ( cki . Key == ConsoleKey . Enter )
<
Console . WriteLine ( );
break ;
>
if ( cki . Key == ConsoleKey . Backspace )
<
if ( sb . Length > 0 )
<
Console . Write ( » \b\0\b » );
sb . Length — ;
>
continue ;
>
Console . Write ( ‘*’ );
sb . Append ( cki . KeyChar );
>
return sb . ToString ( );
>

This comment has been minimized.

Copy link Quote reply

Akz8 commented Feb 19, 2015

Thanks for this.

This comment has been minimized.

Copy link Quote reply

amgadelsaiegh commented Mar 1, 2015

how would i connect this code to the main «program.cs» class ?

This comment has been minimized.

Copy link Quote reply

JasonSantus commented Mar 4, 2015

This was pretty useful. Thanks a lot .

This comment has been minimized.

Copy link Quote reply

arivazhagan commented Mar 8, 2015

Thanks alot. Your awesome

This comment has been minimized.

Copy link Quote reply

Svetomech commented Jan 8, 2020

There’s a serious bug here!

See, if you press any special key (e.g. Win button, Volume+/- buttons. ) it will still get intercepted resulting in a screwed up password.

UPD: There’s actually a quite simple fix for that. Simply check if (char.IsControl(i.KeyChar)) before appending a character. Bingo!

This comment has been minimized.

Copy link Quote reply

ChristianC83 commented May 14, 2020

First, thank you for your time and sharing this code.

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих