Hash de senha

Feb 08 2023
A superfície de ataque das senhas
Alguns dos ataques de segurança cibernética mais devastadores surgem de violações de senhas, que são mal armazenadas em bancos de dados do lado do servidor. O problema pode começar com o usuário, que pode estar inclinado a definir uma senha básica e memorável.
Foto de Michael Dziedzic no Unsplash

Alguns dos ataques de segurança cibernética mais devastadores surgem de violações de senhas, que são mal armazenadas em bancos de dados do lado do servidor.

O problema pode começar com o usuário, que pode estar inclinado a definir uma senha básica e memorável. Isso produz um risco, pois pode ser facilmente adivinhado pelos invasores se eles tiverem uma compreensão contextual do indivíduo, como nomes de animais de estimação ou parentes.

Mesmo quando uma senha mais complicada é escolhida, o software cracker de senha pode desencadear um ataque de força bruta, resultando em um grande número de senhas testadas até o sucesso.

Outro vetor de ataque é obter acesso ao banco de dados que armazena as credenciais. No cenário de pesadelo de um CISO, se um invasor obtivesse acesso a um banco de dados de senhas de texto simples não criptografadas, milhares de contas de usuário poderiam ser imediatamente comprometidas. Infelizmente, isso ocorreu com muita frequência - afetando organizações pequenas e grandes.

Não tema, essas perspectivas estressantes podem ser limitadas por algo chamado hashing de senha!

Foto de Markus Spiske no Unsplash

Definindo hash

O hashing de senha é uma técnica algorítmica criptográfica que usa texto simples, executa uma função hash complicada e produz texto hash. A chave para este processo é a função, mas nem todos são igualmente adequados para evitar rachaduras.

Todas as funções devem satisfazer duas propriedades principais para atender aos critérios do OWASP (The Open Source Web Application Security Project):

É difícil criar uma entrada inicial que corresponda a uma saída específica desejada.

Para ilustrar esta característica, o hash de 'Senha' gerado através do popular algoritmo criptográfico sha256, é:

e7cf3ef4f17c3999a94f2c6f612e8a888e5b1026878e4e19398b23bd38ec221a

E o hash de 'senha' é:

5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8

Como você pode ver, apenas alterando a capitalização de uma letra da entrada, uma saída significativamente diferente é produzida, o que significa que as saídas não podem ser facilmente determinadas a partir das entradas.

É prático produzir o hash, mas praticamente impossível gerar novamente a entrada se apenas o valor do hash for conhecido.

Ao contrário da criptografia, em que uma senha de texto simples é convertida em texto criptografado antes de ser descriptografada novamente em texto simples, o hash é uma maneira de funcionar. Como o hash de senha é determinístico, a mesma entrada sempre produz a mesma saída.

O caso de uso disso é quando um usuário cria uma senha, ela pode ser hash e a saída é armazenada em um banco de dados. Quando o usuário tenta sua senha novamente, ela é novamente hash e, em seguida, verificada em relação ao hash no banco de dados. Se um invasor obtiver acesso ao banco de dados de hash, isso será praticamente inútil, pois as senhas não podem ser convertidas de volta em texto sem formatação.

Tente executar este script Python para ver uma versão simples deste conceito :

# this and other fun scripts can be found at: https://github.com/Jay-Gokani

# install sha256 library for hashing
from hashlib import sha256

# demo explanation
print ('Hello, this demo will ask for a plaintext password, hash it and will verify the hash for access requests')

# first hash stored as a variable
hash1 = (sha256(input('What phony password would you like to set? ').encode('utf-8'))).hexdigest()
print('The hash of your plaintext password is:', hash1)

# password hash stored confirmation
print ('Your password hash has been successfully stored.')

# promt the user for password re-entry, hash and store as another variable
hash2 = (sha256(input('I will test your hash. Please type your password: ').encode('utf-8'))).hexdigest()
print('The hash of your plaintext password is:', hash2)

# access approval or deny check
while True:
    if hash1 == hash2:
        print('Success - password hash matches.')
        break
    else:
        print('The password hash does not match. Please run the programme again.')
        break

É claro que os hashes não são uma solução completa para evitar senhas comprometidas. Por exemplo, os invasores podem produzir listas de senhas comuns e seus hashes correspondentes. Se algum hashe no banco de dados estiver na lista, o invasor saberá a senha em texto sem formatação. Mas isso não deve ser um problema se as senhas de texto simples forem criadas com complexidade suficiente. Além disso, o aplicativo que ingere senhas de texto simples para produzir hashes pode ser interceptado.

O hash da senha é um grande passo na direção certa! Esperamos que tenha gostado deste artigo :-)