目录
getpass的用法
输入
获取用户名
msvcrt库实现输入加密
getpass+keyring实现密码安全存储及获取
python之keyring库:安全密码管理库,不同平台service_name、username的获取-CSDN博客
中介绍了使用keyring
库进行密码的安全存储,但是也提到keyring
库的使用可能需要用户的交互,如在首次存储凭证时输入密码或修改密码时需要输入密码,这样会是密码暴露出来。所有我们可以使用Python的内置库getpass,这个模块是用来在终端(命令行界面)中安全地获取用户密码输入的。在用户输入密码时隐藏输入内容,从而增强了安全性。对于编写需要用户输入密码的程序非常有用。且getpass模块支持跨平台,但在不同的操作系统上可能会有不同的行为,例如,在某些Unix-like系统上,它可能会使用/dev/tty来获取密码输入,而在Windows上,它可能会使用msvcrt模块来实现。因此,尽管getpass旨在提供跨平台的一致性,但在某些情况下,你可能需要根据目标平台调整代码或进行测试。
getpass的用法
输入
import getpass# 提示用户输入密码
password = getpass.getpass(prompt='请输入密码: ', stream=None)# 打印输入的密码(仅用于演示,实际应用中不应打印密码)
print(f'你输入的密码是: {password}')
获取用户名
print(getpass.getuser())
获取当前登录的用户名。此函数将从环境变量LOGNAME、USER、LNAME、USERNAME中按顺序读取第一个非空的值。若这些环境变量都未设置,在支持 pwd 模块的系统上,会返回对应的密码数据库登录名。在获取登录名的功能上,推荐优先使用此函数,而非 os.getlogin()。
msvcrt库实现输入加密
getpass会隐藏输入的内容,而在输入时如果需要显示 *
而不是完全隐藏输入内容,可以使用 msvcrt
模块(仅适用于Windows)或 termios
模块(适用于Unix-like系统)来实现自定义的输入处理。
import msvcrtdef get_password_with_asterisks(prompt='请输入密码: '):print(prompt, end='', flush=False)password = ''while True:ch = msvcrt.getch()if ch == b'\r': # 回车键print()breakelif ch == b'\x08': # 退格键if len(password) > 0:password = password[:-1]print('\b \b', end='', flush=False)else:password += ch.decode('utf-8')print('*', end='', flush=False)return passwordpassword = get_password_with_asterisks()
print(f'你输入的密码是: {password}')
getpass+keyring实现密码安全存储及获取
import keyring, getpassservice_name = getpass.getpass('请输入server凭证:')
username = getpass.getpass('请输入用户名:')
password = getpass.getpass('请输入密码:')keyring.set_password(service_name, username, password)pd = keyring.get_password(service_name, username)
print(pd) # 实际过程中不会打印出来,这里做测试用