2011-10-20 33 views
8

Tôi đang viết chương trình bảng điều khiển với Python trong Windows.
Người dùng cần phải đăng nhập để sử dụng chương trình, khi anh ấy nhập mật khẩu của mình, tôi muốn họ được lặp lại là "*", trong khi tôi có thể nhận được thông tin người dùng nhập vào.
Tôi tìm thấy trong thư viện chuẩn một mô-đun được gọi là getpass, nhưng nó sẽ không echo bất cứ điều gì khi bạn nhập (linux như).
Cảm ơn.Làm thế nào để đọc mật khẩu với echo "*" trong chương trình bảng điều khiển Python?

Trả lời

7

Mô-đun getpass được viết bằng Python. Bạn có thể dễ dàng sửa đổi nó để làm điều này. Trong thực tế, đây là một phiên bản sửa đổi của getpass.win_getpass() rằng bạn chỉ có thể dán vào mã của bạn:

import sys 

def win_getpass(prompt='Password: ', stream=None): 
    """Prompt for password with echo off, using Windows getch().""" 
    import msvcrt 
    for c in prompt: 
     msvcrt.putch(c) 
    pw = "" 
    while 1: 
     c = msvcrt.getch() 
     if c == '\r' or c == '\n': 
      break 
     if c == '\003': 
      raise KeyboardInterrupt 
     if c == '\b': 
      pw = pw[:-1] 
      msvcrt.putch('\b') 
     else: 
      pw = pw + c 
      msvcrt.putch("*") 
    msvcrt.putch('\r') 
    msvcrt.putch('\n') 
    return pw 

Bạn có thể muốn xem xét lại này, tuy nhiên. Cách Linux tốt hơn; thậm chí chỉ biết số lượng ký tự trong mật khẩu là một gợi ý quan trọng đối với người muốn crack nó.

+0

msvcrt.putch ('\ b') có vẻ như điều này không hoạt động – wong2

-1

You can use the getpass module. Điều này không chính xác trả lời câu hỏi vì hàm getpass không xuất ra bất kỳ thứ gì cho bàn điều khiển ngoại trừ lời nhắc. Lý do cho điều này là nó là một lớp bảo mật bổ sung. Nếu ai đó đang xem qua vai của bạn, họ sẽ không thể biết được mật khẩu của bạn là bao lâu.

Dưới đây là một ví dụ về cách sử dụng nó:

from getpass import getpass 
getpass('Enter your password: ') 

Ví dụ này sẽ hiển thị "Nhập mật khẩu của bạn:" và sau đó bạn có thể gõ vào mật khẩu của bạn.

+0

'getpass' được đề cập trong câu hỏi gốc và bị từ chối vì không có dấu hoa thị. – kindall

4

Câu trả lời của kindall là gần, nhưng nó có vấn đề với backspace không xóa dấu hoa thị, cũng như backspace có thể quay trở lại ngoài dấu nhắc đầu vào.

Hãy thử:

def win_getpass(prompt='Password: ', stream=None): 
    """Prompt for password with echo off, using Windows getch().""" 
    if sys.stdin is not sys.__stdin__: 
     return fallback_getpass(prompt, stream) 
    import msvcrt 
    for c in prompt: 
     msvcrt.putwch(c) 
    pw = "" 
    while 1: 
     c = msvcrt.getwch() 
     if c == '\r' or c == '\n': 
      break 
     if c == '\003': 
      raise KeyboardInterrupt 
     if c == '\b': 
      if pw == '': 
       pass 
      else: 
       pw = pw[:-1] 
       msvcrt.putwch('\b') 
       msvcrt.putwch(" ") 
       msvcrt.putwch('\b') 
     else: 
      pw = pw + c 
      msvcrt.putwch("*") 
    msvcrt.putwch('\r') 
    msvcrt.putwch('\n') 
    return pw 

Note mscvrt.putwch không làm việc với python 2.x, bạn cần phải sử dụng mscvrt.putch để thay thế.

Các vấn đề liên quan