Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

C#

C#でコンソールにパスワード入力する際のマスキング処理の実装例のご紹介

投稿日:2022年7月4日 更新日:

 

<目次>

(1) C#でコンソールにパスワード入力する際のマスキング処理の実装例のご紹介
 (1-1) 構文
 (1-2) サンプルプログラム

(1) C#でコンソールにパスワード入力する際のマスキング処理の実装例のご紹介

コンソールでID/Password等を入力してもらう場合、パスワードをマスキングで隠す方法についてご紹介します。

(図100)

(動画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);
(図121)

 

(1-2) サンプルプログラム

今回はプロキシ認証を行うプログラムに対して、プロンプト上でID/Passwordを聞くようにし、更にPasswordは「*」でマスキングするようなサンプルプログラムをご紹介します。

(サンプルプログラム)
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);
        }
    }
}

 

Adsense審査用広告コード


Adsense審査用広告コード


-C#

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

C#のdynamic型とは?使いどころやvarとの違いもご紹介

  <目次> (1) C#のdynamic型とは?使いどころやvarとの違いもご紹介  (1-1) dynamic型とは?  (1-2) dynamic型の使いどころ  (1-3) 動作確認 …

C#のIComparableの実装方法+IComparerとの違いについて

<目次> (1) C#のIComparableの実装方法+IComparerとの違いについて  (1-1) IComparableの概要とIComparableとの違い  (1-2) STEP0:比較 …

C#のvarの使いどころは?初めての方に向けてサンプルプログラムを使ってご紹介

<目次> (1) C#のvarの使いどころは?初めての方に向けてサンプルプログラムを使ってご紹介  (1-1) ArrayListに異なるデータ型が混在しているパターン  (1-2) LINQのクエリ …

C#のエラー「CS1069~このアセンブリへの参照を追加する事を検討してください」の対処方法+実際のソース例も掲載

<目次> (1) C#のエラー「CS1069~このアセンブリへの参照を追加する事を検討してください」の対処方法  (1-1) 発生状況・エラーメッセージ  (1-2) 原因  (1-3) 対処法 (1 …

.NETで「SystemInvalidOperationException」例外(ZombieCheck、Rollback)の調査記録

<目次> (1) .NETで「SystemInvalidOperationException」例外(ZombieCheck、Rollback)の調査記録  (1-1) エラーメッセージ  (1-2) …

  • English (United States)
  • 日本語
Top