2012-06-12 16 views
7

Tôi cố gắng để tìm ra cách để nhắc nhập mật khẩu, và có những người sử dụng đầu vào lặp lại như dấu hoa thị (********)Làm thế nào để nhận mật khẩu lặp lại như dấu sao

Vì vậy, thời gian gần đây, tôi đã về dự án tạo ra một máy chủ từ xa có thể được kết nối với việc sử dụng môđun socket trong Python. Nó chưa được thực hiện, như tôi đang trong quá trình làm cho giao diện điều khiển được sử dụng để kết nối với máy chủ.

Tôi đang cố gắng tạo cửa sổ đăng nhập nơi người dùng được nhắc nhập Tên người dùng và Mật khẩu của họ, mặc dù khi mật khẩu được nhập Tôi đang tìm dấu sao được in, như nhập mật khẩu chung (ví dụ: - Sekr3t là echo'd như: * * * * * *).

Sau nhiều ngày nghiên cứu về nó, tôi gần xong nhưng vẫn còn một lỗi cuối cùng khiến tôi phát điên (tôi hoàn toàn không thể giải quyết được). Lưu ý - Tôi biết có một mô-đun passpass có thể được sử dụng để thay thế điều này, dễ dàng hơn nhiều, nhưng không có gì echo'd không chính xác những gì tôi đang tìm kiếm.

Dưới đây là mã mật khẩu đăng nhập tôi có cho đến nay, và tôi không thể tìm ra lý do tại sao nó không vang dấu hoa thị:

import msvcrt 
import sys 

def login(prompt = '> '): 
    write = sys.stdout.write 

    for x in prompt: 
     msvcrt.putch(x) 
    passw = "" 

    while 1: 
     x = msvcrt.getch() 
     if x == '\r' or x == '\n': 
      break 
     if x == '\b': 
      # position of my error 
      passw = passw[:-1] 
     else: 
      write('*') 
      passw = passw + x 
    msvcrt.putch('\r') 
    msvcrt.putch('\n') 
    return passw 

>

Nếu bạn đọc qua các mã và/hoặc chạy nó thông qua một cái gì đó giống như IDLE, bạn có thể nhận thấy rằng khi người dùng back-space, dữ liệu được lưu trữ bị xóa bởi một ký tự, nhưng các dấu hoa thị được in thì không. tức là - Sekr3t + backspace = Sekr3, nhưng * * * * * * lại bị bỏ qua. Bất kỳ trợ giúp về cách xóa dấu hoa thị cuối cùng khi backspace được nhập sẽ được đánh giá rất nhiều. Cũng lưu ý, rất nhiều mã này là từ mô-đun getpass. Tôi biết nó không phải là một lời giải thích tuyệt vời, và có lẽ không phải là mã vĩ đại nhưng tôi vẫn đang học - hãy chịu đựng tôi.

+3

Bạn thực sự nên xem xét sử dụng [ 'getpass()'] (http://docs.python.org/library/getpass.html#getpass. bỏ qua). Tôi nhận ra rằng bạn đã tìm thấy điều này nhưng không lặp lại bất cứ điều gì thực sự ** cải thiện an ninh **. – ThiefMaster

+1

@ThiefMaster Tôi có thể thấy nó sẽ cải thiện bảo mật như thế nào, nhưng ứng dụng này chủ yếu dành cho một số bạn bè của tôi ở một trong các mạng chơi game của tôi, những người không giỏi về máy tính, vì vậy tôi đang cố gắng làm cho nó ở một nơi an toàn và thân thiện với người dùng - đó là lý do tại sao tôi chọn thử và có dấu hoa thị lặp lại như trái ngược với không có gì. –

+0

Kiểm tra mô-đun 'curses' –

Trả lời

3

Bạn sẽ có thể xóa dấu hoa thị bằng cách viết các ký tự \x08 \x08. \x08 sẽ di chuyển con trỏ trở lại một vị trí, không gian sẽ ghi đè dấu hoa thị, sau đó \x08 cuối cùng sẽ di chuyển con trỏ trở lại, đặt nó vào đúng vị trí để viết * tiếp theo.

Tôi không biết làm cách nào để xác định thời điểm gõ backspace, nhưng bạn có thể làm điều đó một cách dễ dàng: chỉ cần thêm một cái gì đó như print repr(x) sau khi bạn đã gọi x = msvcrt.getch(), sau đó bắt đầu chương trình của bạn và nhấn backspace .

+0

Cảm ơn bạn, nó hoạt động hoàn toàn hoàn hảo! Nó loại bỏ các '>' và không gian sau khi nó (nếu bạn trở lại không gian quá xa), nhưng tôi đang lập kế hoạch về việc đặt này vào một TKinter gui đôi khi sớm, vì vậy mà không phải là một vấn đề. –

+0

Vui vì nó hoạt động. Xin vui lòng xem xét đánh dấu câu trả lời của tôi là "chấp nhận", và có thể upvoting nó nếu nó đặc biệt hữu ích. –

0

Tôi nghĩ rằng cách này rất đơn giản và hiệu quả

import sys 
import msvcrt 

passwor = '' 
while True: 
    x = msvcrt.getch() 
    if x == '\r': 
     break 
    sys.stdout.write('*') 
    passwor +=x 

print '\n'+passwor 
Các vấn đề liên quan