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#のIComparerの実装方法や用法について(サンプルプログラムあり)

<目次> (1) C#のIComparerの実装方法や用法について  (1-1) IComparerの概要  (1-2) STEP0:比較をするクラスの定義  (1-3) STEP1:ICompare …

C#でファイルの存在チェックを行う方法+サンプルプログラムをご紹介

<目次> (1) C#でファイルの存在チェックを行う方法  (1-1) 構文  (1-2) サンプルプログラム (1) C#でファイルの存在チェックを行う方法 (1-1) 構文 (構文) if (!F …

C#で文字列の前に付いてるアットマーク「@」について

<目次> (1) C#で文字列の前に付いてるアットマーク「@」について  (1-1) 概要  (1-2) 主な用途  (1-3) 注意点 (1) C#で文字列の前に付いてるアットマーク「@」について …

Xamarin.Formsのプロジェクトの構成について~各ファイルの役割や概要について~

<目次> (1) Xamarin.Formsのプロジェクトの構成について  (1-1) プロジェクト構造の概要  (1-2) プロジェクトの初期ファイルの一覧 (1) Xamarin.Formsのプロ …

C#のintに?「はてな」(question mark)が付いている意味について

<目次> (1) C#のintに?「はてな」(question mark)が付いている意味について  (1-1) 「int?」とは?  (1-2) 「int?」の型について  (1-3) 「int?」 …

  • English (United States)
  • 日本語
Top