Podstawowa różnica między algorytmami mieszania i szyfrowania

509

Widzę wiele zamieszania między skrótami a algorytmami szyfrującymi i chciałbym usłyszeć porady ekspertów na temat:

  1. Kiedy używać skrótów zamiast szyfrowania

  2. Co odróżnia algorytm mieszania lub szyfrowania (od poziomu teoretycznego / matematycznego), tj. Co sprawia, że ​​skróty są nieodwracalne (bez pomocy drzewa tęczy)

Oto kilka podobnych pytań SO, które nie były tak szczegółowe, jak szukałem:

Jaka jest różnica między zaciemnianiem, haszowaniem i szyfrowaniem?
Różnica między szyfrowaniem a mieszaniem

Kenny Cason
źródło
28
Mogę przewidzieć, że jest to pytanie skierowane do ludzi, gdy mylą warunki. :)
Adam Paynter,
18
haszowanie jest jednokierunkowe (nie można go przywrócić), szyfrowanie jest dwukierunkowe (można je odszyfrować)
bestsss
Skróty są również przydatne do indeksowania dużych struktur i obiektów, np. Plików. Zobacz tablicę skrótów .
HABO,
22
Hashing jest jak maszynka do mięsa. Możesz zmienić krowę w hamburgera, ale nie odwrotnie.
Neil McGuigan
Zauważyłem, że moje pytanie zostało zredagowane. Zawsze znałem różnice między nimi na najwyższym poziomie, ale byłem bardziej ciekawy różnic niskiego poziomu / matematyki. :) Tak czy inaczej, dużo dobrej zawartości dla SO! Wielkie dzięki!
Kenny Cason,

Odpowiedzi:

738

Cóż, możesz to sprawdzić w Wikipedii ... Ale ponieważ chcesz wyjaśnienia, zrobię co w mojej mocy:

Funkcje skrótu

Zapewniają odwzorowanie między danymi wejściowymi o dowolnej długości i danymi wyjściowymi (zwykle) o stałej długości (lub o mniejszej długości). Może to być wszystko, od prostego crc32, po pełnoprawną kryptograficzną funkcję skrótu, taką jak MD5 lub SHA1 / 2/256/512. Chodzi o to, że trwa mapowanie w jedną stronę. Zawsze jest to odwzorowanie wiele: 1 (co oznacza, że ​​zawsze będą kolizje), ponieważ każda funkcja generuje mniejszą moc wyjściową niż jest w stanie wprowadzić (jeśli podasz każdy możliwy plik 1 MB do MD5, dostaniesz mnóstwo kolizji).

Powodem, dla którego są trudne (lub niemożliwe w praktyce) do odwrócenia, jest sposób, w jaki działają wewnętrznie. Większość kryptograficznych funkcji skrótu iteruje wielokrotnie zestaw danych wejściowych w celu uzyskania wyniku. Jeśli więc przyjrzymy się każdemu fragmentowi wejścia o stałej długości (który jest zależny od algorytmu), funkcja skrótu wywoła ten stan. Następnie iteruje stan i zmienia go na nowy i wykorzystuje jako informację zwrotną w sobie (MD5 robi to 64 razy dla każdego 512-bitowego fragmentu danych). Następnie w jakiś sposób łączy wynikowe stany ze wszystkich tych iteracji z powrotem, tworząc wynikowy skrót.

Teraz, jeśli chcesz zdekodować skrót, najpierw musisz dowiedzieć się, jak podzielić dany skrót na jego iterowane stany (1 możliwość dla danych wejściowych mniejszych niż wielkość fragmentu danych, wiele dla większych danych wejściowych). Następnie musisz odwrócić iterację dla każdego stanu. Teraz, aby wyjaśnić, dlaczego jest to bardzo trudne, wyobraź sobie, próbując wydedukować ai bze wzoru: 10 = a + b. Istnieje 10 pozytywnych kombinacji ai bktóre mogą działać. Teraz kilka razy zapętlić:tmp = a + b; a = b; b = tmp. W przypadku 64 iteracji masz ponad 10 ^ 64 możliwości wypróbowania. A to tylko prosty dodatek, w którym pewien stan jest zachowany od iteracji do iteracji. Rzeczywiste funkcje skrótu wykonują znacznie więcej niż 1 operację (MD5 wykonuje około 15 operacji na 4 zmiennych stanu). A ponieważ kolejna iteracja zależy od stanu poprzedniego, a poprzednie jest niszczone podczas tworzenia stanu bieżącego, prawie niemożliwe jest określenie stanu wejściowego, który doprowadził do danego stanu wyjściowego (dla każdej iteracji nie mniej). Połącz to z dużą liczbą możliwych możliwości, a dekodowanie nawet MD5 zajmie prawie nieskończoną (ale nie nieskończoną) ilość zasobów. Tak wiele zasobów, że ”

Funkcje szyfrowania

Zapewniają odwzorowanie 1: 1 między wejściem i wyjściem o dowolnej długości. I zawsze są odwracalne. Ważną rzeczą do zapamiętania jest to, że można ją odwrócić za pomocą jakiejś metody. I to zawsze 1: 1 dla danego klucza. Teraz istnieje wiele danych wejściowych: pary kluczy, które mogą generować takie same dane wyjściowe (w rzeczywistości zwykle są, w zależności od funkcji szyfrowania). Dobre zaszyfrowane dane są nie do odróżnienia od przypadkowego szumu. Różni się to od dobrego wyniku mieszania, który zawsze ma spójny format.

Przypadków użycia

Użyj funkcji skrótu, jeśli chcesz porównać wartość, ale nie możesz zapisać zwykłej reprezentacji (z dowolnej liczby powodów). Hasła powinny bardzo dobrze pasować do tego przypadku użycia, ponieważ nie chcesz przechowywać ich w postaci zwykłego tekstu ze względów bezpieczeństwa (i nie powinno). Ale co, jeśli chcesz sprawdzić system plików pod kątem pirackich plików muzycznych? Przechowywanie 3 MB na plik muzyczny byłoby niepraktyczne. Zamiast tego weź skrót pliku i zapisz go (md5 zapisałby 16 bajtów zamiast 3 MB). W ten sposób po prostu haszujesz każdy plik i porównujesz z przechowywaną bazą danych skrótów (nie działa to tak dobrze w praktyce z powodu ponownego kodowania, zmiany nagłówków plików itp., Ale jest to przykładowy przypadek użycia).

Użyj funkcji skrótu podczas sprawdzania poprawności danych wejściowych. Do tego są przeznaczone. Jeśli masz 2 elementy wejściowe i chcesz sprawdzić, czy są one takie same, uruchom oba za pomocą funkcji skrótu. Prawdopodobieństwo kolizji jest astronomicznie niskie dla małych rozmiarów wejściowych (przy założeniu dobrej funkcji skrótu). Dlatego jest zalecany do haseł. W przypadku haseł o długości do 32 znaków md5 ma 4-krotność przestrzeni wyjściowej. SHA1 ma 6-krotność przestrzeni wyjściowej (w przybliżeniu). SHA512 ma około 16-krotność przestrzeni wyjściowej. Tak naprawdę nie obchodzi, co hasło było , to obchodzi, czy to taki sam jak ten, który został zapisany. Dlatego powinieneś używać skrótów do haseł.

Używaj szyfrowania, gdy chcesz odzyskać dane wejściowe. Zwróć uwagę na potrzebę słowa . Jeśli przechowujesz numery kart kredytowych, w pewnym momencie musisz je odzyskać, ale nie chcesz przechowywać ich jako zwykłego tekstu. Zamiast tego przechowuj zaszyfrowaną wersję i przechowuj klucz tak bezpiecznie, jak to możliwe.

Funkcje skrótu są również świetne do podpisywania danych. Na przykład, jeśli używasz HMAC, podpisujesz kawałek danych, biorąc skrót danych połączonych ze znaną, ale nieprzekazywaną wartością (wartością tajną). Tak więc wysyłasz zwykły tekst i skrót HMAC. Następnie odbiornik po prostu haszy przesłane dane o znanej wartości i sprawdza, czy pasują one do przesłanego HMAC. Jeśli jest tak samo, wiesz, że nie zostało naruszone przez imprezę bez tajnej wartości. Jest to powszechnie stosowane w bezpiecznych systemach plików cookie przez frameworki HTTP, a także w przesyłaniu danych przez HTTP, gdy chcesz mieć pewność integralności danych.

Uwaga na temat skrótów haseł:

Kluczową cechą funkcji skrótu kryptograficznego jest to, że powinny być bardzo szybkie do utworzenia i bardzo trudne / powolne do odwrócenia (tak bardzo, że jest to praktycznie niemożliwe). Stwarza to problem z hasłami. Jeśli przechowujesz sha512(password), nie robisz nic, aby chronić się przed tęczowymi stołami lub atakami brutalnej siły. Pamiętaj, funkcja skrótu została zaprojektowana pod kątem szybkości. Atakujący może więc po prostu uruchomić słownik za pomocą funkcji skrótu i ​​przetestować każdy wynik.

Dodanie soli pomaga mieć znaczenie, ponieważ dodaje do mieszania trochę nieznanych danych. Zamiast więc znaleźć coś pasującego md5(foo), muszą znaleźć coś, co po dodaniu do znanej soli wytwarza md5(foo.salt)(co jest znacznie trudniejsze do zrobienia). Ale nadal nie rozwiązuje problemu prędkości, ponieważ jeśli znają sól, wystarczy przeszukać słownik.

Istnieją więc sposoby radzenia sobie z tym. Jedna popularna metoda nazywa się wzmocnieniem klucza (lub rozciąganiem klucza). Zasadniczo iterujesz wielokrotnie skrót (zwykle tysiące). To robi dwie rzeczy. Po pierwsze, znacznie spowalnia działanie algorytmu mieszającego. Po drugie, jeśli zostanie poprawnie zaimplementowany (przekazanie danych wejściowych i zwrot z powrotem przy każdej iteracji), faktycznie zwiększa entropię (dostępną przestrzeń) dla danych wyjściowych, zmniejszając ryzyko kolizji. Trywialna implementacja to:

var hash = password + salt;
for (var i = 0; i < 5000; i++) {
    hash = sha512(hash + password + salt);
}

Istnieją inne, bardziej standardowe implementacje, takie jak PBKDF2 , BCrypt . Ale z tej techniki korzysta wiele systemów bezpieczeństwa (takich jak PGP, WPA, Apache i OpenSSL).

Podsumowując, hash(password)nie jest wystarczająco dobry. hash(password + salt)jest lepszy, ale wciąż nie jest wystarczająco dobry ... Użyj rozciągniętego mechanizmu skrótu, aby wygenerować skróty hasła ...

Kolejna uwaga na temat trywialnego rozciągania

W żadnym wypadku nie przesyłaj danych wyjściowych jednego skrótu bezpośrednio do funkcji skrótu :

hash = sha512(password + salt); 
for (i = 0; i < 1000; i++) {
    hash = sha512(hash); // <-- Do NOT do this!
}

Powodem tego są kolizje. Pamiętaj, że wszystkie funkcje skrótu mają kolizje, ponieważ możliwa przestrzeń wyjściowa (liczba możliwych wyników) jest mniejsza niż przestrzeń wejściowa. Aby zobaczyć, dlaczego, spójrzmy na to, co się dzieje. Aby to poprzedzić, załóżmy, że istnieje prawdopodobieństwo 0,001% prawdopodobieństwa kolizji sha1()( w rzeczywistości jest znacznie niższe, ale w celach demonstracyjnych).

hash1 = sha1(password + salt);

Teraz hash1prawdopodobieństwo zderzenia wynosi 0,001%. Ale kiedy robimy następne hash2 = sha1(hash1);, wszystkie kolizje hash1automatycznie stają się kolizjamihash2 . Więc teraz mamy stawkę hash1 na 0,001%, a drugie sha1()połączenie do tego dochodzi . Więc teraz hash2prawdopodobieństwo kolizji wynosi 0,002%. To dwa razy więcej szans! Każda iteracja doda kolejną 0.001%szansę na kolizję z wynikiem. Tak więc przy 1000 iteracjach szansa na kolizję skoczyła z trywialnego 0,001% do 1%. Teraz degradacja jest liniowa, a rzeczywiste prawdopodobieństwa są znacznie mniejsze, ale efekt jest taki sam (oszacowanie prawdopodobieństwa pojedynczego zderzenia md5wynosi około 1 / (2 128 ) lub 1 / (3x10 38). Choć wydaje się to małe, dzięki atakowi urodzinowemu nie jest tak małe, jak się wydaje).

Zamiast tego, za każdym razem ponownie dodając sól i hasło, ponownie wprowadzasz dane do funkcji skrótu. Tak więc wszelkie kolizje w danej rundzie nie są już kolizjami w następnej rundzie. Więc:

hash = sha512(password + salt);
for (i = 0; i < 1000; i++) {
    hash = sha512(hash + password + salt);
}

Ma taką samą szansę na kolizję jak sha512funkcja natywna . Właśnie tego chcesz. Użyj tego zamiast tego.

ircmaxell
źródło
30
Szkoda, że ​​programiści z LinkedIn nie przeczytali tego przed zapisaniem haseł jako niesolonych skrótów
Eric J.
2
@Pacerier: kładzie również nacisk na haszowanie. Szczegółowo dotyczy to mieszania haseł ...
ircmaxell,
1
Nie rozumiem, jak to może być mapowanie 1 do 1, jeśli może istnieć wiele kluczy, które dają takie same dane wyjściowe. W przypadku DES długość klucza wynosi 56 bitów, a rozmiary bloków to 64 bity. Czy zatem nie ma 256 różnych kluczy, które można zmapować do tego samego bloku wyjściowego?
mrQWERTY
1
@ Renren29 tak. Masz rację. W praktyce cały szyfr nie jest ani przejmujący, ani wstrzykiwany. Jednak dla danego klucza jest on obraźliwy (każdy zwykły tekst ma dokładnie jeden tekst zaszyfrowany), ale niekoniecznie iniekcyjny (nie każdy możliwy tekst zaszyfrowany ma odwrotne odwzorowanie). Dlatego powiedziałem, że to zawsze 1: 1 dla danego klucza . Gdyby nie było wielu kluczy, które mogłyby wyprowadzać dane do tego samego bloku wyjściowego, szyfr nie byłby przydatny, ponieważ tekst zaszyfrowany powiedziałby ci coś o kluczu (nie wiedząc o tym).
ircmaxell,
7
Świetna odpowiedź. Moją jedyną nitpick jest to, że degradacja trywialnego rozciągania nie może być liniowa, bo w końcu minie 100%. Myślę, że w twoim przykładzie z 0,001% drugim krokiem powinno być 0,001 + (1 - 0,001) * .001 lub 0,001999.
AlexDev
160

Funkcję skrótu można uznać za taką samą, jak pieczenie bochenka chleba. Zaczynasz od nakładów (mąka, woda, drożdże itp.), A po zastosowaniu funkcji mieszania (mieszanie + pieczenie) otrzymujesz wynik: bochenek chleba.

Odwrotna droga jest niezwykle trudna - nie można tak naprawdę podzielić chleba z powrotem na mąkę, wodę, drożdże - niektóre z nich zostały utracone podczas pieczenia i nigdy nie można dokładnie powiedzieć, ile wody, mąki lub drożdży zostało szczególny bochenek, ponieważ ta informacja została zniszczona przez funkcję haszującą (inaczej piekarnik).

Wiele różnych wariantów nakładów teoretycznie wytworzy identyczne bochenki (np. 2 szklanki wody i 1 łyżka stołowa drożdży wytwarzają dokładnie taki sam chleb jak 2,1 szklanki wody i 0,9 łyżki stołowej drożdży), ale biorąc pod uwagę jeden z tych chlebów, nie można powiedzieć dokładnie to, co wyprodukowała kombinacja danych wejściowych.

Z drugiej strony szyfrowanie może być postrzegane jako skrytka depozytowa. Cokolwiek tam umieścisz, wyjdzie na zewnątrz, o ile posiadasz klucz, za pomocą którego był on zamknięty. To operacja symetryczna. Biorąc pod uwagę klucz i pewne dane wejściowe, otrzymujesz określone wyjście. Biorąc pod uwagę ten wynik i ten sam klucz, odzyskasz oryginalne dane wejściowe. To mapowanie 1: 1.

Marc B.
źródło
2
Tyle że nie można łatwo pokazać, że dany hamburger pochodzi w całości od konkretnej krowy, co jest podstawową właściwością skrótu, więc jest to zabawny pomysł, ale straszna analogia.
user467257,
1
@caf lol rzeczywiście i klasyka w tym. Jednak krowa rzadko trafia na rynek, robi to „byk” ;-) Krowa: mleko. Byk: mięso.
Funk Forty Niner
1
Ta historia brzmi bardzo smacznie.
sitilge
44

Używaj skrótów, gdy nie chcesz odzyskać oryginalnego wejścia, użyj szyfrowania, gdy to robisz.

Skróty pobierają trochę danych wejściowych i zamieniają je w niektóre bity (zwykle uważane za liczbę, na przykład 32-bitową liczbę całkowitą, 64-bitową liczbę całkowitą itp.). Te same dane wejściowe zawsze powodują wygenerowanie tego samego skrótu, ale GŁÓWNIE tracisz informacje w tym procesie, więc nie możesz w sposób niezawodny odtworzyć oryginalnych danych wejściowych (jest jednak kilka zastrzeżeń).

Szyfrowanie zasadniczo zachowuje wszystkie informacje, które wprowadzasz do funkcji szyfrowania, po prostu utrudnia (idealnie niemożliwe) powrót do pierwotnych danych wejściowych bez posiadania określonego klucza.

Prosty przykład mieszania

Oto trywialny przykład, który pomoże ci zrozumieć, dlaczego mieszanie nie może (w ogólnym przypadku) odzyskać oryginalnych danych wejściowych. Powiedzmy, że tworzę 1-bitowy skrót. Moja funkcja skrótu przyjmuje na wejściu ciąg bitów i ustawia skrót na 1, jeśli w paśmie wejściowym ustawiono parzystą liczbę bitów, w przeciwnym razie 0, jeśli liczba nieparzysta.

Przykład:

Input    Hash
0010     0
0011     1
0110     1
1000     0

Zauważ, że istnieje wiele wartości wejściowych, które dają skrót 0, a wiele z nich powoduje skrót 1. Jeśli wiesz, że skrót to 0, nie wiesz na pewno, co było oryginalnym wejściem.

Nawiasem mówiąc, ten 1-bitowy skrót nie jest dokładnie wymyślony ... spójrz na bit parzystości .

Prosty przykład szyfrowania

Możesz zaszyfrować tekst za pomocą prostej zamiany liter, powiedz, że jeśli dane wejściowe to A, piszesz B. Jeśli dane wejściowe to B, piszesz C. Do końca alfabetu, gdzie jeśli dane wejściowe to Z, napisz A ponownie.

Input   Encrypted
CAT     DBU
ZOO     APP

Podobnie jak prosty przykład skrótu, ten typ szyfrowania był używany historycznie .

Eric J.
źródło
Warto zauważyć, że „szyfrowanie” potocznie odnosi się do silnego szyfrowania i nie należy go mylić ze słabym szyfrowaniem, takim jak szyfr Cezara w powyższym przykładzie.
Faks
@Faks Tak, ale to, co stanowi silne szyfrowanie, to ruchomy pasek na przestrzeni wieków. Niemiecka maszyna Enigma z II wojny światowej była prawie niemożliwa do złamania (jest o niej świetny film). Dzisiaj twój inteligentny zegarek może z łatwością go złamać. DES był kiedyś uważany za silny, podobnie jak MD5. Dzisiejsze silne szyfrowanie grozi łatwą ofiarą technik obliczeń kwantowych w dającej się przewidzieć przyszłości.
Eric J.,
Na pewno i zawsze warto sprawdzić daty postów i artykułów, które zawierają porady dotyczące kryptografii. Biorąc to pod uwagę, jestem prawie pewien, że szyfr Cezara był uważany za słaby nawet w 2011 r.
Faks
39

Podstawowy przegląd technik mieszania i szyfrowania / deszyfrowania.

Hashowanie:

Jeśli hash dowolny zwykły tekst znowu nie może uzyskać ten sam tekst z tekstem hashed . Po prostu jest to proces jednokierunkowy.

mieszanie


Szyfrowanie i deszyfrowanie:

Jeśli ponownie zaszyfrujesz dowolny zwykły tekst za pomocą klucza, możesz uzyskać ten sam zwykły tekst , odszyfrowując zaszyfrowany tekst za pomocą tego samego klucza (symetrycznego) / innego (asymetrycznego).

szyfrowanie i deszyfrowanie


AKTUALIZACJA: Aby zająć się punktami wymienionymi w edytowanym pytaniu.

1. Kiedy używać skrótów kontra szyfrowanie

Hashowanie jest przydatne, jeśli chcesz wysłać komuś plik. Ale boisz się, że ktoś inny może przechwycić plik i go zmienić. Tak więc odbiorca może upewnić się, że jest to właściwy plik, jeśli opublikujesz publicznie wartość skrótu. W ten sposób odbiorca może obliczyć wartość skrótu otrzymanego pliku i sprawdzić, czy jest ona zgodna z wartością skrótu.

Szyfrowanie jest dobre, jeśli mówisz, że masz do kogoś wiadomość. Zaszyfrujesz wiadomość za pomocą klucza, a odbiorca odszyfruje ten sam (a może nawet inny) klucz, aby odzyskać oryginalną wiadomość. kredyty


2. Co odróżnia algorytm mieszania lub szyfrowania (od poziomu teoretycznego / matematycznego), tj. Co sprawia, że ​​skróty są nieodwracalne (bez pomocy drzewa tęczy)

Zasadniczo haszowanie to operacja, która traci informacje, ale nie szyfruje . Spójrzmy na różnicę w prostym matematycznym sposobie dla naszego łatwego zrozumienia , oczywiście oba mają znacznie bardziej skomplikowaną matematyczną operację z zaangażowanymi w nią powtórzeniami

Szyfrowanie / deszyfrowanie (odwracalne):

Dodawanie :

4 + 3 = 7  

Można to odwrócić, biorąc sumę i odejmując jeden z dodatków

7 - 3 = 4     

Mnożenie :

4 * 5 = 20  

Można to odwrócić, biorąc produkt i dzieląc go przez jeden z czynników

20 / 4 = 5    

Możemy więc założyć, że jednym z dodatków / czynników jest klucz decrpytion, a wynik (7,20) to zaszyfrowany tekst.


Hashowanie (nieodwracalne):

Podział modulo :

22 % 7 = 1   

Nie można tego cofnąć, ponieważ nie można wykonać operacji na ilorazie i dywidendzie w celu odtworzenia dzielnika (lub odwrotnie).

Czy możesz znaleźć operację do wypełnienia gdzie „?” jest?

1  ?  7 = 22  
1  ?  22 = 7

Tak więc funkcje mieszające mają taką samą matematyczną jakość jak podział modulo i tracą informacje.

kredyty

mrsrinivas
źródło
26

Mój jeden linijka ... ogólnie rzecz biorąc, osoba przeprowadzająca wywiad chciała odpowiedzi poniżej.

Hashowanie jest jednym ze sposobów. Nie można uzyskać konwersji danych / łańcucha z kodu skrótu.

Szyfrowanie jest dwukierunkowe - możesz ponownie odszyfrować zaszyfrowany ciąg, jeśli masz przy sobie klucz.

Shiv Mohan
źródło
Hej! To dwie linie.
Mark Storer
17

Funkcja skrótu zamienia tekst o zmiennej wielkości na tekst o stałej wielkości.

Haszysz

Źródło: https://en.wikipedia.org/wiki/Hash_function


Funkcje skrótu w PHP

Hash zamienia ciąg na haszowany. Patrz poniżej.

HASZYSZ:

$str = 'My age is 29';
$hash = hash('sha1', $str);
echo $hash; // OUTPUT: 4d675d9fbefc74a38c89e005f9d776c75d92623e

Hasła są zwykle przechowywane w postaci skrótowej zamiast w postaci czytelnego tekstu. Gdy użytkownik końcowy chce uzyskać dostęp do aplikacji chronionej hasłem, należy podać hasło podczas uwierzytelniania. Gdy użytkownik poda swoje hasło, wtedy prawidłowy system uwierzytelniania otrzymuje hasło i szyfruje to podane hasło. Ten skrót hasła jest porównywany z skrótem znanym przez system. Dostęp jest przyznawany w przypadku równości.

DEHASH:

SHA1 to skrót jednokierunkowy. Co oznacza, że ​​nie można odhashować skrótu.

Możesz jednak użyć siły skrótu. Zobacz: https://hashkiller.co.uk/sha1-decrypter.aspx .

MD5, to kolejny skrót. Dehasher MD5 można znaleźć na tej stronie: https://www.md5online.org/ .

Aby powstrzymać ataki siłowe na skróty, można podać sól. W php możesz użyć password_hash()do utworzenia skrótu hasła. Funkcja password_hash()automatycznie tworzy sól. Aby zweryfikować hasło w skrócie hasła (z użyciem soli), użyj password_verify().

// Invoke this little script 3 times, and it will give you everytime a new hash
$password = '1234';  
$hash = password_hash($password, PASSWORD_DEFAULT);  

echo $hash; 
// OUTPUT 

$2y$10$ADxKiJW/Jn2DZNwpigWZ1ePwQ4il7V0ZB4iPeKj11n.iaDtLrC8bu 

$2y$10$H8jRnHDOMsHFMEZdT4Mk4uI4DCW7/YRKjfdcmV3MiA/WdzEvou71u 

$2y$10$qhyfIT25jpR63vCGvRbEoewACQZXQJ5glttlb01DmR4ota4L25jaW

Jedno hasło może być reprezentowane przez więcej niż jeden skrót. Po zweryfikowaniu hasła przy użyciu różnych skrótów hasła przy użyciu password_verify(), hasło zostanie zaakceptowane jako prawidłowe hasło.

$password = '1234';  

$hash = '$2y$10$ADxKiJW/Jn2DZNwpigWZ1ePwQ4il7V0ZB4iPeKj11n.iaDtLrC8bu';  
var_dump( password_verify($password, $hash) );  

$hash = '$2y$10$H8jRnHDOMsHFMEZdT4Mk4uI4DCW7/YRKjfdcmV3MiA/WdzEvou71u';  
var_dump( password_verify($password, $hash) );  

$hash = '$2y$10$qhyfIT25jpR63vCGvRbEoewACQZXQJ5glttlb01DmR4ota4L25jaW';  
var_dump( password_verify($password, $hash) );

// OUTPUT 

boolean true 

boolean true 

boolean true




Funkcja szyfrowania przekształca tekst w bezsensowny zaszyfrowany tekst za pomocą klucza szyfrowania i odwrotnie. wprowadź opis zdjęcia tutaj

Źródło: https://en.wikipedia.org/wiki/Encryption


Szyfrowanie w PHP

Zanurzmy się w kodzie PHP, który obsługuje szyfrowanie.

--- Rozszerzenie Mcrypt ---

SZYFROWANIE:

$cipher = MCRYPT_RIJNDAEL_128;
$key = 'A_KEY';
$data = 'My age is 29';
$mode = MCRYPT_MODE_ECB;

$encryptedData = mcrypt_encrypt($cipher, $key , $data , $mode);
var_dump($encryptedData);

//OUTPUT:
string '„Ùòyªq³¿ì¼üÀpå' (length=16)

DECRYPT:

$decryptedData = mcrypt_decrypt($cipher, $key , $encryptedData, $mode);
$decryptedData = rtrim($decryptedData, "\0\4"); // Remove the nulls and EOTs at the END
var_dump($decryptedData);

//OUTPUT:
string 'My age is 29' (length=12)

--- Rozszerzenie OpenSSL ---

Rozszerzenie Mcrypt zostało wycofane w wersji 7.1. i usunięty w php 7.2. Rozszerzenie OpenSSL powinno być używane w php 7. Zobacz fragmenty kodu poniżej:

$key = 'A_KEY';
$data = 'My age is 29';

// ENCRYPT
$encryptedData = openssl_encrypt($data , 'AES-128-CBC', $key, 0, 'IV_init_vector01');
var_dump($encryptedData);

// DECRYPT    
$decryptedData = openssl_decrypt($encryptedData, 'AES-128-CBC', $key, 0, 'IV_init_vector01');
var_dump($decryptedData);

//OUTPUT
string '4RJ8+18YkEd7Xk+tAMLz5Q==' (length=24)
string 'My age is 29' (length=12)
juliański
źródło
Zauważ, że PHP mcrypt jest już przestarzałe (mogłem mieć z tym coś wspólnego) i że SHA-1, MD5 i EBC są uważane za niepewne. A_KEYto nie Rijndael-128 klucz AES /; to hasło, a nie klucz.
Maarten Bodewes
@MaartenBodewes Tak, to prawda. OpenSSL to teraz moda. php.net/manual/en/book.openssl.php
Julian
10

Szyfrowanie symetryczne:

Szyfrowanie symetryczne może być również określane jako klucz współdzielony lub wspólne szyfrowanie tajne. W szyfrowaniu symetrycznym pojedynczy klucz służy zarówno do szyfrowania, jak i deszyfrowania ruchu.

wprowadź opis zdjęcia tutaj

Szyfrowanie asymetryczne:

Szyfrowanie asymetryczne jest również znane jako kryptografia klucza publicznego. Szyfrowanie asymetryczne różni się od szyfrowania symetrycznego przede wszystkim tym, że używane są dwa klucze: jeden do szyfrowania, a drugi do deszyfrowania. Najpopularniejszym algorytmem szyfrowania asymetrycznego jest RSA.

W porównaniu z szyfrowaniem symetrycznym szyfrowanie asymetryczne nakłada duże obciążenie obliczeniowe i zwykle jest znacznie wolniejsze. Dlatego zwykle nie jest stosowany do ochrony danych ładunku. Zamiast tego jego główną siłą jest zdolność do ustanowienia bezpiecznego kanału przez niezabezpieczone medium (na przykład Internet). Odbywa się to poprzez wymianę kluczy publicznych, których można używać tylko do szyfrowania danych. Uzupełniający klucz prywatny, który nigdy nie jest współdzielony, służy do odszyfrowywania.

wprowadź opis zdjęcia tutaj

Hashowanie:

Wreszcie, hashowanie jest formą bezpieczeństwa kryptograficznego, które różni się od szyfrowania. Podczas gdy szyfrowanie jest dwuetapowym procesem stosowanym najpierw do zaszyfrowania, a następnie odszyfrowania wiadomości, haszowanie powoduje kondensację wiadomości w nieodwracalną wartość lub skrót. Dwa z najczęstszych algorytmów mieszających spotykane w sieciach to MD5i SHA-1.

wprowadź opis zdjęcia tutaj

Przeczytaj więcej tutaj: http://packetlife.net/blog/2010/nov/23/symmetric-asymmetric-encryption-hashing/

Vahid Farahmandian
źródło
Przepraszam, jestem nowicjuszem w dziedzinie bezpieczeństwa, ale czy możesz bardziej wyjaśnić znaczenie słowa „zwykle stosowany do ochrony danych ładunku”?
Abdul
2
@Abdul Szyfrowanie asymetryczne ma duże obciążenie obliczeniowe, więc nie jest używane do ochrony danych przesyłanych przez sieć jako pakiety (ładunek). Zamiast tego służy do ustanowienia bezpiecznego połączenia sieciowego za pomocą wymiany kluczy publicznych w celu ochrony danych.
Lucky
5
  1. Używaj skrótów, gdy potrzebujesz tylko jednej drogi. Na przykład dla haseł w systemie używasz haszowania, ponieważ zawsze weryfikujesz, czy wartość wprowadzona przez użytkownika po haszowaniu jest zgodna z wartością w repozytorium. Dzięki szyfrowaniu możesz przejść na dwa sposoby.

  2. Algorytmy mieszające i algorytmy szyfrujące są tylko algorytmami matematycznymi. Pod tym względem nie różnią się od siebie - wszystkie są tylko formułami matematycznymi. Jeśli chodzi o semantykę, istnieje bardzo duża różnica między hashowaniem (jednokierunkowym) a szyfrowaniem (dwukierunkowym). Dlaczego skróty są nieodwracalne? Ponieważ są tak zaprojektowane, ponieważ czasami potrzebujesz operacji jednokierunkowej.

hvgotcodes
źródło
4

Algorytmy szyfrowania i mieszania działają w podobny sposób. W każdym przypadku istnieje potrzeba wprowadzenia zamieszania i dyfuzji między bitami. Sprowadzone zamieszanie tworzy złożoną relację między kluczem a tekstem zaszyfrowanym, a dyfuzja rozprzestrzenia informacje o każdym bicie.

Wiele funkcji skrótu faktycznie korzysta z algorytmów szyfrowania (lub prymitywów algorytmów szyfrowania. Na przykład Skein kandydujący na SHA-3 używa Threefish jako podstawowej metody przetwarzania każdego bloku. Różnica polega na tym, że zamiast utrzymywać każdy blok tekstu zaszyfrowanego, są niszczące, deterministycznie połączone ze sobą na ustaloną długość

Justin Morgan
źródło
4

jeśli chodzi o bezpieczeństwo przesyłania danych, tj. dwukierunkowa komunikacja używasz szyfrowania. Wszystkie szyfrowanie wymaga klucza

jeśli chodzi o autoryzację, używasz haszowania. Nie ma klucza w haszowaniu

Hashowanie pobiera dowolną ilość danych (binarną lub tekstową) i tworzy skrót o stałej długości reprezentujący sumę kontrolną dla danych. Na przykład skrót może mieć 16 bajtów. Różne algorytmy mieszające generują skróty o różnych rozmiarach. Oczywiście nie można odtworzyć oryginalnych danych z wartości skrótu, ale można ponownie zaszyfrować dane, aby sprawdzić, czy wygenerowano tę samą wartość skrótu. W ten sposób działają jednokierunkowe hasła oparte na Uniksie. Hasło jest przechowywane jako wartość skrótu, a aby zalogować się do systemu, hasło, które wpisujesz, jest haszowane, a wartość skrótu jest porównywana z skrótem prawdziwego hasła. Jeśli się zgadzają, musisz wpisać poprawne hasło

dlaczego mieszanie jest nieodwracalne:

Hashowanie nie jest odwracalne, ponieważ mapowanie danych wejściowych na hasz nie jest odwrotne od 1 do 1. Posiadanie mapy dwóch wejść do tej samej wartości skrótu jest zwykle nazywane „kolizją skrótu”. Ze względów bezpieczeństwa jedną z właściwości „dobrej” funkcji skrótu jest to, że kolizje występują rzadko w praktyce.

ayush
źródło
1
„Mieszanie nie jest odwracalne, ponieważ mapowanie danych wejściowych na hasz nie jest odwrotne od 1 do 1”. Dzięki, myślę, że jest to bardzo ważny czynnik, jeśli chodzi o odróżnianie skrótów od szyfrowania! :)
Kenny Cason
Nie rozróżnia to wyraźnie zwykłych funkcji skrótu, funkcji skrótu kryptograficznego i skrótów haseł. Wszystkie mają różne właściwości.
Maarten Bodewes
-2

Kryptografia zajmuje się liczbami i łańcuchami. Zasadniczo każda cyfrowa rzecz w całym wszechświecie to liczby. Kiedy mówię liczby, to 0 i 1. Wiesz, co to są, binarne. Obrazy, które widzisz na ekranie, muzyka, którą słuchasz przez słuchawki, wszystko jest dwójkowe. Ale nasze uszy i oczy nie zrozumieją binariów, prawda? Tylko mózg mógł to zrozumieć, a nawet gdyby mógł zrozumieć binaria, nie może cieszyć się binariami. Dlatego konwertujemy pliki binarne na zrozumiałe dla człowieka formaty, takie jak mp3, jpg itp. Nazwijmy ten proces kodowaniem . Jest to proces dwukierunkowy i można go łatwo zdekodować z powrotem do oryginalnej postaci.

Hashowanie

Hashowanie to kolejna technika kryptograficzna, w której danych raz przekonwertowanych na inną formę nigdy nie można odzyskać. W ujęciu laika nie ma procesu zwanego deszyfrowaniem . Istnieje wiele funkcji skrótu do wykonania zadania, takich jak sha-512, md5 i tak dalej.

Jeśli pierwotnej wartości nie można odzyskać, to gdzie jej używamy? Hasła! Po skonfigurowaniu hasła do telefonu komórkowego lub komputera osobistego tworzony jest skrót hasła i zapisywany w bezpiecznym miejscu. Przy następnej próbie zalogowania wprowadzony ciąg znaków jest ponownie mieszany przy użyciu tego samego algorytmu (funkcja skrótu), a dane wyjściowe są dopasowywane do zapisanej wartości. Jeśli jest tak samo, zostaniesz zalogowany. W przeciwnym razie zostaniesz wyrzucony.

Kredyty: wikimedia Stosując skrót do hasła, możemy zapewnić, że atakujący nigdy nie dostanie naszego hasła, nawet jeśli ukradnie przechowywany plik hasła. Atakujący będzie miał skrót hasła. Prawdopodobnie może znaleźć listę najczęściej używanych haseł i zastosować sha-512 do każdego z nich i porównać z wartością w ręce. Nazywa się to atakiem słownikowym . Ale jak długo miałby to robić? Jeśli twoje hasło jest wystarczająco losowe, czy uważasz, że ta metoda łamania zadziałała? Wszystkie hasła w bazach danych Facebooka, Google'a i Amazon są zakodowane, a przynajmniej powinny być zakodowane.

Następnie jest szyfrowanie

Szyfrowanie polega na mieszaniu i kodowaniu. Kodowanie jest procesem dwukierunkowym i nie powinno być używane do zapewnienia bezpieczeństwa. Szyfrowanie jest również procesem dwukierunkowym, ale oryginalne dane można odzyskać tylko wtedy, gdy znany jest klucz szyfrowania. Jeśli nie wiesz, jak działa szyfrowanie, nie martw się, omówimy tutaj podstawy. To by wystarczyło, aby zrozumieć podstawy SSL. Istnieją więc dwa rodzaje szyfrowania, a mianowicie szyfrowanie symetryczne i asymetryczne.

Szyfrowanie klucza symetrycznego

Staram się, aby rzeczy były tak proste, jak tylko mogłem. Rozumiemy więc szyfrowanie symetryczne za pomocą algorytmu shift. Ten algorytm służy do szyfrowania alfabetów poprzez przesunięcie liter w lewo lub w prawo. Weźmy ciąg CRYPTO i rozważmy liczbę +3. Następnie zaszyfrowanym formatem CRYPTO będzie FUBSWR. Oznacza to, że każda litera jest przesuwana w prawo o 3 miejsca. Tutaj CRYPTO słowo nazywa Plaintext The FUBSWR wyjściowy jest nazywany szyfrogram , wartość +3 nazywa się Encryption key (klucz symetryczny), a cały proces jest szyfr. Jest to jeden z najstarszych i podstawowych algorytmów szyfrowania kluczem symetrycznym, a jego pierwsze użycie odnotowano w czasach Juliusza Cezara. Został więc nazwany jego imieniem i jest to słynny Cezar Szyfr . Każdy, kto zna klucz szyfrowania i może zastosować odwrotność algorytmu Cezara i odzyskać oryginalny tekst jawny. Dlatego nazywa się to szyfrowaniem symetrycznym .

Szyfrowanie klucza asymetrycznego

Wiemy, że w szyfrowaniu symetrycznym ten sam klucz służy zarówno do szyfrowania, jak i deszyfrowania. Po kradzieży tego klucza wszystkie dane znikają. To ogromne ryzyko i potrzebujemy bardziej złożonej techniki. W 1976 roku Whitfield Diffie i Martin Hellman po raz pierwszy opublikowali koncepcję szyfrowania asymetrycznego, a algorytm ten znany był jako wymiana kluczy Diffie – Hellman . Następnie w 1978 r. Ron Rivest, Adi Shamir i Leonard Adleman z MIT opublikowali algorytm RSA . Można je uznać za podstawę kryptografii asymetrycznej.

W porównaniu z szyfrowaniem symetrycznym, w szyfrowaniu asymetrycznym będą dwa klucze zamiast jednego. Jeden nazywa się kluczem publicznym , a drugi kluczem prywatnym . Teoretycznie podczas inicjacji możemy generować publiczno-prywatnepara kluczy do naszej maszyny. Klucz prywatny powinien być przechowywany w bezpiecznym miejscu i nigdy nie powinien być udostępniany nikomu. Klucz publiczny, jak wskazuje nazwa, może być udostępniany każdemu, kto chce wysłać zaszyfrowany tekst do Ciebie. Teraz ci, którzy mają twój klucz publiczny, mogą za jego pomocą szyfrować tajne dane. Jeśli para kluczy została wygenerowana przy użyciu algorytmu RSA, wówczas powinny one używać tego samego algorytmu podczas szyfrowania danych. Zwykle algorytm zostanie określony w kluczu publicznym. Zaszyfrowane dane można odszyfrować tylko kluczem prywatnym, który jest Twoją własnością.

Źródło: SSL / TLS dla manekinów część 1: Ciphersuite, Hashing, Encryption | WST ( https://www.wst.space/ssl-part1-ciphersuite-hashing-encryption/ )

Anonimowy Dziobak
źródło
-3

Szyfrowanie Celem szyfrowania jest przekształcenie danych w celu zachowania ich w tajemnicy Np. (Wysłanie komuś tajnego tekstu, który powinien on czytać, wysyłanie haseł przez Internet).

Zamiast skupiać się na użyteczności, celem jest zapewnienie, aby wysyłane dane mogły być wysyłane potajemnie i widoczne tylko dla użytkownika, którego wysłałeś.

Szyfruje dane w innym formacie, przekształcając je w unikalny wzór, można je zaszyfrować za pomocą tajnego klucza, a użytkownicy posiadający tajny klucz mogą zobaczyć wiadomość poprzez odwrócenie procesu. Np. (AES, BLOWFISH, RSA)

Szyfrowanie może wyglądać tak po prostu FhQp6U4N28GITVGjdt37hZN

Hashowanie Technicznie możemy powiedzieć, że wymaga arbitralnego wkładu i tworzy ciąg o stałej długości.

Najważniejsze w tym jest to, że nie można przejść od wyjścia do wejścia, ponieważ powoduje to, że podane informacje nie zostały zmodyfikowane. Proces polega na pobraniu danych wejściowych i ich zaszyfrowaniu, a następnie wysłaniu z kluczem prywatnym nadawcy po otrzymaniu przez odbiorcę może zweryfikować go za pomocą klucza publicznego nadawcy.

Jeśli skrót jest nieprawidłowy i nie pasuje do skrótu, nie widzimy żadnych informacji. Np. (MD5, SHA .....)

neevan
źródło