使用Fernet/os.uradom密钥生成密码

2024-05-13 00:11:33 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我做了一个密码生成器

char = random.choice(string.punctuation)
numb = str(random.randrange(0, 10))
upper = random.choice(string.ascii_uppercase)
lower1 = random.choice(string.ascii_lowercase)
lower2 = random.choice(string.ascii_lowercase)
lower3 = random.choice(string.ascii_lowercase)
lower4 = random.choice(string.ascii_lowercase)
lower5 = random.choice(string.ascii_lowercase)
lower6 = random.choice(string.ascii_lowercase)
lower7 = random.choice(string.ascii_lowercase)
print("Your randomly generated password is:",
char + numb + upper + lower1 + lower2 + lower3 + lower4 + lower5 + lower6 +lower7)

然后我陷入了一个密码学的虫洞,我安装了这个库,并利用fernet创建了一个加密密钥

修补了几个小时后,我碰上了一堵墙

我想使用fern给我的加密随机字节来构建密码,但密码有44个字符长,有时不包括大写字母/符号等

我试过了:

p = os.random(4) 

这解决了长度问题,但有时仍会吐出无法使用的密码

如何使用os.urandom构建可行的12char密码

(1个大写字母,1个小写字母,1个符号,1个数字)


Tags: 密码stringasciirandomupperchoicecharlowercase
2条回答

我想您应该特别使用os.urandom来构建具有特定规范的密码,这些规范至少是一个上限、一个下限、一个数字和一个符号

import os

alphabet = 'qwertyuioplkjhgfdaszxcvbnmQAZWSXEDCRFVTGBYHNUJMIKLOP0123456789!@#$%^&*()'
upper = 'QAZWSXEDCRFVTGBYHNUJMIKLOP'
lower = 'qwertyuioplkjhgfdaszxcvbnm'
numbers = '0123456789'
symbols = '!@#$%^&*()'

length = len(alphabet)
password = ''
password_length = 10
for x in range(password_length):
    password += alphabet[int.from_bytes(os.urandom(1), byteorder="big") % length]

flags = []
for x in upper:
    if x in password:
        flags.append(1)
        break

for x in lower:
    if x in password:
        flags.append(1)
        break

for x in numbers:
    if x in password:
        flags.append(1)
        break

for x in symbols:
    if x in password:
        flags.append(1)
        break

if len(flags) == 4:
    print("your password is ready: ", password)

由于密码首先是随机生成的,然后检查它是否符合某些标准,有时测试将失败,特别是如果密码长度较短,则必须再次运行该程序

多亏了那些给我想法的人,我自己找到了答案

虽然我无法找到将Fernet字节数据直接转换为密码的方法,但我对密码学做了更深入的研究,了解了什么是真正随机的还是伪随机的

下面的代码是我为将来遇到与我相同问题的人确定的

它的作用:

  • 接受用户的输入
  • 检查输入是否为整数
  • 然后将数字向下舍入到可被4整除的最近整数
  • 最后,它按顺序生成一个上/下/数字/标点符号

这是一个有趣的项目,我一定会很快重新审视它,使它更简单、更有效,如果你有任何想法,请不要不好意思给我留言

    # Cryptographically generated random password
    
    import random
    import string

    # Start Passgen

    print("Please input a max-character limit for required password")
    size = input()
    try:
        val = int(size)
    except ValueError:
        print("That's not an int!")

    else:
        print("Input accepted, Now generating password...")

    # Generate the Password
    def pass_gen():

        uletters = string.ascii_uppercase
        lletters = string.ascii_lowercase
        digits = string.digits
        punctuation = string.punctuation
        chars = (uletters, lletters, digits, punctuation)
        p = ''

        for i in range(int(size)//4):

    p += ''.join(random.SystemRandom().choices(uletters, k=1))
    p += ''.join(random.SystemRandom().choices(lletters, k=1))
    p += ''.join(random.SystemRandom().choices(digits, k=1))
    p += ''.join(random.SystemRandom().choices(punctuation, k=1))
        print("Your randomly generated password is: " + p)

        #Run the function
        pass_gen()

相关问题 更多 >