Co programiści powinni wiedzieć o kryptografii? [Zamknięte]

27

Czy programiści tworzący strony internetowe / aplikacje internetowe powinni rozumieć kryptografię? Nie mam pojęcia, jak działa większość algorytmów kryptograficznych i naprawdę nie rozumiem różnic między md5 / des / aes / itp. Czy któryś z was znalazł jakąś potrzebę dogłębnego zrozumienia kryptografii?

Nie potrzebowałem tego, ale zastanawiam się, czy może coś mi umknęło. Użyłem skrótu salt + md5 do szyfrowania haseł i mówię serwerom internetowym, aby korzystały z SSL. Poza tym nie mogę powiedzieć, że użyłem wiele innych, ani nie mogę z całą pewnością powiedzieć, jak bezpieczne są te metody. Używam ich tylko dlatego, że inni twierdzą, że są bezpieczni.

Czy zdarzyło Ci się kiedyś używać kryptografii w programowaniu internetowym oprócz tych dwóch prostych przykładów?

davidhaskins
źródło
4
Powinni wiedzieć wystarczająco dużo, aby wiedzieć, że nie powinni tego robić.
SLaks
@SLaks: +1 100% zgadza się. Napisałem odpowiedź na ten wątek, aby wyjaśnić, dlaczego tak jest.
Chris Jester-Young

Odpowiedzi:

41

Programiści powinni wiedzieć, że nigdy nie powinni próbować samodzielnie wdrażać kryptografii.

W szczególności oznacza to, że żaden ekspert niebędący ekspertem od bezpieczeństwa nie powinien dotykać bezpośrednio żadnego z prymitywów kryptograficznych. Nie powinni myśleć na poziomie AES, SHA-1 itp. Zamiast tego powinni używać funkcji wysokiego poziomu do szyfrowania i podpisywania wiadomości oraz „haszowania” haseł.

Czemu? Ponieważ inaczej ludzie są wprowadzani w błąd, myśląc, że:

  • AES-256 to „świetne szyfrowanie”, mimo że używają go w trybie EBC lub używają nieprzypadkowych wartości IV itp. (W niektórych trybach nieprzypadkowe, ale unikalne IV są w porządku. W innych nie tak wiele.)
  • Mogą używać tego samego klucza symetrycznego do szyfrowania wielu wiadomości (lub, co gorsza, przechowywać klucz symetryczny w kodzie do bezpośredniego użytku).
    • Mogą nawet zdecydować się na użycie hasła jako klucza bezpośrednio, bez użycia funkcji wyprowadzania klucza.
  • Mogą używać RSA do bezpośredniego szyfrowania danych.
  • Mogą po prostu „zasolić i MD5” swoje hasła, aby zapewnić im bezpieczeństwo. (Jeśli uważasz, że tabele tęczy są najsłabszym ogniwem, pomyśl jeszcze raz .)

Żeby być na tej samej stronie, żaden z powyższych elementów nie jest w porządku . Jeśli tego nie dostaniesz, nie powinieneś dotykać krypto 10-metrowym słupem! (AES-256 to świetne szyfrowanie, ale tylko pod warunkiem, że użyjesz go właściwie. „Nie chodzi o rozmiar, ale o to, co z nim zrobisz.” :-))

O jakich funkcjach wysokiego poziomu mówię? Osobiście polecam użycie biblioteki OpenPGP (dla danych w spoczynku) lub SSL (dla danych w ruchu). Te protokoły sztywno określają prawidłowe użycie algorytmów asymetrycznych, symetrycznych i mieszających. Na przykład z OpenPGP:

  • Nie używa RSA do bezpośredniego szyfrowania danych, ale zamiast tego generuje losowy klucz (symetryczny) na wiadomość (jest to ważne) i używa RSA do szyfrowania tego klucza sesji.
  • Wykorzystuje funkcję wyprowadzania klucza do przekształcania haseł w klucze. (W języku OpenPGP nazywa się to S2K, ale myślę, że „funkcja wyprowadzania klucza” jest terminem bardziej standardowym.)
  • Obsługuje wybranie dobrego trybu, więc nigdy nie skończysz używać EBC.
  • Obsługuje zarządzanie kluczami, więc nie musisz podejmować ad hoc decyzji, które klucze są godne zaufania itp.

Podsumowanie: jeśli nie jesteś ekspertem od bezpieczeństwa i myślisz na poziomie AES, SHA-1 lub (zabraniaj nieba) MD5, robisz to źle . Użyj biblioteki napisanej przez ekspertów ds. Bezpieczeństwa (takich jak Bouncy Castle), które implementują protokoły zaprojektowane przez ekspertów ds. Bezpieczeństwa (takich jak OpenPGP do szyfrowania lub bcrypt lub scrypt do mieszania haseł), zamiast toczenia własnego.

W żadnym wypadku nie jestem ekspertem od kryptografii, ale wiem wystarczająco dużo, aby nie próbować projektować własnych protokołów ad-hoc. Żeby było jasne, cały ten post jest materiałem z Kryptografii 101 . Więc jeśli ten post nie ma dla ciebie sensu w 100%, zdecydowanie nie powinieneś zbliżać się do kryptografii.

Chris Jester-Young
źródło
4
niesamowite. podobał mi się post na blogu powiązany z „pomyśl jeszcze raz”. chargeen.matasano.com/chargen/2007/9/7/…
davidhaskins
+1, ale wielokrotne używanie tego samego klucza symetrycznego jest w porządku. Do tego służy IV (inaczej nie byłbyś potrzebny).
orip
1
Ponadto Colin Percival ze scrypt (i innymi) sławami ma świetny artykuł zatytułowany „Odpowiednie odpowiedzi kryptograficzne”, który zawiera szczegółowe decyzje dotyczące kryptografii, które należy podjąć. SSL jest bardzo problematyczny (odwołanie klucza jest bardzo trudne do wdrożenia). Więcej informacji tutaj: daemonology.net/blog/…
orip
@orip Zgadzam się, chociaż powiedziałbym, że użycie tego samego klucza z innym IV jest zwykle bardziej przydatne w przypadku, gdy twoja wiadomość jest dłuższa niż rozmiar bloku wybranego szyfru symetrycznego, niż w przypadku oddzielnych wiadomości, w których nie masz kontekst do śledzenia IV używanych w poprzednich wiadomościach. Zgadzam się również z artykułem Colina Percivala.
Chris Jester-Young
1
@ Ciesz się, że zmieniłem link na coś, co jest bardziej odpowiednie.
Chris Jester-Young,
14

Nie musisz znać nic poza podstawami kryptografii (co to jest skrót, co jest solą, mniej więcej, jak trudno złamać to szyfrowanie itd.), Ale musisz wiedzieć trochę o bezpieczeństwie generał.

Główne obszary bezpieczeństwa, o których zdecydowanie musisz wiedzieć jako programista:

  1. Wstrzyknięcie SQL. Jest to prawdopodobnie najniebezpieczniejsza dziura, którą programista może uderzyć w system.
  2. Skrypty między witrynami i pliki cookie.
  3. Spamboty i captchas.
  4. Wstrzyknięcie SQL. Nie można wystarczająco podkreślić, jak ważne jest to.
biziclop
źródło
Niezrozumienie niczego, co robisz, jest bardzo niebezpieczne. Nie wiedząc, jaka jest różnica między skrótem skrótu wiadomości a skrótem kryptograficznym, może Cię zrujnować. Nie wiedząc, jak solić, możesz zrujnować cię.
Incognito
@ user1525 To właśnie miałem na myśli jako podstawy kryptografii. Zdecydowanie nie musisz wiedzieć, jak faktycznie działa jeden z algorytmów szyfrowania.
biziclop
Doceniam odpowiedź i zgadzam się na iniekcję SQL i inne ataki, ale tak naprawdę pytałem o kryptografię.
davidhaskins
2
@davidhaskins Tak, właśnie pomyślałem, że warto na to zwrócić uwagę, ponieważ każdy poziom opiera się na poprzednim. Wiedza na temat działania AES nie jest nic warta, jeśli nie zabezpieczysz swojej aplikacji na bardziej podstawowym poziomie. Z mojego doświadczenia wynika, że ​​jest to pułapka, w którą wpada wielu programistów (robiłem to kilka razy), aby skoncentrować się na szyfrowaniu i stracić z oczu jego rolę w długim łańcuchu bezpieczeństwa.
biziclop
4

Pamiętam, jak ta rozmowa zatytułowana Co każdy inżynier musi wiedzieć o bezpieczeństwie i gdzie się go uczyć , mówcą jest Neil Daswani i jest to wykład techniczny Google, który wygłosił, może być dobrym miejscem do rozpoczęcia!

Nie dotyczy to tylko programistów internetowych. Być może pytanie powinno zostać zmienione: „Co programiści powinni wiedzieć o bezpieczeństwie?” ponieważ nie muszą wiedzieć więcej niż podstawy kryptografii (tak interesujące, jak to jest)


źródło
2

Crypto przydaje się w wielu sytuacjach. Jako przykład wykorzystaliśmy szyfrowanie pliku cookie sesji utworzonego i ustawionego przez hosta Win / IIS do użycia na hoście LAMP.

Jeśli chcesz wdrożyć szyfrowanie (w przeciwieństwie do haszowania md5 / sha1), ważne są niektóre podstawowe terminy - takie jak różnica między szyfrowaniem symetrycznym i asymetrycznym. Oprócz zrozumienia różnicy między nimi, powinieneś zrozumieć, co musisz zrobić jako twórca stron internetowych, aby poprawnie przechowywać i zabezpieczyć klucze odszyfrowywania. Na przykład, jeśli opracowujesz aplikację do wdrożenia na hoście, nad którym nie masz pełnej kontroli administracyjnej, takiej jak host współdzielony, w przeciwieństwie do wdrażania na serwerze, na którym wszyscy administratorzy są znani i zaufani.

Michał
źródło
2

Moim zdaniem powinieneś wiedzieć wszystko o kryptografii, o czym będzie wiedział ktoś atakujący twój kod. Powinieneś zrozumieć skróty, sól, brak losowości losowych, główne algorytmy szyfrowania (RSA, 3DES, AES itp.), SHA-1 / MD-5 / i in. Nie musisz ich zapamiętywać, ale powinieneś przynajmniej wiedzieć, że skuteczność algorytmu skrótu i ​​jak go wzmocnić. Powinieneś wiedzieć, jakie są kolizje i fałszywe alarmy. Nie powinieneś być w stanie recytować algorytmów szyfrujących, ale powinieneś znać ich testy porównawcze, które są idealne dla jakich scenariuszy. Powinieneś być w stanie opisać i wyjaśnić szyfrowanie symetryczne vs asymetryczne i kiedy z nich korzystać. Powinieneś wiedzieć, czym jest PKI i jak jest używana. Powinieneś wiedzieć, czym jest urząd certyfikacji i jak współdziała on z twoimi serwerami.

Znajomość tajników wszystkiego nie jest tak ważna, jak znajomość ich tła. Jakie są punkty odniesienia dla niektórych rzeczy (jak szybko, jak silnie, słabości itp.).

Te zalecenia dotyczą informacji na poziomie wyższego lub architekta. Jeśli jesteś tylko małpą internetową wiosłującą wiosłem, nie musisz nic o tym wiedzieć. Twój architekt powinien to wiedzieć. Jeśli prowadzisz witrynę, projektujesz ją, wdrażasz itp., Powinieneś znać wszystkie te koncepcje i być w stanie inteligentnie o nich rozmawiać. Nie musisz tego uczyć, po prostu akceptuj i rozpowszechniaj informacje na ten temat.

Joel Etherton
źródło
2

Powinieneś używać bcrypt (Blowfish) do przechowywania haseł zamiast MD5; jest to znacznie wolniejszy algorytm , co oznacza, że ​​haker jest trudniejszy do odgadnięcia i sprawdzenia. Ponadto bcrypt przyjmuje parametr pracy jako parametr, co oznacza, że ​​może być jeszcze wolniejszy w miarę wprowadzania nowych komputerów, więc ma wbudowane zabezpieczenie na przyszłość.

Aby uzyskać więcej informacji, zobacz Jak bezpiecznie przechowywać hasło .

chrisaycock
źródło
0

Jako dość ogólną odpowiedź na tego rodzaju pytania zawsze uważam, że powinieneś starać się mieć podstawową wiedzę na temat wszystkiego, co jest zdalnie związane z tym, co robisz. Oczywiście potrzebujesz konkretnej szczegółowej wiedzy o tym, nad czym tak naprawdę pracujesz. Bardzo trudno jest przewidzieć, w jaki sposób określony obszar będzie ewoluował, co będzie „modne” lub czego będziesz potrzebować w przyszłości, więc posiadanie szerokiego zakresu rzeczy, o których przynajmniej „słyszałeś” zachowa wiele drzwi jest otwartych.

Jeśli chodzi o moje osobiste doświadczenie w programowaniu internetowym, znalazłem podstawowe pojęcia z zakresu asymetrycznej kryptografii i to, co pomaga zrozumieć, co się dzieje pod maską. Mogłabym przetrwać bez niego, ale muszę powiedzieć, że lubię kryptografię i matematykę, więc dlaczego nie.

Omar Kohl
źródło