Python 生成高强度密码

有些场合需要高强度密码,例如可参考 选择更安全的密码

  1. 选一个短语:“圣人千虑,必有一失。
  2. 变形:Srqlby1s
  3. 添加特殊字符:#Srqlby1s:
  4. 将它同网站联系起来:
    • 第一个字是一三声,那么首字母大写,网站名称放在左边。
    • 淘宝网:#Srqlby1s:tBw
    • 新浪微博:XlWb#Srqlby1s:
    • 人人网:#Srqlby1s:rRw
    • 优酷网:YkW#Srqlby1s:

还有的时候,可能需要更无序随机的密码。(比如为了不那么费脑子推断)

secrets 模块

例如,生成长度为八个字符的字母数字密码:

1
2
3
4
import string
import secrets
alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for i in range(8))

例如,生成长度为十个字符的字母数字密码,包含至少一个小写字母,至少一个大写字母以及至少三个数字:

1
2
3
4
5
6
7
8
9
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!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

但是有些网站无法使用所有的标点符号,那么这里可以自定义为:

  • ?!@#$%^&*_-+=[]<>;:,.

自用代码

以下代码应该不用注释你也能看懂,中文的信息密度值得信赖。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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()
当你有机会做出选择时,不要让自己后悔
使用 Hugo 构建
主题 StackJimmy 设计