借助python实现密码生成器
本帖最后由 paypojie 于 2022-7-7 14:07 编辑生成密码字段
众所周知 python是一门面向对象的高级编程语言 所以我们借助它来实现一些小玩具 看看效果怎么样代码如下 嘿嘿:lol:lol:lol
import random
class Password:
def number(self,n):
num = '0123456789'
s = ''
for i in range(n):
r = random.choice(num)
s += r
print(s)
def str1(self,n):
st1 = 'qwertyuiopasdfghjklzxcvbnm'
s = ''
for i in range(n):
r = random.choice(st1)
s += r
print(s)
def str2(self,n):
st2 = 'QWERTYUIOPASDFGHJKLZXCVBNM'
s = ''
for i in range(n):
r = random.choice(st2)
s += r
print(s)
def number_str1(self,n):
num_st1 = '0123456789qwertyuiopasdfghjklzxcvbnm'
s = ''
for i in range(n):
r = random.choice(num_st1)
s += r
print(s)
def number_str2(self,n):
num_st2 = '0123456789QWERTYUIOPASDFGHJKLZXCVBNM'
s = ''
for i in range(n):
r = random.choice(num_st1)
s += r
print(s)
def str1_str2(self,n):
st1_St2 = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
s = ''
for i in range(n):
r = random.choice(st1_St2)
s += r
print(s)
def number_str1_str2(self,n):
num_St1_St2 = '0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
s = ''
for i in range(n):
r = random.choice(num_St1_St2)
s += r
print(s)
def number_str1_str2_SpecialStr(self,n):
num_St1_St2_SpecialStr = '0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM^\|<>¢£?¥₱[]}{#% +=~_-/:;()$&"`?! *@,\''
s = ''
for i in range(n):
r = random.choice(num_St1_St2_SpecialStr)
s += r
print(s)
p = Password()
print('请选择你要生成的数据类型 ')
Flag = True
while Flag:
ipt = int(input('1:数字 2:小写字母 3:大写字母 4:数字小写字母中挑选 5:数字大写字母中挑选 6:小写字母大写字母中挑选 7:数字小写字母大写字母中挑选 8:数字小写字母大写字母特殊字符中挑选 请输入选项所对应的数字: '))
n = int(input('请选择你要生成的长度: '))
if ipt == 1:
p.number(n)
elif ipt == 2:
p.str1(n)
elif ipt == 3:
p.str2(n)
elif ipt == 4:
p.number_str1(n)
elif ipt == 5:
p.number_str2(n)
elif ipt == 6:
p.str1_str2(n)
elif ipt == 7:
p.number_str1_str2(n)
else:
p.number_str1_str2_SpecialStr(n)
hello1 = int(input('请问是否继续生成数据 生成请输入1 退出请输入2: '))
if hello1 == 1:
Flag = True
else:
Flag = False
可以通过这个在线运行https://py2.codeskulptor.org/在线运行真的超级方便 即便没有python环境也可以运行测试 哈哈哈 不过写的比较粗糙 后来我又把代码给优化了一下
import random
num = '0123456789'
st1 = 'qwertyuiopasdfghjklzxcvbnm'
st2 = 'QWERTYUIOPASDFGHJKLZXCVBNM'
num_st1 = '0123456789qwertyuiopasdfghjklzxcvbnm'
num_st2 = '0123456789QWERTYUIOPASDFGHJKLZXCVBNM'
st1_St2 = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
num_St1_St2 = '0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
num_St1_St2_SpecialStr = '0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM^\|<>¢£?¥₱[]}{#% +=~_-/:;()$&"`?! *@,\''
class Password:
def password(self,n,select):
s = ''
for i in range(n):
r = random.choice(select)
s += r
print(s)
p = Password()
print('请选择你要生成的数据类型 ')
Flag = True
while Flag:
ipt = int(input('1:数字 2:小写字母 3:大写字母 4:数字小写字母中挑选 5:数字大写字母中挑选 6:小写字母大写字母中挑选 7:数字小写字母大写字母中挑选 8:数字小写字母大写字母特殊字符中挑选 请输入选项所对应的数字: '))
n = int(input('请选择你要生成的长度: '))
if ipt == 1:
p.password(n,num)
elif ipt == 2:
p.password(n,st1)
elif ipt == 3:
p.password(n,st2)
elif ipt == 4:
p.password(n,num_st1)
elif ipt == 5:
p.password(n,num_st2)
elif ipt == 6:
p.password(n,st1_St2)
elif ipt == 7:
p.password(n,num_St1_St2)
else:
p.password(n,num_St1_St2_SpecialStr)
hello1 = int(input('请问是否继续生成数据 生成请输入1 退出请输入2: '))
if hello1 == 1:
Flag = True
else:
Flag = False
(改进后的代码的想法 ) 对于生成这种密码的思路 是如何做到的呢 先导入random模块 因为要产生密码 所以要对序列里的元素进行随机组合(序列可以是纯数字 也可以是字母 特殊字符或者其它等等)
再定义序列变量 比如数字序列 字母序列等 这些序列变量定义在类外面的 然后 再定义一个类 我们在类中定义password(self,n,select)方法 第一个形参是按照惯例定义的 self表示创建的实例本身 第二个表示要生成密码的长度 第三个表示要选则的序列 定义变量s s是一个空字符串 用来保存每次产生的单个序列元素 然后for循环 循环的次数由用户输入的n决定 n可以看做产生密码的长度 也可以看做在序列中随机挑选元素的次数 再打印s变量
之后 再将类给实例化 也就是创建实例对象 再输出提示 定义Flag变量 进入while循环 定义了两个input变量 用来提示输入 然后进行条件判断 用户输入的是数字几 就调用类的对应方法 然后询问用户是否要继续进行生成密码 如果生成则进入while循环 否则 Flag变量为False 就无法进入while循环 就退出
https://static.52pojie.cn/static/image/hrline/line4.png
总结 导入模块 定义变量定义类类中定义方法 实例化类 输出提示 进入while循环 之后条件判断 根据条件调用对应方法 再进行条件判断 要么继续 要么退出
cmd运行结果
python的random.randint()选择我猜测属于伪随机选择
疑问? 借用python生成的密码安全吗 就是我这种写法 别人能通过其他办法预测我产生的密码吗 有知道的请解惑 谢谢 没人吗 嗷呜 {:301_972:} 感谢分享。人生苦短,我用python。 vethenc 发表于 2022-7-6 18:03
感谢分享。人生苦短,我用python。
是的 人生苦短 我用python {:1_886:}能不能不写那么长?
num = '0123456789'
st1 = 'qwertyuiopasdfghjklzxcvbnm'
st2 = st1.upper()
num_st1 = f'{num}{st1}'
num_st2 = f'{num}{st2}'
st1_St2 = f'{st1}{st2}'
num_St1_St2 = f'{num}{st1}{st2}' wkdxz 发表于 2022-7-6 18:32
能不能不写那么长?
num = '0123456789'
st1 = 'qwertyuiopasdfghjkl ...
我想到了简化 但是额 {:300_955:} 感谢楼主分享 tcll呀呀 发表于 2022-7-6 18:35
感谢楼主分享
不用谢 哈哈哈 :lol 楼主你好哇,其实我也是个python小白,谢谢你的分享,大家一起讨论学习.
首先,是否可以考虑用`string`模块. `string.ascii_letters` `string.digits` `string.hexdigits` `string.punctuation`能省不少麻烦.
然后是`radnom`模块, 用`random.choices`或者`random.sample`直接取然后join.也挺省事的.
同时是否可以考虑加一个安全模式:不echo密码内容防窥屏
https://docs.python.org/3/library/secrets.html#recipes-and-best-practices{:1_921:} sapin 发表于 2022-7-6 19:02
楼主你好哇,其实我也是个python小白,谢谢你的分享,大家一起讨论学习.
首先,是否可以考虑用`string` ...
"同时是否可以考虑加一个安全模式:不echo密码内容防窥屏 "
这个可以考虑 嘿嘿 {:301_1001:}
页:
[1]
2