top of page
Foto do escritorMarcos Costa

Projeto: gerador de senhas

Ou: um script simples para aumentar sua segurança online.



Que segurarança digital é um tema importante, isso ninguém duvida. Estamos imersos em um mundo digital onde todos os nossos dados estão armazenados em servidores e banco de dados que estão fora do nosso controle e sobre os quais nossa principal barreira de segurança é uma combinação de email/login e senha, sendo o primeiro público (ou semi público) e o segundo nossa defesa verdadeira contra roubo de dados, invasão de privacidade e muito mais.


Ainda assim, segundo a empresa NordPass, as senhas mais usadas no mundo em 2021 são também algumas das mais inseguras. Entre essas senhas, o top 10 ficou:

Posição em 2021

Senha

Número de detecções

1

123456

1003925

2

123456789

326815

3

12345

154075

4

qwerty

143513

5

password

106217

6

12345678

103500

7

111111

85937

8

123123

85158

9

1234567890

62649

10

1234567

54441

E mais do que isso, essa empresa vem monitorando esse tipo de conteúdo pelos últimos anos, e a pior parte é que essas senhas vem se mantendo como um constante desde 2017:

Senha

2017

2018

2019

2020

2021

1

123456

123456

12345

123456

123456

2

password

password

123456

123456789

123456789

3

12345678

123456789

123456789

picture1

12345

4

qwerty

12345678

test1

password

qwerty

5

12345

12345

password

12345678

password

Ou seja, não só essas senhas são fáceis de serem descobertas por qualquer sistema de invasão como certamente serão as primeiras a serem testadas. Por isso é vital usar senhas fortes, que combinem números, letras minúsculas, maiúsculas e símbolos diversos. Sim, parece complicado, mas te garanto que será só no começo, até você decorar a senha. Além disso, é muito mais fácil passar por isso do que correr o risco de ter suas redes sociais, emails e contas em bancos invadidas.


Pensando nesse problema, eu criei um programa super simples em Python para geração de senhas aleatórias que levam essas características em consideração. Então vamos a ele!


 

Vamos analisar o scipt passo a passo:


import random

minusculas = 'abcdefghijklmnopqrstuvwxyz'
maiusculas = minusculas.upper()
numeros = '0123456789'
simbolos = '!@#$%&*()_{}[]<>\/?'

caracteres = minusculas + maiusculas + numeros + simbolos

A primeira parte do nosso código cria um grande array com todos os caracteres possíveis. A lista das letras maiusculas é simplesmente definida pela lista das letras minúsculas com a função upper(), que retorna uma string com todos os caracteres em caixa alta. Poderíamos aqui ter feito o posto, definindo a lista com os caracteres maiúsculos e daí definir os minúsculos chamando a função lower(). Os símbolos aqui podem gerar um problema, uma vez que cada sistema coloca suas limitações próprias no que é aceito ou não. De todo modo, basta editar essa linha ou a próxima dependendo da necessidade. Por fim, a última linha junta todas as strings em uma só, gerando assim uma "palavra" com todos os caracteres que serão sorteados. Lembrando que, em Python, quando você soma duas strings o resultado é a concatenação das mesmas. Ou seja, no exemplo abaixo:



primeira_palavra = 'Jornada'
segunda_palavra = ' '
terceira_palavra = 'data science'
resultado = primeira_palavra + segunda_palavra + terceira_palavra
print(resultado)

o resultado será 'Jornada data science'.


A próxima parte pergunta ao usuário quantos caracteres ele quer que tenha em sua senha. Esse ponto é importante pois, mais uma vez, cada sistema online tem sua limitação de caracteres mínimos e máximos.


tamanho = int(input('Qual o tamanho da senha desejada? '))

Seguimos com uma linha que definirá que o primeiro caractere da nossa senha será, necessariamente, uma letra minúscula.


senha = []
senha.append(random.choice(minusculas))

Essa etapa também pode ser alterada ou removida, caso queira.


Em seguinda temos a etapa onde efetivamente serão sorteados os caracteres que formarão nossa senha. Esse processo ocorrerá acrescentando caracteres selecionados aleatoriamente da nossa variável 'caracteres' e adicionando como elementos no nosso array 'senha' (que já tem uma letra minúscula). Aqui temos um laço que se repetirá enquanto o tamanho total do array 'senha' for menor que o tamanho escolhido pelo usuário.


while len(senha) < tamanho:
    senha.append(random.choice(caracteres))

Ao final desse processo temos um array, uma estrutura que ainda não é o que queremos. O último passo será converter esse array em uma palavra. Para isso temos:



senha_final = ''.join([str(item) for item in senha])
print(senha_final)

Aqui usamos uma série de passos em uma só linha. Vamos entender aos poucos:


O comando "for item in senha" irá percorrer o array 'senha' e pegar cada elemento dele de modo independente, armazenando em uma nova variavel provisória chamada 'item'. Após isso, em 'str(item)' cada palavra armazenada em 'item' será convertida para uma string. Então esse comando dentro dos parênteses do join faz isso: percorre o array, captura cada item lá dentro, converte em uma string e externaliza.

Por fim, o comando " ''.join() " tem por função agrupar os itens dentro do parênteses em uma só string. As aspas simples vazias no começo definem qual será o separador entre as palavras. Ao não colocar nada, geramos um conjunto unificado. Recomendo que você faça alguns testes nesse comando, trocando algumas coisas para ver o resultado final e entender melhor esse processo.

E a última linha imprime o resultado final. Sem segredos. O resultado final se parece com algo assim (para um número de caracteres igual a 10):


pQly1Wl4LZ

vU(mQtN!A@

xXb#g?P$9!


Parece complicado e difícil de decorar? Sim. Mas lembre-se que você pode pegar esse resultado final e fazer alterações a vontade, além de alterar o código para retirar símbolos ou números, por exemplo. Agora é com você.


E só para ter uma quantificação da segurança, usarei o site Security.org para comparar o tempo que seria necessário para um programa de força bruta quebrar algumas senhas:


password: 2 minutos

qwertyuiop: 2 minutos. A senha qwerty não é sequer considerada.

Todas as combinações de números sequenciais: não são sequer considerados. Por estar na lista dos mais usados, o computador sequer precisaria de força bruta propriamente dita.

mypassword: 58 minutos.


pQly1Wl4LZ: 7 meses

vU(mQtN!A@: 1 ano

xXb#g?P$9!: 52 anos


 

Espero que esse pequeno tutorial tenha te ajudado ou pelo menos te convencido a alterar sua senha. Nos vemos na próxima!


P.S.: esse código e todos os outros tratados nesse blog estão disponíveis gratuitamente no meu GitHub. Basta acessar, baixar e usar a vontade.

27 visualizações0 comentário

Posts recentes

Ver tudo

Comments


Post: Blog2_Post
bottom of page