<目次>
(1) C#でコンソールにパスワード入力する際のマスキング処理の実装例のご紹介
(1-1) 構文
(1-2) サンプルプログラム
(1) C#でコンソールにパスワード入力する際のマスキング処理の実装例のご紹介
コンソールでID/Password等を入力してもらう場合、パスワードをマスキングで隠す方法についてご紹介します。
(図100)
(1-1) 構文
・Enterが押されるまでの間、処理を続ける ∟押されたキーの値を取得 ∟(1) 文字削除の場合 ∟末尾の文字を削除 ∟(2) 制御文字でない場合 ∟「*」でマスキング表示 ∟パスワードの文字列に追記
//# ユーザーの入力値をString型の変数に格納 var pass = string.Empty; //# ConsoleKeyはクラスではなくEnum //# キーボードのキーと対応するコードをセットで持っています。 //# 例:A=65、Z=90、F10=121など ConsoleKey key; do { //# Console.ReadKeyメソッド //# ユーザーが「次に」押す「文字キーorFunctionキー」の情報を取得する //# 通常は押したキーがコンソールに表示されてしまうため、 //# それを抑止するために、引数の「intercept; true」を指定している。 var keyInfo = Console.ReadKey(intercept: true); //# 押されたキーの値を取得 key = keyInfo.Key; //# BackSpaceで文字を消した場合 if (key == ConsoleKey.Backspace && pass.Length > 0) { //# 1文字目の「\b」でカーソルを1つ前に移動します→最後の「*」の位置に移動する //# 2文字目の[space]で「*」を空白に書き換え。→それに伴いカーソルが次の位置に移動 //# 3文字目の「\b」で再度、カーソルを1つ前に移動します →元々「*」があった位置に戻る Console.Write("\b \b"); //# 最後の1文字を削除 pass = pass.Remove(pass.Length - 1); } //# 制御文字(通信制御や機器制御に用いる特殊文字)かどうかのチェック //# 制御文字でないなら else if (!char.IsControl(keyInfo.KeyChar)) { //# 入力した文字を「*」でマスキングして出力 Console.Write("*"); //# 裏では入力した文字をしっかり記録 pass += keyInfo.KeyChar; } } //# Enter押下までの間続ける while (key != ConsoleKey.Enter);
(1-2) サンプルプログラム
using System; using System.Net; using System.Threading; namespace RP_ITxxxx_Csharp_WriteLine_Password { class Program { static void Main(string[] args) { try { //### (0) Proxyサーバの認証設置を行う Console.WriteLine("---(0) Proxyサーバの認証設定を行う"); //# WebProxyクラスのインスタンスを生成 System.Net.WebProxy proxy = new WebProxy("http://xxxxx:8080", true); //# コンソールからID/Passの入力を促す //# その際、Passwordは「*」表示で隠す Console.WriteLine("プロキシIDの入力:"); //# ユーザーの入力値をString型の変数に格納 string userName = Console.ReadLine(); Console.WriteLine("プロキシPasswordの入力:"); //########## 本記事の構文START ###########// //# ユーザーの入力値をString型の変数に格納 var pass = string.Empty; //# ConsoleKeyはクラスではなくEnum //# キーボードのキーと対応するコードをセットで持っています。 //# 例:A=65、Z=90、F10=121など ConsoleKey key; do { //# Console.ReadKeyメソッド //# ユーザーが「次に」押す「文字キーorFunctionキー」の情報を取得する //# 通常は押したキーがコンソールに表示されてしまうため、 //# それを抑止するために、引数の「intercept; true」を指定している。 var keyInfo = Console.ReadKey(intercept: true); //# 押されたキーの値を取得 key = keyInfo.Key; //# BackSpaceで文字を消した場合 if (key == ConsoleKey.Backspace && pass.Length > 0) { //# 1文字目の「\b」でカーソルを1つ前に移動します→最後の「*」の位置に移動する //# 2文字目の[space]で「*」を空白に書き換え。→それに伴いカーソルが次の位置に移動 //# 3文字目の「\b」で再度、カーソルを1つ前に移動します →元々「*」があった位置に戻る Console.Write("\b \b"); //# 最後の1文字を削除 pass = pass.Remove(pass.Length - 1); } //# 制御文字(通信制御や機器制御に用いる特殊文字)かどうかのチェック //# 制御文字でないなら else if (!char.IsControl(keyInfo.KeyChar)) { //# 入力した文字を「*」でマスキングして出力 Console.Write("*"); //# 裏では入力した文字をしっかり記録 pass += keyInfo.KeyChar; } } //# Enter押下までの間続ける while (key != ConsoleKey.Enter); //########## 本記事の構文END ###########// //# プロキシ認証に必要なID/Passwordの設定 proxy.Credentials = new NetworkCredential(userName, pass); //# WebRequestクラスのDefaultWebProxyプロパティ(≒メンバ変数)で //# デフォルトで使用するプロキシサーバの設定(今回はID/Password)をセット WebRequest.DefaultWebProxy = proxy; } catch (Exception e) { Console.WriteLine(e.Message); } Thread.Sleep(5000); } } }