.NETのコアコマンドラインプログラムを作るためにどのようにプレーンテキストでパスワードを表示せずにパスワードを受け入れます

ユーザは、GUIにパスワードを入力する必要がある場合、それぞれUIフレームワークは、パスワードを入力するための基本的な制御を提供し、パスワードを入力する際に​​これらのコントロールでは、ユーザがマスクを表示することができます。しかし、コンソールプログラムのために、それはネイティブ入力したパスワードのためではありません。

この記事では、コンソールで入力されたパスワード、およびメソッドのみが表示されたマスクを説明します。


スタート簡単なプログラム

のは、単純な.NETコアコンソールプログラムを見てみましょう。

static void Main(string[] args)
{
    Console.Write("用户名: ");
    var userName = Console.ReadLine();
    Console.Write("密  码: ");
    var password = Console.ReadLine();
    Console.ReadKey();
}

ここに画像を挿入説明

パスワードは、直接公開表示されます。-パスワードはバッファまで表示されますので、また、連続出力のためには、私たちの後ろ、コンソールは、これらの出力を取り除くことはありませんしている明らかに受け入れられません

ユーザーがパスワードを入力して書くと、マスク法を表示します

コンソール自体はメソッドを提供していないので、パスワードをマスクすることができ、その後、我々は唯一の書き込みまで所有することができます:

public static SecureString ReadPassword(string mask = "*")
{
    var password = new SecureString();
    while (true)
    {
        var i = Console.ReadKey(true);
        if (i.Key == ConsoleKey.Enter)
        {
            Console.WriteLine();
            break;
        }

        if (i.Key == ConsoleKey.Backspace)
        {
            if (password.Length > 0)
            {
                password.RemoveAt(password.Length - 1);
                Console.Write("\b \b");
            }
        }
        else
        {
            password.AppendChar(i.KeyChar);
            Console.Write(mask);
        }
    }
    password.MakeReadOnly();
    return password;
}

内部メソッドは、ユーザーの入力を受け付ける-輸送た場合、それが確認され、それがバックスペースであれば、単語を削除し、他のケースで出力マスク。完全な使用安全な文字列はSecureString、文字列が直接管理コードによって値を取得する方法はありません。

次に、文字列を入力して、あなただけのマスクが表示されます-見ることができませんでしたwalterlv 是不是一个逗比......

ここに画像を挿入説明

で、それを注意してくださいpassword、我々は呼び出す前に、復帰SecureString.MakeReadOnly()方法を、文字列は読み取り専用ために、それは復帰後の外に変更されることはありません確実にするために設定されています。

変換パスワード

もちろん、セキュリティライブラリの比較的高いレベルが受け入れるSecureStringパスワードとして文字列の種類を、いくつかの簡単なライブラリーは、パスワードのみの文字列型を受け入れます。そして、これらの単純なライブラリはどのように我々は、通常の文字列にそれを得ることができますか?

使用することができますMarshal達成するために:

private static string ConvertToString(SecureString value)
{
    var valuePtr = IntPtr.Zero;
    try
    {
        valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value);
        return Marshal.PtrToStringUni(valuePtr);
    }
    finally
    {
        Marshal.ZeroFreeGlobalAllocUnicode(valuePtr);
    }
}

または間接的に使用しNetworkCredential、完全な:

private static string ConvertToString(SecureString secureString)
{
    return new NetworkCredential(string.Empty, secureString).Password;
}

そのためNetworkCredential内部の実際(参照文字列を取得するために同様の方法を使用する-リファレンスソースSecureStringHelper.CreateStringを)。

internal static string CreateString(SecureString secureString)
{
    string plainString;
    IntPtr bstr = IntPtr.Zero;

    if (secureString == null || secureString.Length == 0)
        return String.Empty;

    try
    {
        bstr = Marshal.SecureStringToBSTR(secureString);
        plainString = Marshal.PtrToStringBSTR(bstr);
    }
    finally
    {
        if (bstr != IntPtr.Zero)
            Marshal.ZeroFreeBSTR(bstr);
    }
    return plainString;
}

参考資料


私のブログはで開始されhttps://blog.walterlv.com/、および特色CSDNから解放されますが、それはめったに一度放出されない更新されます。

あなたが表示された場合は任意のは、ブログ、してください共有の内容を理解していません。私が建てDOTNET職業技術学院が参加することを歓迎します。

クリエイティブコモンズライセンス

この作品は、ある非営利- -同一条件許諾4.0の国際ライセンス契約クリエイティブ・コモンズのライセンスのために。転載、使用、再投稿へようこそ、しかし陸毅によって署名記事を保つようにしてください(リンク含む:https://walterlv.blog.csdn.net/は)、商業目的のために使用してはならない、記事に基づいて作業が同一のライセンスを変更するようにしてくださいリリース。ご質問があれば、してください私に連絡

公開された420元の記事 ウォンの賞賛245 ビュー520 000 +

おすすめ

転載: blog.csdn.net/WPwalter/article/details/104101020