Haszowanie hasła

Feb 08 2023
Powierzchnia ataku haseł
Niektóre z najbardziej niszczycielskich ataków na cyberbezpieczeństwo wynikają z naruszenia haseł, które są źle przechowywane w bazach danych po stronie serwera. Problem może zacząć się od użytkownika, który może być skłonny do ustawienia podstawowego i łatwego do zapamiętania hasła.
Zdjęcie Michała Dziedzica na Unsplash

Niektóre z najbardziej niszczycielskich ataków na cyberbezpieczeństwo wynikają z naruszenia haseł, które są źle przechowywane w bazach danych po stronie serwera.

Problem może zacząć się od użytkownika, który może być skłonny do ustawienia podstawowego i łatwego do zapamiętania hasła. Stwarza to ryzyko, ponieważ osoby atakujące mogą je łatwo odgadnąć, jeśli mają kontekstowe zrozumienie danej osoby, takie jak imiona zwierząt domowych lub krewnych.

Nawet jeśli wybrane zostanie bardziej skomplikowane hasło, oprogramowanie do łamania haseł może wywołać atak siłowy, w wyniku którego wiele haseł zostanie wypróbowanych aż do sukcesu.

Kolejnym wektorem ataku jest uzyskanie dostępu do bazy danych przechowującej dane uwierzytelniające. W koszmarnym scenariuszu CISO, gdyby osoba atakująca uzyskała dostęp do bazy danych niezaszyfrowanych haseł w postaci zwykłego tekstu, tysiące kont użytkowników mogłoby zostać natychmiast przejętych. Niestety zdarzało się to zbyt często – dotykając zarówno małe, jak i duże organizacje.

Nie bój się, te denerwujące perspektywy mogą być ograniczone przez coś, co nazywa się mieszaniem haseł!

Zdjęcie autorstwa Markusa Spiske na Unsplash

Definiowanie haszowania

Hashowanie to kryptograficzna technika algorytmiczna, która pobiera zwykły tekst, uruchamia skomplikowaną funkcję haszującą i generuje zaszyfrowany tekst. Kluczem do tego procesu jest funkcja, ale nie wszystkie są równie odpowiednie, aby zapobiec pękaniu.

Wszystkie funkcje muszą spełniać dwie kluczowe właściwości, aby spełnić kryteria OWASP (The Open Source Web Application Security Project):

Trudno jest utworzyć początkowe dane wejściowe, które odpowiadałyby konkretnemu pożądanemu wynikowi.

Aby zilustrować tę cechę, skrót „Hasła” wygenerowany przez popularny algorytm kryptograficzny sha256 to:

e7cf3ef4f17c3999a94f2c6f612e8a888e5b1026878e4e19398b23bd38ec221a

A skrót „hasła” to:

5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8

Jak widać, wystarczy zmienić wielkość liter jednej litery danych wejściowych, aby uzyskać znacząco różne dane wyjściowe, co oznacza, że ​​wyników nie można łatwo określić na podstawie danych wejściowych.

Wytworzenie skrótu jest praktyczne, ale praktycznie niemożliwe jest ponowne wygenerowanie danych wejściowych, jeśli znana jest tylko wartość skrótu.

W przeciwieństwie do szyfrowania, w którym hasło w postaci zwykłego tekstu jest konwertowane na zaszyfrowany tekst przed odszyfrowaniem z powrotem do zwykłego tekstu, haszowanie jest jedną z funkcji. Ponieważ mieszanie hasła jest deterministyczne, to samo wejście zawsze daje ten sam wynik.

Przypadek użycia polega na tym, że użytkownik tworzy hasło, które można zaszyfrować, a następnie dane wyjściowe są przechowywane w bazie danych. Gdy użytkownik ponownie spróbuje podać swoje hasło, jest ono ponownie haszowane, a następnie weryfikowane względem skrótu w bazie danych. Jeśli atakujący uzyska dostęp do bazy danych skrótów, jest to w dużej mierze bezużyteczne, ponieważ haseł nie można przekonwertować z powrotem na zwykły tekst.

Spróbuj uruchomić ten skrypt Pythona, aby zobaczyć prostą wersję tej koncepcji :

# 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

Hashe nie są oczywiście rozwiązaniem typu „wszystko w jednym”, które zapobiega naruszeniu haseł. Na przykład osoby atakujące mogą tworzyć listy typowych haseł i odpowiadających im skrótów. Jeśli na liście znajdują się jakiekolwiek skróty w bazie danych, osoba atakująca zna hasło w postaci zwykłego tekstu. Ale nie powinno to stanowić problemu, jeśli hasła w postaci zwykłego tekstu są tworzone z wystarczającą złożonością. Ponadto aplikacja, która przetwarza hasła w postaci zwykłego tekstu w celu tworzenia skrótów, może zostać przechwycona.

Haszowanie haseł to świetny krok we właściwym kierunku! Mamy nadzieję, że podobał Ci się ten artykuł :-)