Pytanie:
Dlaczego * wdrażanie * samodzielnie znanego, opublikowanego, powszechnie uważanego za bezpieczny algorytm kryptograficzny jest błędem?
gaazkam
2019-05-07 15:49:52 UTC
view on stackexchange narkive permalink

Znam ogólną radę, że nigdy nie powinniśmy projektować¹ algorytmu kryptograficznego. Mówiono o tym bardzo obszernie na tej stronie i na stronach internetowych profesjonalistów takiego kalibru jak Bruce Schneier.

Jednak ogólna rada idzie dalej: mówi, że nie powinniśmy nawet implementować algorytmów zaprojektowanych przez mądrzejszych od nas, ale raczej trzymać się dobrze znanych, dobrze przetestowanych implementacji wykonane przez profesjonalistów.

I to jest ta część, o której nie mogłem szczegółowo omówić. Przeprowadziłem również krótkie przeszukanie witryny Schneier i tam też nie mogłem znaleźć tego stwierdzenia.

Dlaczego więc kategorycznie odradza się nam również implementowanie algorytmów kryptograficznych? Najbardziej byłbym wdzięczny za odpowiedź z odniesieniem do uznanego eksperta ds. Bezpieczeństwa, mówiącego o tym.

¹ Dokładniej, zaprojektuj zgodnie z treścią naszych serc; może to być dobre doświadczenie edukacyjne; ale prosimy proszę proszę proszę , nigdy nie używać tego, co zaprojektowaliśmy.

Komentarze nie służą do rozszerzonej dyskusji;ta rozmowa została [przeniesiona do czatu] (https://chat.stackexchange.com/rooms/93406/discussion-on-question-by-gaazkam-why-is-it-wrong-to-implement-myself-a-znany).
Dwanaście odpowiedzi:
MechMK1
2019-05-07 16:24:15 UTC
view on stackexchange narkive permalink

Powodem, dla którego nie chcesz samodzielnie implementować algorytmów kryptograficznych, są ataki typu side-channel.

Co to jest kanał boczny?

Kiedy komunikujesz się z serwerem, treść wiadomości jest „głównym” kanałem komunikacji. Jest jednak kilka innych sposobów na uzyskanie informacji od partnera komunikacyjnego, które bezpośrednio nie wiążą się z tym, że coś ci powie.

Są to między innymi:

  • Czas potrzebny na udzielenie odpowiedzi
  • Energia, którą serwer zużywa na przetworzenie żądania
  • Jak często serwer uzyskuje dostęp do pamięci podręcznej, aby odpowiedzieć.

Co to jest atak kanału bocznego?

Mówiąc najprościej, atak kanału bocznego to każdy atak na system, w którym występuje jeden z tych kanałów bocznych. Weź następujący kod jako przykład:

  public bool IsCorrectPasswordForUser (string currentPassword, string inputPassword) {// Jeśli oba ciągi nie mają takiej samej długości, nie są równe. if (currentPassword.length! = inputPassword.length) return false; // Jeśli zawartość łańcuchów różni się w dowolnym momencie, zatrzymaj i zwróć, nie są one równe. for (int i = 0; i < currentPassword.length; i ++) {if (currentPassword [i]! = inputPassword [i]) return false; } // Jeśli łańcuchy miały jednakową długość i nigdy nie miały żadnych różnic, muszą być równe. return true;}  

Ten kod wydaje się funkcjonalnie poprawny, a jeśli nie popełniłem żadnych literówek, prawdopodobnie robi to, co powinien. Czy nadal potrafisz dostrzec wektor ataku kanału bocznego? Oto przykład, aby to zademonstrować:

Załóżmy, że bieżące hasło użytkownika to Bdd3hHzj (8 znaków) i osoba atakująca próbuje je złamać. Jeśli atakujący wprowadzi hasło o tej samej długości, zostanie wykonana zarówno kontrola if , jak i co najmniej jedna iteracja pętli for ; ale jeśli hasło wejściowe będzie krótsze lub dłuższe niż 8 znaków, zostanie wykonane tylko polecenie if . Pierwsza sprawa wymaga więcej pracy, dlatego jej zakończenie zajmie więcej czasu niż druga; łatwo jest porównać czasy potrzebne do sprawdzenia hasła 1-znakowego, 2-znakowego, 3-znakowego itp. i zauważyć, że 8 znaków to jedyne, które jest znacząco różne, a zatem prawdopodobnie będzie to poprawna długość hasła hasło.

Mając tę ​​wiedzę, atakujący może udoskonalić swoje dane wejściowe. Najpierw próbują aaaaaaa poprzez aaaaaaaZ , z których każdy wykonuje tylko jedną iterację pętli for . Ale kiedy dochodzą do Baaaaaaa , następują dwie iteracje pętli, których wykonanie ponownie zajmuje więcej czasu niż wejście zaczynające się jakimkolwiek innym znakiem. To informuje atakującego, że pierwszym znakiem hasła użytkownika jest litera B , i może teraz powtórzyć ten krok, aby określić pozostałe znaki.

Jak to się ma do mojego Kod kryptograficzny?

Kod kryptograficzny bardzo różni się od „zwykłego” kodu. Patrząc na powyższy przykład, nie wydaje się błędny w żaden istotny sposób. W związku z tym podczas samodzielnego wdrażania może nie być oczywiste, że kod, który robi to, co powinien, właśnie wprowadził poważną lukę.

Innym problemem, o którym przychodzi mi do głowy, jest to, że programiści nie są kryptografami. Zwykle postrzegają świat inaczej i często przyjmują założenia, które mogą być niebezpieczne. Na przykład spójrz na następujący test jednostkowy:

  public void TestEncryptDecryptSuccess () {string message = "To jest test"; KeyPair keys = MyNeatCryptoClass.GenerateKeyPair ();
byte [] cipher = MyNeatCryptoClass.Encrypt (wiadomość, klucze.Public); string decryptedMessage = MyNeatCryptoClass.Decrypt (szyfr, klucze.Private); Assert.Equals (message, decryptedMessage);}  

Czy wiesz, co jest nie tak? Muszę przyznać, że to nie było uczciwe pytanie. MyNeatCryptoClass implementuje RSA i jest wewnętrznie ustawiony na używanie domyślnego wykładnika 1, jeśli nie podano jawnie wykładnika.

I tak, RSA będzie działać dobrze, jeśli użyjesz publicznego wykładnika potęgi 1. Po prostu niczego nie „zaszyfruje”, ponieważ „x 1 ” nadal jest „x”.

Możesz zadać sobie pytanie, kto przy zdrowych zmysłach by to zrobił , ale zdarzają się takie przypadki.

Błędy implementacji

Innym powodem, dla którego implementacja własnego kodu może się nie udać, są błędy implementacji. Jak zauważa użytkownik Bakuridu w komentarzu, błędy w kodzie Crypto są śmiertelne w porównaniu z innymi błędami. Oto kilka przykładów:

Heartbleed

Heartbleed to prawdopodobnie jeden z najbardziej znanych błędów implementacyjnych, jeśli chodzi o kryptografię. Chociaż nie wiąże się to bezpośrednio z implementacją kodu kryptograficznego, to jednak ilustruje, jak potwornie złe rzeczy mogą się potoczyć w przypadku stosunkowo „małego” błędu.

Podczas gdy linkowany artykuł w Wikipedii zawiera dużo bardziej szczegółowe informacje na ten temat, ja chciałbym, aby Randall Munroe wyjaśnił sprawę znacznie bardziej zwięźle niż kiedykolwiek:

https://xkcd.com/1354/ https://xkcd.com/1354/ - Obraz na licencji CC 2.5 BY-NC

Debian Słaby błąd PRNG

W 2008 roku pojawił się błąd w Debianie co wpłynęło na losowość wszystkich dalszych użytych kluczowych materiałów. Bruce Schneier wyjaśnia zmianę, którą wprowadził zespół Debiana i dlaczego była ona problematyczna.

Podstawowym założeniem jest to, że narzędzia sprawdzające możliwe problemy w kodzie C narzekały na użycie niezainicjowanych zmiennych. Chociaż zwykle jest to problem, umieszczenie w PRNG zasadniczo losowych danych nie jest złe. Ponieważ jednak nikt nie lubi wpatrywać się w ostrzeżenia, a uczenie się, jak ignorować ostrzeżenia, może prowadzić do własnych problemów, w pewnym momencie „obraźliwy” kod został usunięty, co prowadzi do mniejszej entropii dla OpenSSL.

Podsumowanie

Podsumowując, nie wdrażaj własnego Crypto, chyba że zostało zaprojektowane do nauki! Używaj sprawdzonej biblioteki kryptograficznej zaprojektowanej tak, aby łatwo było zrobić to dobrze, a trudno było źle. Ponieważ Crypto jest bardzo łatwe do zrobienia źle.

Komentarze nie służą do rozszerzonej dyskusji;ta rozmowa została [przeniesiona do czatu] (https://chat.stackexchange.com/rooms/93466/discussion-on-answer-by-mechmk1-why-is-it-wrong-to-implement-myself-a-znane-p).
Osobiście popełniłbym „błędy implementacji” jako pierwszy element, ponieważ jest o wiele bardziej prawdopodobne, że według IMO przeciętny programista joe popełni błąd, który pozwoli na łatwe złamanie krypto, w przeciwieństwie do ataku z bocznym kanałem.Poleciłbym również podkreślić, że opiekunowie projektów OpenSSL byli doświadczonymi programistami kryptograficznymi, a jeśli * oni * popełnili tak prosty błąd, przeciętny programista joe raczej nie poradzi sobie dużo lepiej.
Wiem, że odpowiedziałem „za”, ale naprawdę, naprawdę dobrym argumentem przeciwko jest dobrze rozumiana implementacja „walidacji wiadomości e-mail” z tysiącami przykładów, które są bzdurne, mimo że zasady są jasne, publiczne i dostępne przez ostatnie 30 lat.
@mckenzm Dlaczego?RFC-822 definiuje wyrażenie regularne dla prawidłowego adresu e-mail.
Cort Ammon
2019-05-07 19:18:46 UTC
view on stackexchange narkive permalink

Wspomniane ataki kanałem bocznym to wielka rzecz. Uogólniłbym to trochę bardziej. Twoja biblioteka kryptograficzna to kod o bardzo wysokim ryzyku / wysokim poziomie trudności. Często jest to biblioteka , której można ufać, że chroni resztę miękkiego systemu. Błędy tutaj mogą z łatwością sięgać milionów dolarów.

Co gorsza, często musisz walczyć z własnym kompilatorem. Zaufane implementacje tych algorytmów są intensywnie badane przez wiele różnych kompilatorów i zawierają drobne poprawki, aby zapewnić, że kompilatory nie robią złych rzeczy. Jak zły? Cóż, zastanów się nad tymi bocznymi atakami kanałowymi, o których wszyscy wspominają. Ostrożnie piszesz kod, aby uniknąć wszystkich tych ataków, robiąc wszystko dobrze. Następnie uruchamiasz na nim kompilator. Kompilator nie ma pojęcia, co robiłeś. Może łatwo zobaczyć niektóre z tych rzeczy, które zrobiłeś, aby uniknąć ataków kanału bocznego, zobaczyć szybszy sposób na zrobienie tego i zoptymalizować kod, który starannie dodałeś! Pojawiło się to nawet w kodzie jądra, gdzie przypisanie w niewielkiej kolejności daje kompilatorowi uprawnienia do optymalizacji sprawdzania błędów!

Wykrywanie takich rzeczy można to zrobić tylko za pomocą dezasemblera i dużo cierpliwości.

Och, i nigdy nie zapominaj o błędach kompilatora. W zeszłym miesiącu spędziłem większą część tygodnia na szukaniu błędu w moim kodzie, który w rzeczywistości był w porządku - był to znany błąd w moim kompilatorze, który był przyczyną problemu. Teraz miałem szczęście, ponieważ błąd spowodował awarię mojego programu, więc wszyscy wiedzieli, że trzeba coś zrobić. Niektóre błędy kompilatora są bardziej subtelne.

Przypisanie nieco poza kolejnością nie było w kodzie kryptograficznym i jest czymś, o czym wszyscy programiści C i C ++ muszą być świadomi.(Oczywiście jest to potencjalnie droższe w kodzie kryptograficznym).
@MartinBonner Zgoda, nie kod kryptograficzny, chociaż słyszałem, że wiele lat temu trafił do MySQL jako luka w zabezpieczeniach.„Prawidłowo” sprawdzili cykliczne przepełnienie buforu, ale zrobili to za pomocą przepełnienia wskaźnika, czyli UB, więc kompilator skompilował ich wypisanie.Nie kryptowaluta, ale jedna z tych małych rzeczy, na które nie możesz sobie pozwolić na błędy w kryptowalutach.
@CortAmmon, a kluczowa różnica polega na tym, że kiedy w grę wchodzi kryptowaluta, ludzie ** bardzo aktywnie ** będą szukać wszystkich twoich wad i mają dobry powód, by ci nigdy o tym nie mówić.Dosłownie rzucą każdą istniejącą sztuczkę, a następnie przejdą do rzeczy, o których jeszcze nie pomyślano.
_Każdy_ kod, nie tylko kod kryptograficzny, który „opiera się” na niezdefiniowanym zachowaniu, nie może być zaufany, kropka.Kod, który wywołuje UB, jest zasadniczo bez znaczenia i nie ma sposobu, aby powstrzymać nieokreśloność.Wspomniane przypadki, w których kompilator „rujnuje” kod, stosując optymalizację, są artefaktem nieprawidłowości podanego źródła.To nie jest błąd po stronie kompilatora, ale programisty.
Nie walczy się z kompilatorem, jeśli chodzi o nieokreślone zachowanie (co sugerowałoby, że jest to złe zachowanie), zamiast tego walczy się z językiem C i sposobem, w jaki utrudnia on wykrycie UB.Jeśli nie lubisz C, to albo go nie używaj, albo formalnie zaproponuj zmianę.
Jeśli chodzi o kompilatory, istnieje również możliwość, że jest to [złośliwe oprogramowanie] (https://www.wired.com/2009/08/induc/).
@AlexReinking Podzielasz się opinią z programistami GCC =) Prawdą jest, że UB to UB, chyba że celujesz w kompilator * a * i jego szczególne zachowania (w takim przypadku jest to UB według specyfikacji, ale nie UB dla tego kompilatora).Celem tej sekcji było pokazanie, jak niesamowicie * subtelne * mogą być te błędy.I może nawet działać dla kilku wersji twojego kompilatora, przechodząc testy, tylko po to, aby pojawić się, gdy później zaktualizujesz kompilatory, a kompilator inaczej zareaguje na UB.
@Nelson Próbowałem dowiedzieć się, czy to naprawdę różnica, czy nie.Wierzę, że ludzie bardzo aktywnie przyglądają się wszelkiemu oprogramowaniu, które można wykorzystać, niezależnie od tego, czy kryptowaluta czy nie.Myślę, że kryptowaluty to po prostu biblioteka dla użytkownika, która, jeśli zostanie naruszona, prawdopodobnie ujawni słabo zabezpieczone oprogramowanie (zależne od kryptografii).To czyste przypuszczenie, ale spodziewałbym się, że oprogramowanie takie jak httpd Apache lub stos TCP / IP jądra Linuksa jest atakowane równie brutalnie, jak oprogramowanie kryptograficzne, takie jak OpenSSL.Z drugiej strony, polecałbym również opcję „nie tocz się po swojemu” również w przypadku tego rodzaju bibliotek!
@CortAmmon - To może być rozsądne, chociaż ostrzegam, że istnieje różnica między UB a zachowaniem zdefiniowanym w implementacji.Jeśli przyjmiesz tę filozofię, musisz również uznać, że jesteś zależny nie tylko od dostawcy, ale także od konkretnej wersji i poziomu poprawek.
@CortAmmon Tak, ludzie szukają oprogramowania, które można wykorzystać, ale krypto jest postrzegane jako cel o dużej wartości, ponieważ służy do ochrony wartościowych rzeczy.Jeśli atakujący może wykorzystać lukę w bibliotece kryptograficznej, która jest częścią schematu uwierzytelniania, aby uzyskać dostęp do systemu, może wyrządzić wiele szkód.
W przypadku kodu o bardzo wysokim ryzyku / wysokim poziomie trudności naprawdę chcesz wybrać dobrze sprawdzoną, być może nawet otwartą bibliotekę kryptograficzną.Wiele par oczu ma większą szansę na dostrzeżenie błędów niż kilka.
Paranoiczne przemyślenia na temat skutków ubocznych posiadania silnej kultury zniechęcającej ludzi do kręcenia się własnymi rękami: gwarantuje, że wszyscy będą korzystać z niewielkiej liczby bibliotek do wszystkich prac związanych z kryptografią ... co znacznie ułatwia każdą zdolną grupę do skompromitowania większości ze wszystkichkomunikacja poprzez dotarcie do około pół tuzina bibliotek.
@Murphy To myślenie według teorii spiskowej… co oznacza, że pasujesz do tłumu =) Z całą powagą, taka jest idea otwartego oprogramowania.Więcej oczu na kodzie oznacza więcej oczu białych i czarnych na kodzie.To, czy ten pomysł * faktycznie * działa na naszą korzyść, jest czymś, czego się nauczymy (lub nie!) W nadchodzących dziesięcioleciach!Dobry dodatek do dyskusji!(Jeśli mogę przedstawić studium przypadku, aby pogłębić twój argument, [backdoor logowania Kena Thompsona] (https://www.win.tue.nl/~aeb/linux/hh/thompson/trust.html) jest tego przykłademujawniony aż w 1984 roku)
@CortAmmon trochę.Moim przykładem jest [Underhanded C Contest] (http://www.underhanded-c.org/), gdzie celem jest napisanie kodu, który może przejść weryfikację kodu, włączając coś podstępnego.Chciałbym, żeby istniała struktura, która sprawiłaby, że ludzie mogliby tworzyć własne kody.Najpierw zaszyfruj za pomocą biblioteki standardowej ... a następnie upuść ją do piaskownicy, gdzie amator może nałożyć własną, losową metodę z oddzielnymi kluczami bez znaczącego ryzyka osłabienia warstwy wewnętrznej.Pokonałby taktykę wymierzoną w standardowe biblioteki.
@Murphy, który wydaje się być receptą na porażkę.Zaszyfruj coś, a następnie pozwól komuś innemu bawić się wynikiem.Hmm, pozwól mi buforować wyniki tego zaszyfrowanego hasła i zrobić coś specjalnego, jeśli ktoś znowu będzie chciał.Właśnie zaproponowałeś sposób na osłabienie szyfrowania.
@iheanyi, stąd dlaczego wspomniałem o jakimś frameworku oddzielającym inną implementację.Jeśli nie używasz ponownie kluczy lub nie robisz podobnie głupich i pracujesz z zaszyfrowanym blokiem danych, nie powinieneś być w stanie go bardziej osłabić niż cały inny losowy kod działający na twoim serwerze wykonującym zadania lub serwer transmitujący ten zaszyfrowany blokprzez sieć powinno być w stanie osłabić szyfrowanie.(choć ważne jest, aby najbardziej solidna implementacja była pierwsza) Monokultura na rynku bibliotek kryptograficznych naraża całą branżę na niebezpieczeństwo.
@Murphy hahaha, twój "framework" najwyraźniej to "nie pisz błędnego kodu lub kodu, który robi coś źle".
@Murphy Jeśli dobrze cię czytam, mówisz o korzystaniu z wielokrotnego szyfrowania?Najpierw szyfrujesz czymś „domowym” dla różnorodności, a następnie szyfrujesz standardową metodą szyfrowania przed wysłaniem?Miejmy nadzieję, że oczywiście użyjesz innych kluczy.
@CortAmmon Szyfr kaskadowy i bardzo ważne jest, aby najlepszy algorytm był pierwszy. https://link.springer.com/article/10.1007/BF02620231 I tak, musisz używać różnych kluczy. Gdybym był jakąś podejrzaną postacią w jednej z dużych rządowych agencji wywiadowczych, prawdopodobnie po prostu zrzuciłbym 10 milionów na podważenie każdej z 10 najczęściej używanych bibliotek kryptograficznych, a następnie kolejne kilka milionów na kampanię PR koncentrującą się na dyskusji o krypto, która mówi wszystkim, żeby nigdy przenigdytworzyć własne implementacje ... i nazwać to dniem.
Emilio M Bumachar
2019-05-07 22:52:37 UTC
view on stackexchange narkive permalink

Argumentem przeciwko toczeniu własnej kryptowaluty jest to, że błędy mogą ukrywać się w oprogramowaniu kryptograficznym bez żadnych objawów, nawet w obliczu obszernych testów.

Wszystko wydaje się działać idealnie. Na przykład w aplikacji podpisującej / weryfikującej weryfikator będzie działał prawidłowo. ważne podpisy i odrzucaj nieważne. Same sygnatury będą wyglądać jak bełkot dla oka, ale błąd nadal będzie tam, czekając na rzeczywisty atak.

Czy kiedykolwiek wpisałeś znak w swoim kodzie i nie zauważyłeś, co spowodowało, że edytor wyróżnienie lub szybki błąd kompilacji lub wykonania, a następnie szybko go naprawiłeś? Gdyby nie miał podświetlenia, skompilowany i działał bez widocznych objawów, czy kiedykolwiek złapałeś tę literówkę? To jest poziom trudności w rozwijaniu własnego krypto.

Mark
2019-05-08 01:39:00 UTC
view on stackexchange narkive permalink

Nawet w sytuacjach, gdy ataki typu side-channel nie są możliwe, algorytmy kryptograficzne często zawierają szczegóły implementacji, które są krytyczne dla bezpieczeństwa, ale nie są oczywiste. Dwa przykłady:

  • Algorytm podpisu ECDSA wymaga użycia losowej liczby całkowitej podczas generowania podpisu. Ta liczba całkowita musi być inna dla każdego podpisu generowanego za pomocą danego klucza prywatnego. Jeśli zostanie ponownie użyty, każdy, kto uzyska dwa podpisy, może odzyskać klucz prywatny za pomocą podstawowej arytmetyki modularnej. (Sony popełniło ten błąd przy zabezpieczeniu przed kopiowaniem PlayStation 3, używając tego samego numeru dla każdego podpisu).

  • Generowanie pary kluczy dla algorytmu RSA wymaga wygenerowania dwóch losowych dużych liczb pierwszych. W normalnych warunkach odzyskanie klucza prywatnego wymaga faktoryzacji na czynniki całkowite lub rozwiązania problemu RSA, co jest bardzo powolnymi operacjami matematycznymi. Jeśli jednak para kluczy dzieli jedną ze swoich liczb pierwszych z inną parą kluczy, wówczas klucze prywatne obu par można łatwo odzyskać, po prostu obliczając największy wspólny dzielnik dwóch kluczy publicznych. (Wiele routerów generuje certyfikaty SSL przy pierwszym uruchomieniu, gdy nie ma dużej liczby losowości. Czasami zdarza się, że dwa routery generują certyfikaty z nakładającymi się parami kluczy).

Augusto
2019-05-07 16:06:35 UTC
view on stackexchange narkive permalink

Wydaje mi się, że napisane drobnym drukiem:

Zaimplementowanie algorytmu kryptograficznego jest w porządku, o ile kod jest wolny od błędów i pozwala uniknąć wszelkich pułapek na każdej platformie (system operacyjny i architektura), na której kod będzie działać.

Na przykład niektóre implementacje prawdopodobnie mają dodatkowy kod zapobiegający atakom z kanału bocznego. Nie jest to nieodłączne od algorytmu, ale jest wymagane, aby implementacja była bezpieczna. To prawdopodobnie jeden z wielu punktów.

AJ Henderson
2019-05-08 03:14:31 UTC
view on stackexchange narkive permalink

Niezwykle łatwo jest popełnić błąd kryptograficzny, jeśli zastosujesz go samodzielnie i nie masz bardzo solidnego zrozumienia tego zagadnienia. Z domowych wdrożeń, które widziałem w mojej karierze, nie przychodzi mi do głowy ani jedna, która nie miałaby katastrofalnych słabości, które można było łatwo wykorzystać, prowadząc w większości przypadków do całkowitego zerwania lub przynajmniej poważnego osłabienia

Poza tym, nawet jeśli masz umiejętności i wiedzę potrzebne do wykonania własnej implementacji, prawdopodobieństwo wystąpienia innych słabych punktów w stosunku do samej implementacji jest wysokie w przypadku takich rzeczy, jak ataki czasowe lub rzeczywiste błędy w implementacji, które mogą wyciek informacji bezpośrednio, nawet jeśli w idealnym przypadku wszystko działa poprawnie. W takich przypadkach nie jest tak, że osoby wdrażające muszą koniecznie lepiej je zrozumieć, ponieważ znacznie więcej osób użyło i przetestowało implementację, a znacznie więcej osób chce się upewnić, że jest bezpieczna.

Jeśli wdrożysz się sam, masz bardzo małą liczbę białych kapeluszy, które patrzą na to i potencjalnie dużą liczbę czarnych kapeluszy, więc masz przewagę liczebną wśród atakujących. Korzystając z dużej, często używanej implementacji, równoważy liczbę atakujących ją hakerów białych i czarnych kapeluszy, aby uzyskać bardziej wyrównaną mieszankę.

jl6
2019-05-09 21:00:36 UTC
view on stackexchange narkive permalink

Chciałbym przedstawić nieco inną perspektywę ...

Nie jest tak, że nikt nie powinien nigdy wdrażać kryptografii. W końcu ktoś musi to zrobić. To po prostu niezwykle trudne zadanie i powinieneś zapytać, czy masz do dyspozycji niezbędne doświadczenie i zasoby.

Jeśli masz duże doświadczenie w odpowiednich dziedzinach matematyki i informatyki, silny zespół recenzentów, metodyczne i staranne testowanie we wszystkich środowiskach, jesteś na bieżąco z odpowiednią literaturą, rozumiesz pułapki projektowania i wdrażania, które są specyficzne dla kryptowalut ... to jasne, idź dalej i zaimplementuj kryptowaluty.

..i jeśli uważasz, że nie ma już nic odpowiedniego do twojego użytku i będzie tak dobre, jak to, co zrobisz.
drjpizzle
2019-05-09 05:29:55 UTC
view on stackexchange narkive permalink

Cóż, to szybko się rozwinęło. Zdaję sobie sprawę, że nie będzie to popularne, ale jeśli myślisz, że wiesz, co robisz i dobrze rozumiesz język, którego używasz, i sposób, w jaki go używasz, być może bądź całkowicie bezpieczny, pisząc własną implementację niektórych prymitywów kryptograficznych.

Na przykład, jeśli sprawdzasz, czy hashe pasują do oczekiwanej wartości przed uruchomieniem jakiegoś oprogramowania układowego, implementacja algorytmu haszującego prawdopodobnie będzie w porządku. Osoba atakująca otrzymuje bardzo mało informacji zwrotnych, jeśli powiedzą, że niepoprawna wartość nie otrzymuje żadnej odpowiedzi.

Jednak rzadko zdarza się to w środowisku naturalnym, ponieważ istnieje już implementacja SHA256 w każdym języku, o którym myślisz: dlaczego skopiowałbyś to z kilkoma różnymi nazwami zmiennych. Dzieje się tak, gdy ktoś zdecyduje się być sprytny lub chce innego zachowania, albo nie rozumie niuansów (jak kanały boczne itp.).

Wydaje się, że społeczność myśli: mniej kowbojów jest lepszych, więc odstraszyć wszystkich. Może to być słuszne, ale myślę, że rady są łatwiejsze do zastosowania bez robienia uwag (takich jak nigdy nie wprowadzaj własnych), które wydają się zbyt gorliwe.

To powiedziawszy, łatwo o tym zapomnieć, chociaż wiesz dokładnie, kiedy nie rozumiesz większości rzeczy związanych z programowaniem, ponieważ nie działają one zgodnie z oczekiwaniami. Crypto zawsze działa zgodnie z oczekiwaniami w sensie „udzielił poprawnej odpowiedzi”. Jednak wiedza o tym, czego nie wiesz, że inni mogą o kryptowalutach, jest nietrywialnym zadaniem. To jest sposób myślenia, z którym ludzie mają trudności. Dlatego ludzie pytają „dlaczego nie mogę”, a nie „co jest nie tak z moim dowodem, że potrafię”.

Ogólnie rzecz biorąc, mam zamiar przyjąć postawę „jeśli musisz zapytać: nie” jest prawdopodobnie dla najlepszych. Ale to nie znaczy, że twój proces myślowy jest zły. Tylko tyle, że ci, którzy udzielają porad, nie mogą być naprawdę pewni, że tak nie jest.

Na szczęście SHA-256 jest naturalnie odporny na kanały boczne.
Idea, że „jeśli nikomu nie wolno robić * X *, to * kto * może robić * X *?”jest dość powszechne w przypadku każdego pytania, które kończy się jako „Nie wyrzucaj własnego”.Moja odpowiedź nie polega na tym, że nigdy nie powinieneś implementować kodu kryptograficznego.Pomysł brzmi: „Jeśli zaimplementujesz swój kod kryptograficzny, musisz być świadomy o wiele więcej rzeczy niż przeciętny kod”, a typowy programista prawdopodobnie nie dostarczy dobrego kodu kryptograficznego.
@forest Czy to sarkazm?W przeciwnym razie, co sprawia, że SHA-256 jest naturalnie odporny na kanały boczne?
@MechMK1 To nie jest sarkazm.SHA-256 jest naturalnie odporny na kanał boczny, ponieważ wykorzystuje dodatki, obroty o stałej odległości i XOR (czyli jest to funkcja _ARX_), które są operacjami o stałym czasie na większości nowoczesnych procesorów.W przeciwieństwie do, powiedzmy, AES, nie używa żadnych zależnych od sekretów tabel wyszukiwania.Oznacza to, że nawet naiwna implementacja oprze się kanałom bocznym, podczas gdy implementacja AES w stałym czasie wymaga zrozumienia niskopoziomowej architektury procesora.
To samo dotyczy również MD4, MD5, SHA-1, reszty rodziny SHA-2 i RIPEMD160, które są bardzo blisko spokrewnionymi hasłami ARX (wszystkie ich projekty pochodzą z MD4 i ulepszają je na różne sposoby).Istnieje również kilka „pomocników”, które są naturalnie odporne na kanały boczne, takie jak ChaCha20.Prawie każda czysta funkcja ARX będzie łatwa do zaimplementowania bez martwienia się o stałe zachowanie czasu.
DrM
2019-05-09 22:36:58 UTC
view on stackexchange narkive permalink

Mówiąc prosto, starsze, szerzej używane oprogramowanie szyfrujące zostało poddane większej liczbie testów (przyjaznych i nieprzyjaznych) i większej analizie.

Ponadto historia szyfrowania jest zaśmiecona zepsutym oprogramowaniem, z których część został opracowany przez wybitnych ekspertów kryptografów.

Tak więc kody, do których możesz mieć największe zaufanie, to bardzo często kody, które istnieją od jakiegoś czasu.

mckenzm
2019-05-08 04:48:34 UTC
view on stackexchange narkive permalink

Nie, i wydaje się, że jest to skierowane do laików jako ostrzeżenie, aby zostawić to lepszym.

Jeśli implementacja nie istnieje dla twojego języka, ktoś będzie musiał to zrobić. To nie jest tak, że nie będzie wystarczającej liczby przypadków testowych, a jeśli jesteś profesjonalistą, odbędzie się wzajemna ocena i dalsze testy.

Tak, musi być poprawna, ale jeśli jest to opublikowana (i wcześniej zaimplementowane w innych językach) to powinno być prawie standardowe.

Więc może nie powinieneś tego robić, ale oczywiście ktoś musi. Jeśli tego nie zrobisz, będziesz musiał wezwać coś innego, aby wypełnić swoją lukę, co nigdy nie jest pożądane.

Powinien być oczywiście napisany tak, aby specjalista ds. bezpieczeństwa mógł go rozpoznać po wizualnym „odcisku palca”.

Nie zgadzam się z poglądem, że implementacje kryptograficzne są „prawie szablonowe”.
Poza tym, w jakim nietypowym języku pracujesz, w którym nie ma istniejących bibliotek kryptograficznych?Chodzi mi o to, że jeśli nie programujesz w Malbolge i nie musisz specjalnie używać algorytmu szyfrującego Camellia, prawdopodobnie nie jesteś na tej łodzi.
Byłbyś zaskoczony.Widziałem kilka sklepów implementujących własne implementacje asemblera z / OS.To zależy od odsetek lub wydatku z półki.
@Kevin, podczas gdy Delphi ma jedną bibliotekę kryptograficzną, jest bardzo błędna, a zespół programistów za nią stwierdził, że nie naprawi tego, kontynuując sprzedaż ORAZ zaprzecza modyfikacjom.
.. aw przypadku Open Source jest na nim generalnie czyjeś nazwisko, nie zmaterializowało się to z niczego.
Wayne Werner
2019-05-10 02:44:33 UTC
view on stackexchange narkive permalink

Kolejny powód, który idzie w parze z wieloma innymi odpowiedziami, to fakt, że szyfrowanie jest dobre, jest trudne

Szyfrowanie dobrze jest drogie.

Szyfrowanie złe jest drogie.

Ponieważ prawidłowe wdrożenie szyfrowania jest tak trudną rzeczą, która wymaga mnóstwa pracy, z perspektywy biznesowej wdrożenie własnej kryptografii raczej nie ma sensu.

A wtedy istnieje ryzyko popełnienia błędu, co może obejmować wszelkiego rodzaju negatywne konsekwencje, w tym grzywny, złą reklamę i gorzej co masz zaszyfrować.

Jennifer
2019-05-08 16:59:19 UTC
view on stackexchange narkive permalink

Problem z użyciem dobrze znanych, profesjonalnie zaimplementowanych algorytmów polega na tym, że do ochrony wiadomości wystarczy tylko klucz. Jeśli Evelyn może znaleźć (lub odgadnąć) klucz, wiadomość może zostać odszyfrowana.

Przed drugą wojną światową istniały dwa rodzaje maszyn kryptograficznych Enigmy - jedna do celów biznesowych, a druga do wojska. Wersja militarna, bardziej skomplikowana i solidna niż druga, była oczywiście nieosiągalna, ale każdy mógł się pojawić i kupić wersję biznesową. Kryptolodzy znaleźli jeden, zdemontowali go i przeanalizowali, a ostatecznie wymyślili, jak zbudować własną wersję wojskową. (To była główna przyczyna przegranej Niemiec.)

Aby zapewnić najlepszą ochronę, algorytm MUSI być utrzymywany w tajemnicy. Nie ma tam żadnych dobrze znanych tajnych algorytmów.

Teoretycznie można by budować maszyny, które są algorytmami i nie mają klucza. Po prostu uruchom go przez maszynę bez klucza i upewnij się, że Evelyn nigdy nie otrzyma kopii algorytmu. (Prawdopodobnie nie chciałbym tego robić sam).

Dla najlepszego bezpieczeństwa przepuściłbym tekst jawny przez mój własny niepublikowany algorytm , a następnie przez profesjonalnie zrealizowany. Jest to oczywiście możliwe tylko w przypadku niewielkiej liczby użytkowników „tylko na zaproszenie”; nie można go umieścić na GitHubie.

Musiałbyś uniknąć sytuacji, w której drugi (profesjonalnie zaimplementowany) proces zrobiłby coś niezabezpieczonego, jeśli jego dane wejściowe są już zaszyfrowane. Z drugiej strony, wiele prób złamania kodu działa na zasadzie wypróbowania każdego możliwego klucza i zatrzymania się, gdy pojawi się coś, co wygląda jak zwykły tekst. Ponieważ wynik tego procesu wymaga kolejnego kroku, zanim stanie się czytelny po ludzku, proces łamania kodu nie będzie wiedział, kiedy się zatrzymać.

IANAC, ale nigdy nie pozwoliłem, aby coś takiego mnie powstrzymało.

„Z drugiej strony, wiele prób łamania kodów działa na zasadzie wypróbowania każdego możliwego klucza i zatrzymania się, gdy pojawi się coś, co wygląda jak zwykły tekst.” Jednym z kluczy do złamania Enigmy podczas II wojny światowej było to, że tak wiele wiadomości zaczęło się właśnie od „Heil Hitler”.Gdy tylko otrzymasz niezgodną literę, przerwij, zwiększ koło kodowania i spróbuj ponownie.A kiedy zdobędziesz pełny klucz, możesz odszyfrować wszystko inne tego dnia ...
To jest błędna i zła rada.Każdy może wymyślić podejście kryptograficzne, którego sam nie może złamać.Sztuczka polega na wymyśleniu takiego, którego * nikt * nie może złamać - i nie możesz tego ustalić, jeśli starasz się zachować swój algorytm w tajemnicy.Jeśli nie jesteś zespołem kryptoanalityków, trudno byłoby ci określić, czy twój algorytm homebrew zwiększa / zmniejsza / narusza bezpieczeństwo prawdziwego algorytmu, do którego się przyczepiasz.
Ponadto „Problem z użyciem dobrze znanych, profesjonalnie zaimplementowanych algorytmów polega na tym, że wszystko, co musisz chronić, to klucz”.- to nie jest * problem *.To klucz do zrozumienia bezpieczeństwa.Szczerze mówiąc, jeśli naprawdę chcesz zatrzymać tego rodzaju wektor ataku (ślepe zastosowanie określonego algorytmu szyfrowania), po prostu dodaj pieprz.Zapobiega temu samemu potencjalnemu wektorowi ataków, nie wprowadza potencjalnych luk w zabezpieczeniach i nie wymaga implementacji algorytmu bezpieczeństwa.
Trochę trudno zachować to w tajemnicy, jeśli zostanie opublikowane jako dokument RFC lub w Wikipedii.Tematem tutaj są „znane” metody.
-1 ** Sugerujesz, że chronisz się przez niejasność ** i rażąco naruszasz zasadę Kerckhoffsa.Z takim stanowiskiem nie uzyskasz dużego wsparcia na tej stronie ...
Prawie nieskończenie zły pomysł.W twoim scenariuszu tylko jedna osoba używająca twojego algorytmu musi źle go zachować, a atakowany ma coś do odtworzenia w trywialny sposób.Wtedy cała twoja realizacja jest dyskusyjna.Dlatego istnieje zasada, że każda bezpieczna metoda ochrony danych nie może polegać na tym, że szczegóły implementacji nie są publicznie znane.
„Aby zapewnić najlepszą ochronę, algorytm MUSI być utrzymywany w tajemnicy”: przepraszam, ale to jest całkowicie błędne.Jeśli zachowasz to w tajemnicy, nigdy nie dowiesz się, czy jest * naprawdę * bezpieczne, czy raczej wygląda na bezpieczne, ale inni mogą je złamać.Celem korzystania z AES, RSA i tak dalej jest to, że oparły się atakom całej społeczności, co sprawia, że jest bardzo mało prawdopodobne, że istnieją pewne luki, które znalazło tylko nieliczne (NSA?).Te algorytmy są tak bezpieczne, że nawet poinformowanie wroga, że ich używasz, nie daje mu żadnej przewagi.


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 4.0, w ramach której jest rozpowszechniana.
Loading...