You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Adding the ability for getpass to print asterisks when password is typed #77065
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee=Noneclosed_at=Nonecreated_at=<Date2018-02-20.10:28:53.338>labels= ['type-feature', 'library', '3.9']
title='Adding the ability for getpass to print asterisks when password is typed'updated_at=<Date2021-08-10.01:27:06.609>user='https://github.com/MatanyaStroh'
I saw some questions about it in stackoverflow (links below), and also find it very useful to have the ability to print asterisks.
Some users, find it disturbing when they don't have any indication that password is typed, and it will be helpful to have it.
I know that it's have some risks exposing the number of chars to the password, but I think it's worth it.
When using Jupyter (notebook server is 4.3.1) the password does echoed as "*", but not in Python IDE in linux and Windows
for getpass.win_getpass() it can simply be done by adding this line
msvcrt.putch("*").
So the code will look like:
defwin_getpass(prompt='Password: ', stream=None):
"""Prompt for password with echo off, using Windows getch()."""ifsys.stdinisnotsys.__stdin__:
returnfallback_getpass(prompt, stream)
forcinprompt:
msvcrt.putwch(c)
pw=""while1:
c=msvcrt.getwch()
ifc=='\r'orc=='\n':
breakifc=='\003':
raiseKeyboardInterruptifc=='\b':
pw=pw[:-1]
else:
pw=pw+cmsvcrt.putch("*") #Line that was addedmsvcrt.putwch('\r')
msvcrt.putwch('\n')
returnpw
getpass is emulating the unix password prompt behavior. I'm not sure if the complication is worth it, especially since not echoing asterisks is, as you observe, fractionally more secure. So I guess I'm about -.5 on this feature.
stevoisiak commented on Apr 9, 2019
stevoisiakmannequin
Mannequin
More actions
@matanya.stroh: Don't forget to erase the asterisks if the user hits backspace.
def win_getpass(prompt='Password: ', stream=None, show_asterisks=False):
"""Prompt for password with echo off, using Windows getch()."""
if sys.stdin is not sys.__stdin__:
return fallback_getpass(prompt, stream)
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 len(pw) > 0:
pw = pw[:-1]
msvcrt.putwch('\b')
msvcrt.putwch(' ')
msvcrt.putwch('\b')
else:
pw = pw + c
if show_asterisks:
msvcrt.putwch('*')
msvcrt.putwch('\r')
msvcrt.putwch('\n')
return pw
Alternatively, could let the user define the masking character, similar to Tkinter's Entry widget.
def win_getpass(prompt='Password: ', stream=None, mask=''):
"""Prompt for password with echo off, using Windows getch()."""
if sys.stdin is not sys.__stdin__:
return fallback_getpass(prompt, stream)
if len(mask) > 1:
raise TypeError('mask argument must be a zero- or one-character str')
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 len(pw) > 0:
pw = pw[:-1]
msvcrt.putwch('\b')
msvcrt.putwch(' ')
msvcrt.putwch('\b')
else:
pw = pw + c
if mask:
msvcrt.putwch(mask)
msvcrt.putwch('\r')
msvcrt.putwch('\n')
return pw
I'm in favor of supporting masking. While it does reveal the password length, it's an accessibility feature many users have come to expect.
I'd rather have this in the standard library than have developers implement their own custom, potentially insecure methods for password input.
I think the usability improvement for this far outweigh the decrease in security.
The days where somebody looking over your shoulder watching you type your password was the major threat are long gone. Hiding the length of the password against a shoulder-surfing adversary is so-1970s :-)
For old-school Unix types we ought to default to hiding the password. But I'm +1 in allowing developers to choose to trade off a tiny decrease in security against a major increase in usability.
The bottom line is that if you have a weak password, hiding the length won't save you; if you have a strong password, hiding the length doesn't add any appreciable difficulty to the attacker.
changed the title [-]Adding the ability for getpass to print asterisks when passowrd is typed[/-][+]Adding the ability for getpass to print asterisks when password is typed[/+]on Jun 10, 2019
websurfer5 commented on Aug 8, 2020
websurfer5mannequin
Mannequin
More actions
This is easy to implement for Windows (as shown), but the unix implementation uses io.TextIOWrapper.readline() to get the password input. The unix implementation would have to be rewritten to provide the same functionality.
Unfortunately modern laptop keyboards have almost no key travel and barely any tactile feedback [*]. Users on such keyboards really do need feedback for each key pressed. Not providing an option for such feedback is in effect forcing users to choose maximally weak password.
[*] worse, a large proportion of MBP keyboards produced in the last few years have the notoriously bad 'butterfly' key design that occasionally duplicates and swallows keypresses. Yes, a trillion dollar company can't make a functional keyboard.
Reacted by Keiran Raine, Stevoisiak, Elijah Ayomide raji, Thibaud Colas and Michael Bear
I’m surprised to see this opened for so long! Is this waiting on a design decision or pull request? Looking at the contribution guidelines for standard library changes, it seems the recommended course of action would be to create a new thread in Discourse under Ideas?
My two cents on the issue – it’s one of those we run into at every single workshop / training for newcomers to open source like Django Girls. There‘s no feedback when typing. In the case of Django, there’s no indication not to expect any feedback either. Lots of people use Windows and will have never come across that kind of prompt ever. So as mentioned above – this is indeed encouraging people to choose a password that’s simple to type.
Activity
MatanyaStroh commentedon Feb 20, 2018
I saw some questions about it in stackoverflow (links below), and also find it very useful to have the ability to print asterisks.
Some users, find it disturbing when they don't have any indication that password is typed, and it will be helpful to have it.
I know that it's have some risks exposing the number of chars to the password, but I think it's worth it.
When using Jupyter (notebook server is 4.3.1) the password does echoed as "*", but not in Python IDE in linux and Windows
MatanyaStroh commentedon Feb 22, 2018
for getpass.win_getpass() it can simply be done by adding this line
msvcrt.putch("*").
So the code will look like:
bitdancer commentedon Feb 24, 2018
getpass is emulating the unix password prompt behavior. I'm not sure if the complication is worth it, especially since not echoing asterisks is, as you observe, fractionally more secure. So I guess I'm about -.5 on this feature.
stevoisiak commentedon Apr 9, 2019
@matanya.stroh: Don't forget to erase the asterisks if the user hits backspace.
Alternatively, could let the user define the masking character, similar to Tkinter's Entry widget.
I'm in favor of supporting masking. While it does reveal the password length, it's an accessibility feature many users have come to expect.
I'd rather have this in the standard library than have developers implement their own custom, potentially insecure methods for password input.
stevendaprano commentedon Jun 6, 2019
See also bpo-36566. (Thanks Cheryl.)
I think the usability improvement for this far outweigh the decrease in security.
The days where somebody looking over your shoulder watching you type your password was the major threat are long gone. Hiding the length of the password against a shoulder-surfing adversary is so-1970s :-)
For old-school Unix types we ought to default to hiding the password. But I'm +1 in allowing developers to choose to trade off a tiny decrease in security against a major increase in usability.
The bottom line is that if you have a weak password, hiding the length won't save you; if you have a strong password, hiding the length doesn't add any appreciable difficulty to the attacker.
[-]Adding the ability for getpass to print asterisks when passowrd is typed[/-][+]Adding the ability for getpass to print asterisks when password is typed[/+]websurfer5 commentedon Aug 8, 2020
This is easy to implement for Windows (as shown), but the unix implementation uses io.TextIOWrapper.readline() to get the password input. The unix implementation would have to be rewritten to provide the same functionality.
akulakov commentedon Aug 10, 2021
Unfortunately modern laptop keyboards have almost no key travel and barely any tactile feedback [*]. Users on such keyboards really do need feedback for each key pressed. Not providing an option for such feedback is in effect forcing users to choose maximally weak password.
[*] worse, a large proportion of MBP keyboards produced in the last few years have the notoriously bad 'butterfly' key design that occasionally duplicates and swallows keypresses. Yes, a trillion dollar company can't make a functional keyboard.
thibaudcolas commentedon Oct 14, 2022
I’m surprised to see this opened for so long! Is this waiting on a design decision or pull request? Looking at the contribution guidelines for standard library changes, it seems the recommended course of action would be to create a new thread in Discourse under Ideas?
My two cents on the issue – it’s one of those we run into at every single workshop / training for newcomers to open source like Django Girls. There‘s no feedback when typing. In the case of Django, there’s no indication not to expect any feedback either. Lots of people use Windows and will have never come across that kind of prompt ever. So as mentioned above – this is indeed encouraging people to choose a password that’s simple to type.
13 remaining items
donbarbos commentedon May 10, 2025
sorry, I can send PR soon.
note: I left a comment about this #130496 (comment)
pythongh-77065: Add argument `echo_char` for `getpass.fallback_getpass`
gh-77065: add missing parameter `echo_char` in `getpass.fallback_getp…
pythongh-77065: add missing parameter `echo_char` in `getpass.fallbac…
[3.14] gh-77065: add missing parameter `echo_char` in `getpass.fallba…
pythongh-77065: Use `putwch` instead of `putch` in `win_getpass`
gh-77065: Use `putwch` instead of `putch` in `getpass.win_getpass` (#…
pythongh-77065: Use `putwch` instead of `putch` in `getpass.win_getpa…
[3.14] gh-77065: Use `putwch` instead of `putch` in `getpass.win_getp…
pythongh-77065: Add optional keyword-only argument `echo_char` for `g…
pythongh-77065: add missing parameter `echo_char` in `getpass.fallbac…
pythongh-77065: Use `putwch` instead of `putch` in `getpass.win_getpa…
pythongh-77065: add missing parameter `echo_char` in `getpass.fallbac…
pythongh-77065: Use `putwch` instead of `putch` in `getpass.win_getpa…