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?
źródło
Odpowiedzi:
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:
Ż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:
EME-PKCS1-v1_5
). Wypełnienie jest niezwykle ważne dla RSA. ( Niektórzy uważają, że stosowanie padding v1.5 jest w porządku. Inni uważają, że OAEP jest lepszy. )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.
źródło
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:
źródło
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
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.
źródło
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.
źródło
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 .
źródło
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.
źródło