有些场合需要高强度密码,例如可参考 选择更安全的密码 :
- 选一个短语:“圣人千虑,必有一失。”
- 变形:
Srqlby1s
- 添加特殊字符:
#Srqlby1s:
- 将它同网站联系起来:
- 第一个字是一三声,那么首字母大写,网站名称放在左边。
- 淘宝网:
#Srqlby1s:tBw
- 新浪微博:
XlWb#Srqlby1s:
- 人人网:
#Srqlby1s:rRw
- 优酷网:
YkW#Srqlby1s:
还有的时候,可能需要更无序随机的密码。(比如为了不那么费脑子推断)
secrets 模块#
例如,生成长度为八个字符的字母数字密码:
import string
import secrets
alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for i in range(8))
例如,生成长度为十个字符的字母数字密码,包含至少一个小写字母,至少一个大写字母以及至少三个数字:
import string
import secrets
alphabet = string.ascii_letters + string.digits
while True:
password = ''.join(secrets.choice(alphabet) for i in range(10))
if (any(c.islower() for c in password)
and any(c.isupper() for c in password)
and sum(c.isdigit() for c in password) >= 3):
break
加入特殊字符#
string 模块提供一些预设字符串常量,如:
string.punctuation
-!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
但是有些网站无法使用所有的标点符号,那么这里可以自定义为:
?!@#$%^&*_-+=[]<>;:,.
自用代码#
以下代码应该不用注释你也能看懂,中文的信息密度值得信赖。
import secrets
import string
字母数字 = string.digits + string.ascii_letters
字符 = 字母数字 + r"?!@#$%^&*_-+=[]<>;:,."
字符plus = 字母数字 + string.punctuation
def main(): # 哪个好看选哪个
# print(生成密码(字符))
# print(生成密码(字符))
# print(生成密码(字符))
print(生成密码())
print(生成密码())
print(生成密码())
def 抽取(字符池, 长度):
密码 = "".join(secrets.choice(字符池) for i in range(长度))
return 密码
def 检查(密码, 字符池, 数量):
if sum(c in 字符池 for c in 密码) >= 数量:
return True
else:
return False
def 生成密码(字符池=字符plus, 长度=12, 数字数=1, 小写数=1, 大写数=1, 特殊字符数=1):
while True:
密码 = 抽取(字符池, 长度)
if (
检查(密码, string.digits, 数字数)
and 检查(密码, string.ascii_lowercase, 小写数)
and 检查(密码, string.ascii_uppercase, 大写数)
and 检查(密码, string.punctuation, 特殊字符数)
):
break
return 密码
if __name__ == "__main__":
main()