Jakie są główne powody, by pisać zaciemniony kod, pod względem realnej korzyści dla osób opracowujących kod oraz firmy, która go uruchamia (jeśli kod jest faktycznie kodem komercyjnym)? Czy istnieją udokumentowane przypadki (dostępne online w niektórych lokalizacjach), które opisują, kiedy zaciemnianie było bardziej dobre niż złe? Czy istnieją dobrze znane przykłady, w których udowodniono, że na przykład zaciemnianie znacząco opóźnia dostęp złośliwego oprogramowania do kodu? Wygląda na to, że podobnie jak zwijanie szyb samochodowych nie powstrzyma ludzi przed rozbiciem ich i kradzieżą stereo, zaciemnienie kodu po prostu sprawia, że uczciwi ludzie są uczciwi.
=========
Tło:
Jest to próba celowego zakwestionowania moich założeń na ten temat.
Od dawna jestem przeciwny zaciemnianiu kodu, ale jestem ciekawy, czy coś pominąłem. Rozumiem, dlaczego w przypadkach takich jak JavaScript, minifikacja pomaga szybciej ładować rzeczy (i jest to prawdziwa, funkcjonalna korzyść), ale nie wydaje mi się, żeby wymyślił jeden powód, dla którego zaciemnianie kodu jest przeszkodą odkrywanie, co robi sekcja kodu / algorytmu , jest faktycznie skuteczne w dowolnym celu.
Ponieważ open source jest szalenie popularny, pytanie wydaje się brzmieć: „udostępnić kod, czy zachować go jako zastrzeżony?” Jeśli chodzi o kodeks handlowy, rozumiem, dlaczego nie możesz udostępniać wszystkiego, a masz prawo do walki z kradzieżą.
BTW, jeśli powodem, dla którego ktoś pisze zaciemniony kod, jest „bezpieczeństwo pracy”, zwolniłbym każdego programistę, który konsekwentnie i celowo używa zaciemniania, którego jedynym celem jest pomoc w utrzymaniu ich pracy, chyba że może w uzasadniony sposób wykazać, że miał trochę korzyść biznesowa. Jest tak całkowicie przeciwny zespołowi, że jest absurdalny i wskazuje na kogoś, kto jest bardziej zainteresowany utrzymywaniem swojej pracy poprzez błędne praktyki, a następnie utrzymywaniem go, ponieważ piszą niesamowite oprogramowanie.
Wspominam tylko o tym konkretnym przypadku, ponieważ chociaż zdaję sobie sprawę, że ludzie zwykle żartują, chciałbym odstraszyć wszelkie odpowiedzi, których podstawowym założeniem jest to, że zaciemnianie samego bezpieczeństwa pracy jest dobrym pomysłem.
źródło
Odpowiedzi:
Jednym z bardzo interesujących przypadków użycia zaciemniania jest śledzenie pochodzenia nielegalnych kopii. Zakładając, że zaciemnianie jest stosunkowo tanią operacją, oryginalny autor może dostarczyć każdemu klientowi odmiennie zaciemnioną wersję aplikacji, w przypadku znalezienia nielegalnej kopii autor może porównać z dostarczonymi wersjami i prześledzić źródła piractwa.
Jest to forma steganografii , inspirowana i będąca odmianą schematów kryptograficznych „zdrajców” . Nie mam pojęcia, czy jest to powszechne 1 , czy nawet dobry pomysł, ale widziałem, że jest stosowany w praktyce przy następujących parametrach:
Uzasadnieniem było oczywiście początkowo bezpieczeństwo poprzez niejasność i ewoluowało na wspomnianym schemacie w pewnym punkcie 2 . Obaj dostawcy mieli dostęp do swojego kodu binarnego, legalnie, i myślę, że oczywiste jest, że oczekiwano od obu prób dekompilacji. Na dłuższą metę zaciemnianie nie zrobiło nic pod względem bezpieczeństwa. Obaj dostawcy mieli wysoce zmotywowane i utalentowane zespoły, pracujące na niezwykle zyskownym i niszowym rynku, ostatecznie nasze produkty były bardziej podobne niż nie, a jakąkolwiek przewagę konkurencyjną uzyskano za pomocą innych, mniej niejasnych środków.
Naprawdę nie mogę się rozwinąć, ponieważ (a) to był bardzo wczesny etap mojej kariery i nie uzyskałem jasnego przeglądu decyzji projektowych ani wyników schematu śledzenia (jeśli w ogóle) oraz (b) części mojego zaangażowania z projektem był objęty NDA.
Kolejnym ważnym przypadkiem użycia do zaciemnienia może być, gdy jesteś prawnie zobowiązany do przekazania swojego kodu stronie trzeciej :
IANAL, a link jest bardziej odpowiedni dla drukowanych kopii kodu niż dla faktycznego kodu roboczego, więc może to być zupełnie nieistotne.
Ponieważ Javascript jest kanonicznym przykładem zaciemniania, istnieje jeden efekt uboczny, który nie jest powszechnie brany pod uwagę i polega na ukrywaniu złośliwego kodu w zaciemnionym Javascript. Chociaż minimalizowanie 3 skryptów JavaScript ma wyraźne zalety , nie widzę sensu w faktycznym zaciemnianiu i cieszę się, że Douglas Crockford zgadza się ze mną :
Jeśli chodzi o zaciemnianie „bezpieczeństwa pracy”, jest to zachowanie, które nigdy nie powinno przejść przeglądu kodu, a jeśli zostanie zidentyfikowane, nie powinno być tolerowane. Na początku nie posunąłbym się tak daleko, jak zwolnienie winowajcy, ale powtarzający się przestępcy zdecydowanie zasługują przynajmniej na dobre klapsy.
Podsumowując, zaciemnianie jest typowym przykładem bezpieczeństwa poprzez zaciemnienie, jego oczywistą zaletą jest odstraszanie i nic więcej. Mogą istnieć kreatywne przypadki użycia 4 , o których nie wiem, ale ogólnie korzyści są w najlepszym razie minimalne.
1 Po napisaniu tego znalazłem odpowiedź, która zasadniczo opisuje ten sam schemat, więc może być bardziej powszechna, niż myślałem.
2 Chociaż steganografia jest nadal zabezpieczeniem poprzez niejasność.
3 Minimalizacja ~ usuwanie białych znaków i skracanie żetonów, nie celowe zaciemnianie.
4 Czy liczy się międzynarodowy konkurs zaciemnionego kodu C ?
źródło
Przypadek zaciemnienia kodu polega na tym, że podnosi on poprzeczkę dla strony trzeciej, aby określić, co / jak działa kod.
Jednak, że nie nie znaczy to, że deweloper nie powinien nigdy być pisanie kodu pogmatwanego.
Widzisz, to jest fragment, który moim zdaniem brakuje w twoim pytaniu: zaciemnianie kodu (podobnie jak minimalizacja JavaScript) nie musi - i nie powinno - być wykonywane ręcznie przez programistę. Podobnie nie powinno to być również przechowywane jako podstawowe pliki źródłowe w kontroli wersji.
Ukrywanie kodu powinno odbywać się jako etap przetwarzania końcowego podczas kompilacji do kompilacji produkcyjnej. Istnieje również wiele produktów innych firm, więc prawie nie ma powodu, aby robić to samodzielnie.
Na przykład: Dotfuscator
IEEE ma artykuł na temat skuteczności zaciemniania kodu
Podkreśl moje.
źródło
Brałem udział w tworzeniu MMORPG. Dotyczyło to logiki serwera i logiki klienta. Podczas wieloletniego rozwoju projektu, ilekroć rozważaliśmy interfejs między klientem a serwerem, reguła była taka, że serwer powinien być traktowany przez serwer przez cały czas, przy założeniu, że został zhakowany. Innymi słowy, serwer musiał być napisany w taki sposób, aby klient nie otrzymał odpowiedzi, która spowodowałaby awarię serwera lub pozwoliłaby klientowi oszukiwać. Mimo to od samego początku wiadomo było, że hakerzy nieuchronnie znajdą dziury w systemie i wykorzystają je w celu oszukiwania. I po chwili to zrobili.
Oczywiście, zanim wysłaliśmy klienta do wielkiego wielkiego świata, musieliśmy go zaciemnić. Uważamy, że zaciemnianie miało następujące skutki:
Konta gier odkrytych hakerów zostały zakończone bez zwrotu pieniędzy, dzięki czemu działalność hakerów była droższa i mniej atrakcyjna.
Z tego powodu uważam, że zaciemnianie miało ogólnie pozytywny wpływ na naszą grę, a co za tym idzie, zaciemnianie może mieć ogólnie pozytywny efekt w każdym oprogramowaniu, które może zostać zhakowane. (Na przykład oprogramowanie zawierające środki ochrony przed kopiowaniem.)
Wpływ zaciemnienia na utrzymanie był prawie żaden. Było kilka miejsc, w których niektórzy niedoświadczeni programiści przyjmowali założenia dotyczące nazw identyfikatorów (korzystali z refleksji), ale gdy już je uporządkowano, wszystko było w porządku. Krok zaciemniania stał się częścią ogólnego etapu kompilacji produkcyjnej wersji gry, więc większość programistów nigdy nie musiała się tym martwić ani mieć z tym nic wspólnego. Mieliśmy już narzędzie do przeglądania dzienników gry, więc zmodyfikowaliśmy to narzędzie, aby używało tabeli asocjacji (mapowania zaciemnionych identyfikatorów na odpowiednie identyfikatory) wygenerowanej przez obfuscator w celu przetłumaczenia dzienników dla nas w locie, więc nigdy nie Musiał nawet zobaczyć zaciemnione identyfikatory podczas badań pośmiertnych na podstawie logów zebranych z pola.
źródło
Czytanie i rozumienie (i oczywiście pisanie) zaciemnionego kodu może być ciekawym wyzwaniem umysłowym. Prawdopodobnie nie mieści się w zakresie tego, o co prosiłeś, ale przykłady takie jak IOCCC mogą być zarówno źródłem rozrywki, jak i grozy.
źródło