• Thứ Tư, 18/01/2006 10:43 (GMT+7)

    Bảo vệ ô mật khẩu trong chương trình

    Ô mật khẩu của các chương trình thường được bảo vệ bằng cách chuyển mọi ký tự thành những dấu *. Tuy nhiên, những người tò mò vẫn có thể sử dụng những công cụ có sẵn trên Internet hoặc tự viết chưong trình để đọc mật khẩu từ những ô đã được bảo vệ đó. Vấn đề nằm ở chỗ những ô nhập mật khẩu trong các chương trình trên Windows thực chất là những textbox thông thường được đặt thêm thuộc tính PasswordChar. Trước Windows 2000, nội dung của những ô mật khẩu có thể được đọc dễ dàng với một vài hàm API và message WM_GETTEXT. Những người viết chương trình đọc mật khẩu "tận tình", thậm chí còn tự động duyệt tất cả các cửa sổ để tìm ra bất kỳ textbox nào được thiết lập PasswordChar. Lỗ hổng thông qua message WM_GETTEXT còn được khai thác bằng cách khác là chép nội dung của textbox ra clipboard. Hơn nữa, những kẻ phá phách còn có thể khiến người viết chương trình phải ê mặt bằng cách dùng message EM_SETPASSWORDCHAR để phơi bày mật khẩu cho tất cả mọi người. Từ Windows 2000 trở đi, Microsoft đã khắc phục lỗ hổng trên bằng cách hạn chế quyền gửi message WM_GETTEXT của những ô mật khẩu, chỉ riêng tiến trình sở hữu ô mật khẩu được phép làm điều đó. Nhưng rào cản này không cản được những lập trình viên lão luyện, kết quả là mật khẩu của các ứng dụng mới trên Windows 2000 hay XP vẫn có thể bị lộ.

    Có một cách đơn giản để bảo vệ các ô mật khẩu trong chương trình của bạn là tạo subclass ô text và vô hiệu các message WM_GETTEXT, EM_SETPASSWORDCHAR. Cách thức này có thể đem lại cho người dùng trên mọi phiên bản Windows mức độ bảo vệ cao hơn, cả với các ứng dụng thông thường của Microsoft (như Outlook) trên Windows 2000, Windows XP.

    Dưới đây là phần trình bày cụ thể cách thực hiện điều đó trong Visual Basic, một ngôn ngữ phổ biến nhưng khó can thiệp ở mức thấp. Để tạo subclass một cách đơn giản chúng ta sẽ dùng MsgHook – một OCX miễn phí (tải xuống từ địa chỉ http://vb.mvps.org/tools/MsgHook/). Sau khi đăng ký MsgHook với Windows và tạo tham chiếu đến nó trong Project, chúng ta thêm đoạn mã sau vào chương trình:

    Dim WithEvents TextHook As MsgHook

    Private Sub Form_Load()

    Set TextHook = New MsgHook

    PassText1 là một textbox đã đặt thuộc tính PasswordChar

    TextHook.StartSubclass PassText1

    End Sub

    Private Sub TextHook_BeforeMessage(uMsg As Long, wParam As Long, lParam As Long, _

    retValue As Long, Cancel As Boolean)

    vô hiệu các message WM_GETTEXT và EM_SETPASSWORDCHAR

    chương trình của bạn vẫn sử dụng thuộc tính Text bình thường

    vì nó không dùng WM_GETTEXT để đọc nội dung của TextBox

    If (uMsg = WM_GETTEXT) Or (uMsg = EM_SETPASSWORDCHAR) Then Cancel = True

    End Sub

    Một cách khác, vòng vèo hơn, là xây dựng một ActiveX Control mới dựa trên TextBox với một thuộc tính mới để lưu mật khẩu, chặn message EN_UPDATE để cập nhật thuộc tính đó và biến mọi ký tự của TextBox thành *. Phát triển cách làm đó, chúng ta thậm chí còn giấu được độ dài thực của mật khẩu. Cách làm cụ thể như thế nào xin nhường lại cho các bạn khám phá.

    Đỗ Thanh Xuân
    Trung tâm CNTT – Ngân Hàng Công Thương Việt Nam
    Email:
    xuandt@hotmail.com

    ID: A0601_113