Jak mogę ukryć poufne dane w moim projekcie open source?

13

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ł?

Vigneshwaran
źródło
1
To naprawdę jedyny bezpieczny sposób, aby to zrobić. Możesz również użyć szyfrowania pgp do zakodowania swojego tajnego klucza, wtedy tylko Ty możesz go zdekodować, ale po co w ogóle męczyć się z jego opublikowaniem.
Prescott,
Może chciałbym sprawdzić to pytanie: programmers.stackexchange.com/questions/180957/… - nie chodzi o klucze API DropBox, ale ogólny komunikat jest taki sam.
tdammers
git-crypt został stworzony dla Ciebie :) github.com/AGWA/git-crypt
nha

Odpowiedzi:

14

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.confplik 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.exampleplik 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:

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.phpplik 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 .

Łup
źródło
Należy zwrócić uwagę na to, że sama aplikacja modyfikuje własne ustawienia konfiguracyjne, co oznacza, że ​​użytkownik musi zapisywać plik ustawień, co z kolei zwiększa powierzchnię ataku, dlatego należy dobrze się zastanowić, czy naprawdę potrzebny jest taki interfejs użytkownika.
tdammers
2

Najprostszym sposobem jest po prostu nie publikowanie poufnych danych. Niektóre opcje:

  • Użyj symbolu zastępczego jak w pytaniu.
  • Użyj pliku nagłówka specjalnie dla klucza, nie zobowiązuj go do kontroli źródła, i tylko prywatnie rozpowszechniaj go wśród zaufanych stron.

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ć.

Hugo
źródło
2

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.

Michael Shaw
źródło