Nhập Password cho ứng dụng Console


Bạn đang thực hiện một ứng dụng Console mà yêu cầu người dùng phải nhập Password vào. Một yêu cầu bắt  cho ứng dụng này là khi người dùng nhập Password thì các ký tự đó sẽ không được hiển thi ra màn hình (trong Windows Form thì chúng ta thấy các ký tự password sẽ được thay thế bằng ký tự * hoặc chấm đen). Vậy làm thế nào để có thể thực hiện được điều đó.

Trước hết chúng ta sẽ xem qua một đoạn chương trình Console viết bằng C# yêu cầu người dùng nhập vào Password và chương trình này vẫn chưa thực hiện được yêu cầu như chúng ta đã nói:

using System;
namespace HiddenPassword
{
    class Test
    {
        static void Main(string[] args)
        {
            string password;
            Console.Write("Nhap Password: ");

            //Các ký tự sẽ hiển thị trên màn hình
            password = Console.ReadLine();

            //Thực hiện các xử lý khác
        }

    }
}
Như đoạn chương trình trên thì chúng ta sử dụng hàm Console.ReadLine() để đọc toàn bộ các ký tự người dùng vừa nhập vào. Tuy nhiên, phương thức này lại hiển thị những gì đã nhập lên màn hình, do đó chúng ta sẽ phải sử dụng cách khác để có thể tránh được việc hiển thị password ra màn hình.
Trong lớp Console của C# thì chúng ta còn có phương thức ReadKey dùng để đọc từng ký tự được người dùng gõ. Đặc biệt, phương thức ReadKey chấp nhận chúng ta truyền vào 1 tham số kiểu Boolean để chỉ định có hiện ký tự vừa được gõ ra màn hình hay không: true thì sẽ không hiện còn false thì ngược lại. Để chương trình trở nên dễ đọc hơn, chúng ta sẽ thực thi một phương thức tĩnh khác có tên là GetPassword có nhiệm vụ đọc Password được nhập và trả về chuỗi password đó. Cụ thể nội dung của phương thức GetPassword như sau:
static string GetPassword()
{
    string temp = "";
    ConsoleKeyInfo info = Console.ReadKey(true);
    while (info.Key != ConsoleKey.Enter)
    {
        //Kiểm tra có phải là phím Backspace hay không
        if (info.Key != ConsoleKey.Backspace)
            temp += info.KeyChar;
        else if (temp.Length > 0)
            //Bỏ ký tự cuối cùng
            temp = temp.Substring(0, temp.Length - 1);

        //Đọc ký tự tiếp theo để xử lý
        info = Console.ReadKey(true);
    }

    return temp;
}
Phương thức GetPassword là phương thức tĩnh (static) bởi vì chúng ta sẽ gọi nó trong một phương thức tĩnh khác (hàm Main). Trước hết, chúng ta sẽ sử dụng một biến tạm dùng để lưu trữ chuỗi password được người dùng nhập vào, biến tạm này được khởi tạo giá trị rỗng:

 

string temp = "";
Sau đó, chúng ta sẽ đọc ký tự vừa được người dùng nhập vào bằng phương thức Console.ReadKey(true)
ConsoleKeyInfo info = Console.ReadKey(true)
Chú ý rằng phương thức Console.ReadKey không phải trả về cho chúng ta ký tự vừa được nhập mà sẽ trả về một đối tượng ConsoleKeyInfo. Đối tượng của lớp này sẽ chứa các thông tin về phím được nhấn (qua thuộc tính Key) và ký tự thể hiện của phím đó (thuộc tính KeyChar).
Tiếp đó chúng ta lặp lại việc kiểm tra phím vừa được người dùng nhấn. Nếu chưa phải là phím Enter thì chúng ta sẽ xử lý phím đó:
while (info.Key != ConsoleKey.Enter)
{
    if (info.Key != ConsoleKey.Backspace)
        temp += info.KeyChar;
    else if (temp.Length > 0)
        temp = temp.Substring(0, temp.Length - 1);

    info = Console.ReadKey(true);
}
Trong vòng lặp while, chúng ta sẽ kiểm tra xem rằng người dùng có phải vừa nhấn phím Backspace hay không. Nếu không phải là phím Backspace thì chúng ta sẽ lưu lại ký tự này vào trong chuỗi vì đây là một ký tự trong password. Nếu đó là phím Backspace thì chúng ta biết được rằng người dùng muốn xóa một ký tự trong chuỗi password, do đó chúng ta sẽ phải xóa đi ký tự cuối cùng trong temp bằng hàm Substring (chúng ta xóa ký tự cuối bằng cách chỉ lấy các ký tự từ đầu đến ký tự gần cuối).
Sau cùng, chúng ta sẽ phải đọc ký tự tiếp theo được người dùng nhấn để xử lý lần lặp lại tiếp theo của vòng lặp while.
Nếu như chúng ta kiểm tra thấy rằng người dùng vừa nhấn phím Enter thì chúng ta biết rằng người dùng đã kết thúc việc nhập Password, do đó chúng ta trả về chuỗi temp (chính là những ký tự Password vừa được nhập).
Như vậy, hàm Main của chúng ta sau cùng sẽ có nội dung như sau:
static void Main(string[] args)
{
    string password;
    Console.Write("Nhap Password: ");
    password = GetPassword();

    //Thực hiện các xử lý khác
}
Kết luận: Trên đây là bài hướng dẫn hết sức đơn giản để giúp các bạn xử lý với trường hợp nhập Password trong ứng dụng Console. Các bạn có thể tìm hiểu thêm về cách đọc và xử lý ký tự trong C# nhằm đạt được những kết quả như mong đợi và có thể cải tiến đoạn chương trình trên tốt hơn. Chúc thành công. 

 

Tác giả: xuanchien

Tran Xuan Chien. Japan Advanced Institute of Science and Technology - Japan. Senior Developer - NUS Technology.

8 thoughts on “Nhập Password cho ứng dụng Console”

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s