В этом случае это просто сводится к недостатку знаний - вы не пользуетесь параметрами функций - я предполагаю, что вы не знаете, что это такое, потому что если бы вы это сделали, вы бы предпочли их глобальным Переменные.
Я не знаю, что именно «безопасность» - это то, чем вы жертвуете при использовании глобальных переменных. Конечно, я могу думать о гипотетических примерах, и я уверен, что кто-то может привести некоторые реальные примеры, в которых использование глобальных переменных было серьезной проблемой безопасности ... Я имею в виду, что использование глобальных переменных не делает вашу программу по своей сути небезопасен - просто очень легко использовать их неправильно (есть ли правильный путь?). Существуют более эффективные решения для решения проблем, которые, по вашему мнению, вы можете решить только с помощью глобальных переменных.
Код, который вы разместили, действительно демонстрирует суть глобальных переменных - если я, пользователь вашей программы, хочу создать несколько паролей, результат, который я получаю, является неожиданным:
['d', 'q', '3', 'O', 'g', '1', '$', 'J', '&', '7']
dsLT(mq4N^Yy3(L)%iOr&VM3gTfaZq1&ud9B$RJJ1aJe6Nju&O2*rE7Zz@Y!
dq3Og1$J&7
>>> passwordGenerator()
['n', '&', 'E', ')', '7', '0', '&', 'O', '2', '1', '$', '3', 'q', 'q', 'k', 'J', 'B', '1', 'd', 'g']
>>> passwordGenerator()
['j', '9', 'd', '1', 'k', 'O', 'B', 'q', 'Q', '2', 'g', 'o', 'e', '7', '1', 'n', 'q', '$', 'J', '&', '!', '0', 'A', '!', 'E', ')', '3', '7', '&', '2']
>>> passwordGenerator()
['u', 'o', '!', ')', '0', 'j', 'h', '1', '!', 'q', '7', 'g', '$', '9', 'n', 'k', 'q', '1', '&', 'd', 'J', '2', 'B', '8', '3', '2', '&', '7', 'L', '*', 'O', '5', 'Q', 'e', '&', 'S', '2', 'E', 'A', 'x']
>>> passwordGenerator()
['o', 'h', 'u', '1', 'S', 'q', '&', '7', '$', 'g', '7', '8', '2', '3', 'J', '&', 'k', 'A', '9', 'q', '2', '1', '6', 'B', '0', '*', '&', '!', 'e', 'x', 'j', 'B', 'L', 'a', 'o', '9', ')', '$', 'n', '9', 'U', 's', '!', 'Q', 'E', '2', 'd', '&', '5', 'O']
passwordGenerator
изменяет состояние глобальной переменной Password
, добавляя к ней элементы каждый раз, когда вызывается функция. Вообще говоря, функция неожиданно изменяет состояние переменной (которая находится вне области действия функции). Вот почему глобальные переменные могут быть источником проблем, будь то безопасность или иным образом.
Это не связано, но вы также делаете некоторые ненужные вещи, такие как тасование Password
после добавления к нему случайных символов. Вот как это может выглядеть с параметрами функции:
def get_random_password(alphabet):
from random import randint, choices
password_length = randint(5, 16)
password = choices(alphabet, k=password_length)
return "".join(password)
def get_encrypted(alphabet, plaintext):
from random import choices
return "".join(char + "".join(choices(alphabet, k=5)) for char in plaintext)
def get_decrypted(encrypted_plaintext):
return encrypted_plaintext[::6]
def main():
import string
alphabet = string.digits + string.ascii_letters + string.punctuation
# alphabet = string.printable.rstrip()
password = get_random_password(alphabet)
encrypted = get_encrypted(alphabet, password)
decrypted = get_decrypted(encrypted)
print(f"The password is \"{password}\"")
print(f"Encrypted: \"{encrypted}\"")
print(f"Decrypted: \"{decrypted}\"")
if __name__ == "__main__":
main()
Вывод:
The password is "O*L7~"
Encrypted: "OiL)V\*I={w&LX5"2-7WF/\+~5%_mP"
Decrypted: "O*L7~"
>>>
Я также добавил точку входа main
и воспользовался стандартной библиотекой a немного более. Это тангенциально, но на самом деле вы не «зашифровываете» строку, строго говоря, это больше похоже на запутывание, но неважно.