<目次>
(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);
}
}
}