• Thứ Hai, 21/12/2009 10:04 (GMT+7)

    Chương trình tạo Password

    Câu hỏi :
    Tôi muốn viết một chương trình để tạo password, với Form có dạng như sau:
     1. Textbox nhập tên.
     2. Textbox nhập địa chỉ email hay địa chỉ trang web.
     3. Option chọn ký tự như chữ số, hoặc chữ thường, hoặc chữ in hoa, hoặc ký tự đặc biệt, hoặc chọn tất cả.
     4. Chiều dài password cần tạo (có thể bỏ và được thay bằng một con số cố định).
     5. Một nút OK và nút Copy to clipboards.
     Yêu cầu chung: Mỗi khi nhấn nút OK thì pasword tạo ra với tính chất:
     - Sẽ không thay đổi với thông tin được nhập vào không thay đổi,
     - Có phân biệt chữ thường hay chữ in hoa. Yêu cầu này giống như cách tạo số ID cho các phần mềm đăng ký.
     Xin hướng dẫn.



    Trả lời :

    Thường người dùng tự đặt ra password theo cách suy nghĩ riêng của mình, nhớ và dùng nó theo thời gian. Tuy nhiên, bạn có thể viết phần mềm tạo password theo một số thông tin nhập vào và theo 1 thuật giải nào đó, trong trường hợp này bạn phải xác định rõ ràng, cụ thể các thông tin nhập vào là gì (tên, địa chỉ email, địa chỉ website cá nhân...) và quan trọng nhất là dùng thuật giải nào tác động trên các thông tin đó. Mỗi thuật giải sẽ tạo được password với độ khó phát hiện khác nhau.

     Sau đây là qui trình điển hình để xây dựng ứng dụng VB 6.0 demo cho việc tạo password theo yêu cầu đơn giản, user sẽ nhập vào 3 thông tin: hoten, địa chỉ e-mail, độ dài password, chương trình sẽ tạo password theo 3 thông tin nhập vào.

     1. Chạy VB 6.0, tạo Project ứng dụng dạng "Standard EXE" đơn giản.
     2. Thiết kế Form như hình 1.
     3. Đặt tên cho 4 textbox lần lượt là txtTen, txtEmail, txtPasslen, txtPassword. Đặt tên cho button là btnCreate.
     4. Nhấn đúp chuột vào button để tạo thủ tục xử lý sự kiện click chuột cho nó rồi viết code như sau:
     ' =========================
     ' Khai báo các hàm API truy xuất Clipboard
     ' =========================
     Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
     Private Declare Function CloseClipboard Lib "user32" () As Long
     Private Declare Function RegisterClipboardFormat Lib "user32" Alias "RegisterClipboardFormatA" (ByVal lpString As String) As Long
     Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
     Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
     Private Declare Function EmptyClipboard Lib "user32" () As Long
     
     ' =========================
     ' Khai báo các hàm API truy xuất bộ nhớ
     ' =========================
     Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal cbLength As Long)
     Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
     Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
     Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
     Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
     
     Option Explicit
     Const CF_TEXT = 1
     'thủ tục xử lý click chuột trên button
     Private Sub btnCreate_Click()
     'khai báo các biến cần dùng
     Dim ten() As Byte
     Dim email() As Byte
     Dim pass() As Byte
     Dim plen As Integer
     Dim i As Integer
     Dim c1 As Byte
     Dim c2 As Byte
     Dim c3 As Byte
     Dim spas As String
     Dim hGMem As Long
     Dim lpdata As Long
     'xác định độ dài password
     plen = CInt(txtPassLen.Text)
     'chuyển chuỗi nhập thành dãy các byte
     ten = StrConv(txtTen.Text, vbFromUnicode)
     email = StrConv(txtEmail.Text, vbFromUnicode)
     ReDim pass(plen)
     'lặp tạo từng ký tự password
     For i = 0 To plen - 1
     If i <= UBound(ten) Then
     c1 = ten(i)
     Else
     c1 = 33
     End If
     If i <= UBound(email) Then
     c2 = email(i)
     Else
     c2 = 33
     End If
     'tạo ký tự password theo công thức sau
     c3 = (c1 Xor c2) Mod 26
     c3 = c3 + 97
     pass(i) = c3
     Next i
     'hiển thị chuỗi password
     txtPassword.Text = StrConv(pass, vbUnicode)
     'Mở clipboard
     If Not CBool(OpenClipboard(0)) Then Exit Sub
     'Xóa nội dung clipboard
     EmptyClipboard
     'Xin vùng nhớ toàn cục để chứa password
     hGMem = GlobalAlloc(&H2002, plen + 1)
     If hGMem <> 0 Then
     lpData = GlobalLock(hGMem)
     CopyMemory ByVal lpData, pass(0), plen + 1
     GlobalUnlock hGMem
     'Copy password vào clipboard
     If SetClipboardData(CF_TEXT, hGMem) = 0 Then
     GlobalFree hGMem
     End If
     End If
     'đóng Clipboard lại
     CloseClipboard
     End Sub
     
     5. Chọn menu Run.Start để chạy thử Form vừa xây dựng, thử nhập các thông tin vào TextBox rồi ấn button "Tao Password" để xem kết quả. Mỗi lần tạo password mới, bạn có thể dán chuỗi password từ clipboard vào bất kỳ ứng dụng nào khác.

    Chuyên mục: Lập trình