python生成自定义长度、包含指定字符、排除指定字符、必定包含每一类字符的随机密码,仿照KeePass密码生成器

话不多说,直接上代码(注意必须是python3 ,因为有两个方法在python2和3中的写法是不同的,如果用python2,则需要修改maketrans和translate)

python3 代码

# -*- coding: utf-8 -*-
# 本程序用于生成指定长度,包含指定字符,排除指定字符,必定包含数字大小写的随机密码
#     参数介绍:
#       del_string:不想在密码中出现的字符,主要是易混淆的字符,比如0O1l
#       add_string:想要额外添加的字符,主要是特殊字符,因为大小写字母和数字已经默认包含了
#       命令行参数:格式是"python3 main.py y 16",简单使用"python3 main.py"
#         y代表的是,是否添加额外的字符,默认是添加的,所以这个参数可以不用,
#          需要注意的是,如果使用了y以外的参数,比如abcde,那么统统都认为不想添加额外字符,因为程序只判断是不是等于y
#         16表示密码长度,默认长度就是16,所以这个参数也可以不加,
# 注意:
#     1. 有些网站限定密码最长16位,所以默认就设定了16,如果习惯更长的密码,可以在执行时候指定参数,也可以自己在代码里改掉参数
#        代码中修改,只需要把get_key函数中的"n=16"改成需要的长度即可
#     2. 有些网站密码不允许包含特殊字符,所以遇到这种情况的时候,加个n参数,去掉额外字符就行,例如"python3 main.py n"
#        或者嫌麻烦,直接使参数add_string=''就可以了
#     3. 程序里的参数是根据位置来判断的,而且是从左到右的,也就是说,如果要加密码长度参数,那你前面就得加y参数,不然就要报错

import random
import string
import re
import sys

del_string = '0oOilL1'  # 不想在密码中出现的字符
add_string = '=+#@&'  # 额外添加的字符
string_lib = string.ascii_letters + string.digits  # 小写字母+大写字母+数字


def get_key(j='y', n=16):
    del_string_temp = del_string
    string_lib_temp = string_lib
    if j == 'y':  # 添加额外字符
        string_lib_temp += add_string
    string_lib_temp = string_lib_temp.translate(str.maketrans('', '', del_string_temp))  # 删去不想要的字符

    while 1:  # 判断是否包含数字,大小写字母,额外添加的字符
        key = random.sample(string_lib_temp, n)  # 生成随机密码
        key = "".join(key)
        if bool(re.search(r'\d', key)) \
                and bool(re.search('[a-z]', key)) \
                and bool(re.search('[A-Z]', key)):
            if j == 'y' and add_string != '':
                if bool(re.search('[' + add_string + ']', key)):
                    return key
            else:
                return key


if __name__ == '__main__':
    if len(sys.argv) == 3:
        key = get_key(j=sys.argv[1], n=int(sys.argv[2]))
    elif len(sys.argv) == 2:
        key = get_key(j=sys.argv[1])
    else:
        key = get_key()
    print("length:", len(key))
    print(key)


演示效果

python生成自定义长度、包含指定字符、排除指定字符、必定包含每一类字符的随机密码,仿照KeePass密码生成器_第1张图片

题外话,该代码产生的背景

大多数的密码管理软件都支持排除混淆字母,比如0O这类,但是它不支持自定义,比如g9q我也容易混淆,但无法自定义在密码中排除,其中keepass具备这个功能,但我不喜欢这个软件,自动填充功能太拉胯,所以仿照keepass的密码生成器写了这个代码,主要是希望它具备下面这几个功能

  1. 可自定义密码长度,由于一些网页限制密码长度16位,所以最好默认16位,但可以根据需要临时修改长度
  2. 可排除指定的字符,把自己容易混淆的字符统统排除
  3. 可添加指定字符,我希望密码中含有特殊字符,但又不希望什么都有,因为如果某些软件不让复制粘贴只能手动输入时候,叠加特殊字符的密码极为容易输错,所以如果能单独指定某几个特殊字符,比如=,+,#之类,或者干脆就一个特殊字符,那么既满足了添加特殊字符的需求,又能降低手打的输错率.
  4. 包含每一种字符,如果随机生成的密码不能确保每次都包含每一种字符,那么搞那么多符号种类就完全没意义了
  5. 可以显示出密码的复杂度,也就是熵,但很可惜这个功能我没有实现,因为我不知道KeePass它到底怎么算出来的,对比了几个在线计算平台,结果发现同一个密码居然能计算出不同的熵,后来考虑到如果密码加入了大小写字母、数字和特殊字符,长度维持在16位以上,那么它的熵值已经至少80比特(在keepass中添加这几个要素生成的密码的平均值)以上了,基本算很安全了,算不算熵值也意义不大了

补充:如何快捷的操作

这只是个python脚本,如果需要密码的时候,去打开路径,然后再执行,那么很明显效率会非常低,每个人有自己顺手的自定义操作方式,我这里就只讲下我的方法
我用的搜狗输入法,在搜狗输入法中有自定义短语的功能,就是固定的按键,直接出现固定内容,一般流行的输入法都会有类似功能的,那么我们就可以将固定的代码加入到自定义短语中,在需要生成密码的时候,打开命令行,直接几个按键就执行了,示例如下:

  1. 我在搜狗输入法的自定义短语中定义了,在第二候选位置,uimm(双拼中"生成密码"的首拼)代表后面这一条代码,代码意思是进入脚本所在目录,然后执行脚本.这里我展示的是导出成文档之后的样子,在输入法里编辑也是一样的,只不过没有逗号等号这些东西了,具体看它自家说明就行
    在这里插入图片描述

  2. 打开命令行,然后输入uimm,第二候选位就是生成密码的代码,按分号键直接选中第二位候选,然后回车
    python生成自定义长度、包含指定字符、排除指定字符、必定包含每一类字符的随机密码,仿照KeePass密码生成器_第2张图片

  3. 这是实际运行效果,可以看到需要密码时候,只需要开启命令行,输入几个按键,然后回车就完事,甚至命令行的调起、代码执行、密码的复制,也可以简化到一个快捷键完成,不过我不太想搞太复杂,这样就足够了,实际体验下来,比手动点击软件的密码生成器要丝滑
    python生成自定义长度、包含指定字符、排除指定字符、必定包含每一类字符的随机密码,仿照KeePass密码生成器_第3张图片

注意:上面的演示使用的是mac系统,win系统的话,只是执行代码的区别,操作方式还是一样的

补充:一键生成密码的方法(仅限Mac)

主要原理就是利用Mac自带的”快捷指令“来实现,所以这里简单贴个图就行,有需要的,自行去百度一下快捷指令的创建方法,然后按照我贴的顺序往上贴就行

注意:不一定非得用“快捷指令”,“自动操作”也可以实现,但是“自动操作”在运行脚本时候会提示访问权限不足,而“快捷指令”没有出现这个问题,所以才用了快捷指令来实现,类似的,任何可以自动化的软件都可以实现这样的效果,比如Alfred这类的

python生成自定义长度、包含指定字符、排除指定字符、必定包含每一类字符的随机密码,仿照KeePass密码生成器_第4张图片
按下快捷键后运行效果如下图
python生成自定义长度、包含指定字符、排除指定字符、必定包含每一类字符的随机密码,仿照KeePass密码生成器_第5张图片

你可能感兴趣的:(python,开发语言,安全,源代码管理)