Mam projekt open source, który przesyła pliki do DropBox między kilkoma hostami plików. W tej chwili robię przeglądanie ekranu dla DropBox. Aby korzystać z ich interfejsu API, muszę zakodować na klucz tajny klucz, który mi podali, w celu uwierzytelnienia OAuth. Obawiam się jednak, że klucz nie będzie tajny, jeśli będzie widoczny dla każdego.
„Możliwe” jest, że ktoś złośliwy użyje mojego klucza do przesłania wirusa na konto użytkownika (który już zezwolił na dostęp do mojej aplikacji), który rozprzestrzeni się na jego komputer (jeśli miał włączoną synchronizację pulpitu) i na komputer innych osób (jeśli mieli wspólne foldery) i tak dalej. : O
Znalazłem to pytanie bez odpowiedzi, które ma ten sam problem co moje.
Chciałbym jednak ogólnie wiedzieć, jak ukryć poufne dane w projekcie typu open source.
Mam jeden pomysł.
- Czy masz symbol zastępczy w kodzie źródłowym, taki jak „<KLUCZ TAJEMNICY TUTAJ” i wypełniasz go tylko podczas tworzenia pliku binarnego do wydania? (fuj!)
Masz jakiś dobry pomysł?
źródło
Odpowiedzi:
Podstawową ideą jest to, że NIE rejestrujesz poufnych wartości w kodzie lub w skompilowanym pliku binarnym. Zwłaszcza jeśli projekt jest open source, naprawdę nie powinieneś. W tym celu można zastosować kilka strategii konfiguracji:
Symbole zastępcze w kodzie (wartości zakodowane na stałe)
Symbole zastępcze w kodzie - jak sugerowano - co jest najbardziej rozsądne i najłatwiejsze w dynamicznych językach programowania, ponieważ kod można łatwo zmienić (bez konieczności kompilacji). Widziałem wiele takich projektów typu open source, takich jak MediaWiki
LocalSettings.php
.Wadą tej strategii jest to, że klucz jest ustalony. Więc jeśli program jest dystrybuowany jako plik binarny, to posiadanie klucza na stałe nie czyni go szczególnie łatwym do utrzymania.
Pliki tekstowe konfiguracji
Możesz to również zrobić, implementując konfiguracyjne pliki tekstowe , tzn. Program / aplikacja wyszukuje plik konfiguracyjny i odczytuje z niego wartości. Możesz sprawdzić przykładową konfigurację za pomocą symboli zastępczych, ale rzeczywista konfiguracja jest lokalna na twoim komputerze.
W twoim przypadku możesz utworzyć
key.conf
plik tekstowy z rzeczywistym kluczem, pozwól programowi użyć tego pliku i pozwól mu zostać zignorowany przez kontrolę wersji. Za pomoc możesz wpisaćkey.conf.example
plik tekstowy za pomocą fałszywego klucza i to sprawdzić. Upewnij się, że Twój program / aplikacja wyświetla pomocny komunikat o błędzie dla użytkownika, aby dodać właściwy klucz do poprawnego pliku.Niektóre języki programowania mają interfejsy API, które zapewniają to automatycznie, na przykład:
App.Config
plikami dostępnymi za pośrednictwem API .NET programu ConfigurationManagerpackage.json
lub umieszczają wartości konfiguracyjne w plikach json, a dzięki interfejsom API modułów plików można je łatwo analizować i używać, ponieważ są dosłownie obiektowymi obiektami JavaScript .Jeśli aplikacja jest aplikacją bazy danych, rozważ umieszczenie klucza lub innych zmiennych konfiguracyjnych w bazie danych. Jest taki sam jak powyższy plik tekstowy konfiguracji, ale zamiast tego umieścisz wszystkie zmienne konfiguracyjne, takie jak klucz, w tabeli bazy danych.
Poprzez widok preferencji lub aplikację Back Office
Jeśli program jest oknem lub aplikacją internetową z widokami, możesz również pozwolić aplikacji na utworzenie pliku konfiguracyjnego, poprzez rodzaj widoku preferencji. W ten sposób nie musisz wpisywać przykładowego pliku konfiguracyjnego, jak sugerowano powyżej.
MediaWiki rozwiązało to podobnie, automatycznie generując
LocalSettings.php
plik w procesie wstępnej instalacji.Trzeba przyznać, że nie jest to opcja dla programów, które działają wyłącznie jako procesy, usługi lub demony w tle. Jednak właśnie dlatego tworzysz dla nich osobne projekty GUI, aby utworzyć punkt wejścia dla ustawień administracyjnych i preferencji, w aplikacjach internetowych zwanych zwykle aplikacjami Back Office .
źródło
Najprostszym sposobem jest po prostu nie publikowanie poufnych danych. Niektóre opcje:
Użyłem drugiej opcji do programowania open source, ponieważ oznacza to, że nie musisz się martwić o wypełnienie szczegółów tuż przed kompilacją lub o jedną zmianę, aby pamiętać, aby nie zatwierdzać.
źródło
Jeśli ktoś ma kod źródłowy (lub kod bajtowy, który można poddać inżynierii wstecznej), wówczas będzie mógł uzyskać tajny klucz, uruchamiając kod w debuggerze i ustawiając punkt przerwania w miejscu, w którym wysyłasz klucz.
Możesz to trochę utrudnić, dostarczając wstępnie skompilowaną bibliotekę C, która mówi do skrzynki nadawczej, z kluczem w niej zakodowanym, ale wciąż istnieje wiele sposobów, w jakie klucze będą wyciekły (na przykład myślę o ciągach znaków).
Jedynym bezpiecznym sposobem, w jaki mogę to zrobić, jest zapewnienie usługi internetowej, która wykonuje wysyłanie wiadomości do skrzynki. W ten sposób tajny klucz pozostaje na twoim serwerze pod twoją kontrolą. Koszty hostingu i przepustowości oznaczają, że to rozwiązanie nie jest idealne dla darmowej aplikacji, ale dodatkową zaletą jest to, że Twój serwer może poprawnie uwierzytelnić klientów przed przesłaniem ich plików do Dropbox.
źródło