Cheat Sheet: Como Gerar Senhas Fortes e Seguras em Python com o Módulo

 


Cheat Sheet: Como Gerar Senhas Fortes e Seguras em Python com o Módulo

Este snippet demonstra como gerar senhas fortes e aleatórias utilizando a biblioteca nativa secrets do Python. Ela é recomendada para uso criptográfico, garantindo que os caracteres gerados sejam imprevisíveis e adequados para autenticação e segurança de dados.

Python
import string
import secrets


def gerar_senha(comprimento: int = 16) -> str:
    """Gera uma senha aleatória segura contendo letras, dígitos e símbolos."""
    if comprimento < 8:
        raise ValueError("A senha deve ter pelo menos 8 caracteres para ser segura.")

    # Conjunto completo de caracteres (letras maiúsculas, minúsculas, dígitos e pontuações)
    alfabeto = string.ascii_letters + string.digits + string.punctuation

    # Garante a presença de pelo menos um caractere de cada categoria essencial
    senha = [
        secrets.choice(string.ascii_lowercase),
        secrets.choice(string.ascii_uppercase),
        secrets.choice(string.digits),
        secrets.choice(string.punctuation),
    ]

    # Preenche o restante do comprimento desejado com escolhas criptograficamente seguras
    senha += [secrets.choice(alfabeto) for _ in range(comprimento - 4)]

    # Embaralha a lista para que os caracteres fixos não fiquem sempre na mesma posição inicial
    # Nota: secrets não possui 'shuffle', portanto usamos SystemRandom() para manter a segurança
    secrets.SystemRandom().shuffle(senha)

    return "".join(senha)


# Exemplo de uso prático
if __name__ == "__main__":
    senha_gerada = gerar_senha(16)
    print(f"Senha gerada: {senha_gerada}")

Pontos-chave

  • Uso do módulo secrets vs random: O módulo secrets utiliza fontes de entropia do sistema operacional (como /dev/urandom), tornando as senhas adequadas para uso em segurança, diferente do módulo random, que é pseudoaleatório e previsível.

  • Tabela ASCII e módulo string: As constantes string.ascii_letters, string.digits e string.punctuation fornecem diretamente as faixas de caracteres ASCII necessárias sem a necessidade de conversão manual de códigos numéricos com chr().

  • Garantia de complexidade: O código adiciona explicitamente ao menos um caractere de cada classe (maiúscula, minúscula, número e símbolo) antes de preencher o restante da string.

  • Embaralhamento seguro: O uso de secrets.SystemRandom().shuffle() garante que a distribuição dos caracteres seja uniformemente aleatória sem fragilizar a segurança da sequência.

Comentários

Postagens mais visitadas deste blog

Gerando Relatórios em PDF com Python (ReportLab e FPDF)

Python para Computação Quântica: Introdução com Qiskit

C# e Banco de Dados: Como Conectar e Realizar Operações com SQL Server