省略某些字符在随机密码生成器程序中的输出

时间:2019-03-21 08:49:11

标签: python random module character ascii

我正在编写一个程序,该程序随机生成任意数量的ASCII字符的组合。

import random
import string

string.printable
sP = string.printable

def random_pass(stringLength):
     x = sP
     return ''.join((random.choice(x)) for i in range(stringLength))
     if x == '<0x0c>' or '<0x0b>:
     print("Try again!")
print('You'\re password is: ', random_pass(12))
  • <0x0c><0x0b>代表什么?
  • 在程序的某些迭代过程中,这些字符代码被打印出来。
  • 它们代表空白吗?
  • 我在random_pass()函数中的if语句不忽略字符代码出现在输出中。这就是为什么我现在寻求帮助。

2 个答案:

答案 0 :(得分:0)

根据common strings operations上的Python文档:

  

string.printable

     

被认为是可打印的字符串。这是数字,字母,标点符号和空格的组合。

,空格定义为:

  

string.whitespace

     

一个字符串,其中包含所有被视为空格的字符。在大多数系统上,这包括字符空格,制表符,换行符,   返回,换页和垂直标签。

因此有时在random.choice(x)中包含那些字符是很正常的

  • 0x0c是换行符
  • 0x0b是垂直制表符

您可能不应该使用string.printable,而应使用string.ascii_letters + string.digits + string.punctuation

之类的东西。

答案 1 :(得分:0)

  

<0x0c>和<0x0b>代表什么?

     

在程序的某些迭代过程中,这些字符代码被打印出来。

  • 0x0c是换行符
  • 0x0b是垂直制表符

您可以在ASCII table

中查找它们
  

它们代表空白吗?

是的,它们是string.whitespace

的一部分
  

我的random_pass()函数中的if语句不忽略字符代码出现在输出中。这就是为什么我现在寻求帮助。

您要检查0x0c0x0b的条件永远不会执行,因为它放在return的{​​{1}}语句之后。

@ Tigre-Bleu已经建议您使用random_pass而不是string.ascii_letters + string.digits + string.punctuation

此外,在生成密码时,您应该使用具有强大加密功能的随机数生成器。如果您使用Python> = 3.6,则可以使用secrets模块:

string.printable

对于Python <3.6,您可以使用random.SystemRandom(),它将在支持它的系统上使用os.urandom()

import secrets
import string

def random_pass(stringLength):
    alphabet = string.ascii_letters + string.digits + string.punctuation
    password = ''.join(secrets.choice(alphabet) for i in range(stringLength))
    return password

print('Your password is:', random_pass(12))
# Your password is: 2;=1!*A.dK;+