python生成随机密码
很早之前写过一个篇 利用pwgen、mkpasswd、tr自动更改密码 ,后来又狗尾了篇用Linux命令行生成随机密码的十种方法 。前面至少还算是个系统功能,后面越来越写越成烂大街的东西了。即然再烂了,不怕再加一个python版的生成随机密码的篇幅。
一、版本1
先来个详述版的,这里相当于主机讲了下random模块和string模块里一些方法,代码如下:
1#! /usr/bin/env python
2# -*- coding: utf-8 -*-
3#@author 运维之路(www.361way.com)
4import string
5from os import urandom
6from random import choice
7'''
8Linux正则命名参考:http://vbird.dic.ksu.edu.tw/linux_basic/0330regularex.php#lang
9[:alnum:] 代表英文大小写字节及数字,亦即 0-9, A-Z, a-z
10[:alpha:] 代表任何英文大小写字节,亦即 A-Z, a-z
11[:blank:] 代表空白键与 [Tab] 按键两者
12[:cntrl:] 代表键盘上面的控制按键,亦即包括 CR, LF, Tab, Del.. 等等
13[:digit:] 代表数字而已,亦即 0-9
14[:graph:] 除了空白字节 (空白键与 [Tab] 按键) 外的其他所有按键
15[:lower:] 代表小写字节,亦即 a-z
16[:print:] 代表任何可以被列印出来的字节
17[:punct:] 代表标点符号 (punctuation symbol),亦即:" ' ? ! ; : # $...
18[:upper:] 代表大写字节,亦即 A-Z
19[:space:] 任何会产生空白的字节,包括空白键, [Tab], CR 等等
20[:xdigit:] 代表 16 进位的数字类型,因此包括: 0-9, A-F, a-f 的数字与字节
21Python自带常量(本例中改用这个,不用手工定义了)
22string.digits #十进制数字:0123456789
23string.octdigits #八进制数字:01234567
24string.hexdigits #十六进制数字:0123456789abcdefABCDEF
25string.ascii_lowercase #小写字母(ASCII):abcdefghijklmnopqrstuvwxyz
26string.ascii_uppercase #大写字母(ASCII):ABCDEFGHIJKLMNOPQRSTUVWXYZ
27string.ascii_letters #字母:(ASCII)abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
28string.punctuation #标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
29以下的不用,有locale问题
30string.lowercase #abcdefghijklmnopqrstuvwxyz
31string.uppercase #ABCDEFGHIJKLMNOPQRSTUVWXYZ
32string.letters #ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
33以下的不能用
34string.whitespace #On most systems this includes the characters space, tab, linefeed, return, formfeed, and vertical tab.
35string.printable #digits, letters, punctuation, and whitespace
36'''
37#请在此设置您要生成的密码需求
38passwd_length = 20 #密码长度
39passwd_count = 100 #密码个数
40passwd_seed = string.digits + string.ascii_letters + string.punctuation #密码种子
41#passwd_seed = string.digits
42#passwd_seed = string.digits + string.ascii_letters
43def generate_passwd():
44 '''Function to generate a password'''
45 passwd = []
46 while (len(passwd) < passwd_length):
47 passwd.append(choice(passwd_seed))
48 return ''.join(passwd)
49def print_string_constants():
50 '''Test Case'''
51 print string.digits
52 print string.octdigits
53 print string.hexdigits
54 print string.ascii_lowercase
55 print string.ascii_uppercase
56 print string.ascii_letters
57 print string.punctuation
58 print string.lowercase
59 print string.uppercase
60 print string.letters
61 print (string.printable + "ooo")
62 print string.whitespace
63 print '\n\n'
64if __name__ == '__main__':
65 for i in range(0, passwd_count):
66 print generate_passwd()
这个版本不要看着长,其实很多代码没用,为了便于理解加上去上的,真正用的只是上面的import部分+ gen_pass函数部分 + main函数 。
二、版本2
1#!/usr/bin/env python
2# -*- coding=utf-8 -*-
3import random, string#导入random和string模块
4def GenPassword(length):
5 #随机出数字的个数
6 numOfNum = random.randint(1,length-1)
7 numOfLetter = length - numOfNum
8 #选中numOfNum个数字
9 slcNum = [random.choice(string.digits) for i in range(numOfNum)]
10 #选中numOfLetter个字母
11 slcLetter = [random.choice(string.ascii_letters) for i in range(numOfLetter)]
12 #打乱组合
13 slcChar = slcNum + slcLetter
14 random.shuffle(slcChar)
15 #生成随机密码
16 getPwd = ''.join([i for i in slcChar])
17 return getPwd
18if __name__ == '__main__':
19 print GenPassword(6)
该版本代码略多,只不过其中指定必须有数字,必须有字母,当然再改下,你还可以指定必须有特殊符号。
三、版本3
1from random import randrange, sample
2#定义列表
3password_list = ['z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a',
4 '0','1','2','3','4','5','6','7','8','9',
5 '!','@','#','$','%','^','&','*','(',')','_','+','-','=',
6 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
7 ]
8leng=15 #定义长度
9password = "".join(sample(password_list, leng)).replace(' ', '')
10print(password)
这里只是给了一个全示例,其实真实使用中时,如果上面的sting码表如果都要的话,直接使用上面的sting里的方法更好,不过往往为了使密码便于区分,会将I、l(小写L)、1(数字1)、O与0(数字零)等去掉。这样使用版本3就比较不错。
四、版本4
1#-*- coding:utf-8 -*-
2'''
3简短地生成随机密码,包括大小写字母、数字,可以指定密码长度
4'''
5#生成随机密码
6from random import choice
7import string
8#python3中为string.ascii_letters,而python2下则可以使用string.letters和string.ascii_letters
9def GenPassword(length=8,chars=string.ascii_letters+string.digits):
10 return ''.join([choice(chars) for i in range(length)])
11if __name__=="__main__":
12 #生成10个随机密码
13 for i in range(10):
14 #密码的长度为8
15 print(GenPassword(8))
代码简少,是版本1的一个更简化版本的变种,来自于python cookbook上的方法。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/python-genpasswd/4598.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.