python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python生成高强度10位密码

Python如何生成一个高强度的10位密码

作者:檀越@新空间

这篇文章主要为大家详细介绍了使用Python如何生成一个高强度的10位密码,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

为什么密码强度如此重要

根据 Verizon《2023 年数据泄露调查报告》,超过 80%的网络攻击与弱密码或被盗凭证有关。黑客使用各种技术破解密码,包括暴力攻击(尝试所有可能的组合)、字典攻击(使用常见单词和短语)以及社会工程学(获取个人信息来猜测密码)。

一个 10 位密码看起来可能不长,但如果正确组合字符类型,其安全性可能远超一个 20 位的简单短语。计算一下:如果密码只使用小写字母(26 个字符),10 位密码的可能组合是 26¹⁰(约 141 万亿种可能)。但如果结合大写字母、数字和特殊字符(总共 72 个字符),可能组合达到 72¹⁰(约 3.7×10¹⁸ 种可能),安全性提高了数百万倍。

密码生成的核心原则

1. 字符多样性是关键

一个强密码应当包含四种字符类型:

每种字符类型的加入都显著增加了密码的熵值(随机性度量)。例如,仅添加数字将使字符集从 26 个增加到 36 个,而添加大写字母和特殊字符后,字符集可达到 72 个或更多。

2. 强制每种类型至少出现一次

许多用户在创建密码时会忽略某些字符类型,特别是特殊字符。这就是为什么强密码生成规则必须强制每种类型至少出现一次。这种做法确保了即使密码长度有限,也能保持较高的复杂性。

3. 真正的随机性

人类不擅长创造真正的随机序列。我们倾向于选择有意义的模式、重复序列或可预测的替换(如用"@“代替"a”)。因此,密码应当由计算机算法随机生成,而不是由人类创造。

密码生成算法详解

以下 Python 代码实现了一个符合所有安全要求的密码生成器:

import random

def generate_password():
    # 定义字符集
    uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    lowercase = 'abcdefghijklmnopqrstuvwxyz'
    digits = '0123456789'
    special = '!@#$%^&*'

    # 每种类型至少选1个
    password = [
        random.choice(uppercase),
        random.choice(lowercase),
        random.choice(digits),
        random.choice(special)
    ]

    # 剩余6位从所有字符中随机选
    all_chars = uppercase + lowercase + digits + special
    password += random.choices(all_chars, k=6)

    # 打乱顺序避免模式识别
    random.shuffle(password)
    return ''.join(password)

密码安全的最佳实践

生成强密码只是第一步,正确管理密码同样重要:

1. 使用密码管理器

记住多个复杂密码几乎是不可能的任务。密码管理器(如 LastPass、1Password 或 Bitwarden)可以安全地存储和管理所有密码,您只需要记住一个主密码。

2. 启用双因素认证(2FA)

即使密码被破解,双因素认证也能提供额外保护。它要求除了密码外,还需要第二种验证形式(如手机上的验证码)。

3. 定期更换密码

尽管对于强密码来说,定期更换的必要性有所降低,但对于高安全需求的账户,每 3-6 个月更换一次密码仍是明智之举。

4. 不同账户使用不同密码

重复使用密码是常见但危险的做法。如果一个服务的密码泄露,攻击者可能会尝试用同一密码访问您的其他账户。

常见误区与解答

误区 1:密码越长越好

虽然长度确实增加安全性,但复杂性同样重要。一个 10 位的复杂密码可能比一个 15 位的简单密码更安全。

误区 2:特殊字符越多越好

平衡是关键。过多特殊字符可能使密码难以记忆(如果需要手动输入),并可能触发某些系统的错误。

误区 3:频繁更换密码总是好的

过于频繁更换密码可能导致用户选择较弱密码或采用可预测的模式。对于强密码,较长的更换周期可能更实用。

方法补充

方法一:python生成高强度密码

#以下secrets、string、os、datetime,需要安装,安装步骤省略。
import secrets
import string
import os
import datetime
# 获取时间
dt = datetime.datetime.now()
t = str(dt.year) + '年' + str(dt.month) + '月' + str(dt.day) + '日'
# t 就是把年月日拼接起来
print()
# 输入密码的重复数,默认是两个字母,两个数字,两个特殊符号,重复3次,案例 重复三次aa11..aa11..aa11..  ,重复1次 aa11..
ABC = input("字母大小写个数:")
digit = input("数字个数:")
Ss = input("特殊符号个数:")
Repetitions0 = input("重复次数:")
if Repetitions0 == "":
    print("重复次数默认为3")
else:
    Repetitions = int(Repetitions0)+1
 
 
# 默认值可修改
if ABC == "":
    ABC = 2
if digit == "":
    digit = 2
if Ss == "":
    Ss = 2
if Repetitions0 == "":
    Repetitions = 3
    Repetitions = int(Repetitions)+1
 
 
# 控制获取字母,数字,特殊符号,随机个数
def a(s1, s2, s3):
    a1 = ''.join(secrets.choice(string.ascii_letters) for i1 in range(int(s1)))
    a2 = ''.join(secrets.choice(string.digits) for i2 in range(int(s2)))
    a3 = ''.join(secrets.choice(string.punctuation) for i3 in range(int(s3)))
    a4 = a1 + a2 + a3
    return a4
 
 
# 控制重复获取随机密码
b = []
for i in range(1, int(Repetitions)):
    if i == int(Repetitions):
        break
    else:
        b.append(a(ABC, digit, Ss))
print('共' + str(len(''.join(b))) + '位', '密码:' + ''.join(b))
 
# 获取当前路径,生成一个密码本.txt,保存密码
current_path = os.getcwd()
print(current_path)
with open(f'{current_path}/密码本.txt', 'a') as f:
    print(f"{t}", file=f)
with open(f'{current_path}/密码本.txt', 'a') as f:
    print(f"共{str(len(''.join(b)))}位,密码:-----{''.join(b)}-----", file=f)

方法二:使用Python生成四种字符组合的复杂随机密码

使用Python的random和string库生成大写字母、小写字母、数字、特殊字符(14个)这四种字符组合的复杂度较高的随机密码。精选特殊字符,兼容性好。

# conding: utf-8
import random
import string
import logging

logging.basicConfig(level=logging.INFO)

def new_password(password_length=10) -> string:
    """
    生成指定长度(8到32位)的随机密码,默认10位。
    """
    if password_length < 8:
        logging.warning("警告:密码长度不能小于8,输入的密码长度为:{}".format(password_length))
        password_length = 8
    if password_length > 32:
        logging.warning("警告:密码长度不能大于32,输入的密码长度为:{}".format(password_length))
        password_length = 32
    
    special_chars = "!@#$%^&*()_+-="
    
    special_chars_num = random.randint(1, 2)
    digits_num = random.randint(1, 3)
    upper_chars_num = (password_length - special_chars_num - digits_num) // 2
    lower_chars_num = (password_length - special_chars_num  - digits_num - upper_chars_num)

    password_chars = random.sample(special_chars, special_chars_num) + \
                    random.sample(string.digits, digits_num) + \
                    random.sample(string.ascii_uppercase, upper_chars_num) + \
                    random.sample(string.ascii_lowercase, lower_chars_num)

    password = ''.join(random.sample(password_chars, password_length))
    return password

print(new_password())

到此这篇关于Python如何生成一个高强度的10位密码的文章就介绍到这了,更多相关Python生成高强度10位密码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文