在開發 C# 控制台應用程式時,處理密碼輸入是常見需求。預設情況下 Console.ReadLine() 會直接顯示使用者輸入的明文,這對安全性敏感的場合顯然不合適。本文將詳細介紹如何利用 Console.ReadKey(true) 逐字元讀取輸入,並在螢幕上即時顯示星號(*)作為遮罩,同時正確處理 Backspace 刪除與 Enter 確認鍵。
Console.ReadKey(bool intercept) 方法的多載版本允許我們攔截按鍵:當 intercept 為 true 時,按鍵不會在主控台顯示,游標保持原位。此時我們可以自行寫入星號,達到遮罩效果。方法回傳 ConsoleKeyInfo 結構,包含 Key(列舉型別,對應實體按鍵)與 KeyChar(對應的 Unicode 字元)兩個關鍵屬性,方便判斷特殊鍵與累加字元。
using System;
class Program
{
static void Main()
{
string input = null;
Console.WriteLine("請輸入密碼:");
while (true)
{
// 攔截按鍵,不在螢幕顯示原始字元
ConsoleKeyInfo keyInfo = Console.ReadKey(true);
// 判斷是否按下 Enter 鍵結束輸入
if (keyInfo.Key != ConsoleKey.Enter)
{
// 處理 Backspace 刪除邏輯
if (keyInfo.Key != ConsoleKey.Backspace)
{
input += keyInfo.KeyChar; // 累加字元
Console.Write("*"); // 顯示遮罩星號
}
else if (input.Length > 0)
{
// 移除最後一個字元並更新螢幕顯示
input = input.Substring(0, input.Length - 1);
Console.Write("\b \b"); // 退格、空格覆蓋、再退格
}
}
else
{
Console.WriteLine(); // 換行
break;
}
}
Console.WriteLine($"您剛才輸入的是:{input}");
Console.ReadKey();
}
}
\b \b 三字元序列——第一個 \b 將游標左移,空格覆蓋原星號,第二個 \b 再次左移,使游標停在正確位置等待下一個輸入。input.Length > 0,避免游標跑到提示文字前方。KeyChar 自動處理 Unicode 字元,支援中文輸入法組合字元(需搭配 IME 狀態),一般英文數字密碼場景完全足夠。
實際專案中可將此邏輯封裝為 ReadPassword() 靜態方法,回傳 SecureString 型別以進一步強化記憶體安全性;若需支援密碼顯示/隱藏切換,可引入額外熱鍵(如 Tab)控制遮罩模式。