Пропуск определенного символа из вывода в программе генератора случайных паролей - PullRequest
0 голосов
/ 21 марта 2019

Я пишу программу, которая случайным образом генерирует комбинацию любого количества символов 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>?
  • Во время некоторых итераций программы эти коды символов выводятся на печать.
  • Они представляют пробелы?
  • Мой оператор if в функции random_pass () не пропускает коды символов изпоявляются в выводе.Вот почему я сейчас обращаюсь за помощью.

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Что означают <0x0c> и <0x0b>?

Во время некоторых итераций программы эти коды символов выводятся на печать.

  • 0x0c - перевод строки
  • 0x0b - вертикальная табуляция

Вы можете найти их в таблице ASCII

Они представляют пробелы?

да, они являются частью string.whitespace

Мой оператор if в функции random_pass () не делает 'Не пропускайте коды символов в выходных данных.Вот почему я сейчас обращаюсь за помощью.

Ваше условие для проверки 0x0c и 0x0b никогда не выполняется, поскольку оно помещается после оператора return в random_pass.

Как уже предложено @ Tigre-Bleu, вы должны использовать string.ascii_letters + string.digits + string.punctuation вместо string.printable

Кроме того, вы должны использовать криптографически сильный генератор случайных чисел при генерации паролей.Если вы используете Python> = 3.6, вы можете использовать модуль secrets:

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;+

для Python <3.6 вы можете использовать <a href="https://docs.python.org/2/library/random.html#random.SystemRandom" rel="nofollow noreferrer">random.SystemRandom(), который будет использоватьos.urandom() в системах, которые его поддерживают:

import random
import string

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

print 'Your password is:', random_pass(12)
# Your password is: V9I:+H{_>*'p
0 голосов
/ 21 марта 2019

В соответствии с документацией Python о операциях с общими строками :

string.printable

Строка символов, которые считаются печатными.Это комбинация цифр, букв, знаков препинания и пробелов.

и пробел определены как:

string.whitespace

Строка, содержащая все символы, которые считаются пробелами.В большинстве систем это включает в себя пространство символов, табуляцию, перевод строки, возврат, подачу формы и вертикальную табуляцию.

Так что обычно эти символы в random.choice(x)

  • 0x0c - перевод строки
  • 0x0b - вертикальная табуляция

Возможно, вы не должны использовать string.printable, а вместо этого что-то вроде string.ascii_letters + string.digits + string.punctuation

...