必要
日常生活では、仕事や生活上の必要性から、たくさんのアカウントを登録し、たくさんのパスワードを作成する必要があります。トラブルを避けるためにすべてのアカウントに同じパスワードを使用する人もいますが、これは非常に安全ではありません。アカウントまたは対応するプラットフォームに問題が発生すると、非常に面倒ですが、アカウントごとに新しいパスワードを作成する必要があります。とても頭が痛いです。
この記事の実際の目的は、Python を使用してパスワード ジェネレーターを実装することであり、これは 2 つの状況に分けられます。クラスは文字-数字-特殊文字: 5:3:2)、2 番目のタイプはパスワードの構成や比率に要件がなく、ランダムに生成するだけです。この小さな機能を一緒に実現しましょう。
達成
実装クラスは PasswordGenerator で、選択する文字、数字、特殊文字を表す ALPHA、NUMBER、SPECIAL の 3 つの静的フィールドがあります。ここでは、めんどくさがりなので拡大して文字を書くことはしません。興味のある友達は追加してください。2 つの属性、password_length があり、password はそれぞれパスワードの長さと最終的に生成されたパスワードを表します。静的メソッドgenerate_passがあり、その機能は候補文字列と生成する文字列の長さに応じて、指定された長さの文字列をランダムに生成することです。2 つのスキームfixed_proportion_generateとrandom_generateは、それぞれ固定構成比のパスワード文字列とランダムなパスワード文字列の生成を表します。
クラスの具体的な実装は次のとおりですが、読者の理解を容易にするために、すべての注釈は可能な限り追加されています。
class PasswordGenerator:
# 候选字母
ALPHA = "abcdefghijklmnopqrstuvwxyz"
# 候选数字
NUMBER = "0123456789"
# 候选特殊字符
SPECIAL = "@#$%&*"
def __init__(self, password_length=8):
"""
初始化
:param password_length:
密码长度,默认为8
"""
self.password_length = password_length
# 存放生成的密码
self.password = []
def random_generate(self):
"""
密码字符、数字、以及特殊字符的比例是随机来生成密码
:return:
"""
# string.ascii_letters :ASCII码,包括字母的大小写(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz)
# string.digits :数字字符串 0123456789
# string.punctuation :特殊字符字符串 !"#$%&'()*+,-./:;<=>?@[\]^_{|}~
total = string.ascii_letters + string.digits + string.punctuation
return "".join(random.sample(total, self.password_length))
def fixed_proportion_generate(self):
"""
固定字母——数字——特殊字符的比例
这里是按照5——3——2的比例来生成密码
:return:
"""
alpha_len = self.password_length // 2
num_len = math.ceil(self.password_length * 30 / 100)
special_len = self.password_length - (alpha_len + num_len)
# 生成密码的字母部分
self.password.append(PasswordGenerator.generate_pass(alpha_len, PasswordGenerator.ALPHA, True))
# 生成密码的数字部分
self.password.append(PasswordGenerator.generate_pass(num_len, PasswordGenerator.NUMBER))
# 生成密码的特殊字符部分
self.password.append(PasswordGenerator.generate_pass(special_len, PasswordGenerator.SPECIAL))
gen_password = []
for i in self.password:
gen_password.extend(i)
# 随机打乱生成的密码顺序
random.shuffle(gen_password)
# 连接成字符串返回
return "".join(gen_password)
@staticmethod
def generate_pass(length, array, is_alpha=False):
password = []
for i in range(length):
index = random.randint(0, len(array) - 1)
character = array[index]
if is_alpha:
case = random.randint(0, 1)
if case == 1:
character = character.upper()
password.append(character)
return password
次に、このクラスを使用してパスワードを生成しましょう。コードは次のとおりです。
if __name__ == '__main__':
# 使用密码生成器
pass_len = int(input("请输入密码长度:"))
is_fixed = bool(input("是否固定比例(true/false):"))
generator = PasswordGenerator(pass_len)
gen_password = ''
if is_fixed:
gen_password =generator.fixed_proportion_generate()
else:
gen_password = generator.random_generate()
print(gen_password)
最終的な効果は以下の通りです。
# 固定比例
>>>请输入密码长度:12
>>>是否固定比例(true/false):true
>>>1HT&6$Fox1B4
# 非固定比例
>>>请输入密码长度:10
>>>是否固定比例(true/false):false
>>>k03$aOM$z5
皆さんもぜひ交流にご注目ください