2013-04-16 11 views
5

Moje pytanie jest zasadniczo takie samo jak this one, ale dla aplikacji Windows Store, C# i Visual Studio. Chcę mieć łatwy sposób na zachowanie tajnych wartości w projekcie, w pliku, który można zignorować w kontrolce źródła (niezaznaczonej). W jaki sposób powinienem uporządkować swój projekt, aby przechowywać sekret aplikacji w sposób ułatwiający sterowanie budynkiem/źródłem?W jaki sposób należy obsługiwać tajne wartości w projekcie w kontroli źródła?

Mój pierwszy pomysł polegał na zapisaniu go w pliku XML (niezaznaczonym) i załadowaniu go w środowisku wykonawczym, ale pozostawia to użytkownikowi, który je instaluje, więc powinien być wykonany w czasie kompilacji. Jak mogę przechowywać kilka tajnych wartości i czy studio graficzne zastąpi je w moim kodzie, gdy mój projekt zostanie zbudowany?

+0

Nigdy nie stawiam tajemnic w kontroli źródła - dodaj je ręcznie, gdy nowy użytkownik pojawi się w projekcie. –

+0

Nie jest dla mnie jasne, dlaczego użytkownik, który "instaluje", ma dostęp do pliku XML, który nie jest kontrolowany przez źródło. Czy jest dołączony do twojego instalatora? Jeśli tak, usuń go i spraw, aby był zależny od czasu wykonywania. – Kohanz

+0

@PeterRitchie Dokładnie to mówię. Moje pytanie oznacza, jak mogę ułatwić proces tworzenia projektu * bez * posiadania tej wartości w kontroli źródła. Np. "Sprawdź projekt, a następnie wykonaj x z tajemnicą aplikacji". Edytowałem dla jasności. – xdumaine

Odpowiedz

0

W mojej firmie decydujemy się na rozwiązanie. W pliku konfiguracyjnym łączymy sekcje z "tajnymi" wartościami w zewnętrznych konfiguracjach. Zewnętrzne konfiguracje są kontrolowane przez źródło. Po pierwsze nie było, ale po problemie, gdy nasz serwer kompilacji zgubił dysk, zdecydowaliśmy, że bezpieczniej jest go przechowywać w miejscu, które ma kopię zapasową. Folder w kontroli źródła (może być również na serwerze plików) jest naprawdę ograniczony do odczytu i zapisu tylko dla osób, które tego potrzebują. Buduj konto procesu "folder projektu" plus folder "konfiguracja" i buduj. Po zakończeniu kompilacji folder "konfiguracja" zostaje usunięty. Dostęp do serwera kompilacji jest również ograniczony.

+0

Naprawdę szukam więcej rozwiązania technicznego w visual studio, jak przechowywać/zastępować te wartości. Nie martwię się o tworzenie kopii zapasowych ani sprawdzanie w tajemnicy aplikacji. – xdumaine

+0

Przechowuj plik konfiguracyjny kopiowania w miejscu, w którym prawie nikt nie ma dostępu, a także w projekcie kasy na serwerze budowania i tym pliku konfiguracyjnym. Możesz także użyć narzędzia takiego jak SnowCheetach i przechować tylko transfarmacje w "bezpiecznym" miejscu. Więcej informacji o narzędziu: http://www.hanselman.com/blog/SlowCheetahWebconfigTransformationSyntaxNowGeneralizedForAnyXMLConfigurationFile.aspx –

+0

To nie jest pomocne. Nigdy nie wspominałem o serwerze kompilacji, a to wciąż nie mówi mi nic o tym, jak i kiedy czytać ten plik. Moje pytanie brzmi: * techniczny * o czytaniu i używaniu wartości, a nie * semantycznym * o zabezpieczaniu go. – xdumaine

0

Jedną z opcji jest przechowywanie sekretów w kontroli kodu źródłowego, ale zapisywanie ich w postaci zaszyfrowanej. W środowisku programistycznym lub kompilacji użyj zmiennej środowiskowej do przechowywania klucza i odszyfrowywania w locie. W ten sposób uzyskasz korzyści z kontroli źródła, zachowując bezpieczeństwo informacji.

Jest to możliwe, nawet jeśli używasz app.config lub web.config, po prostu musisz zmodyfikować konfigurację z kodu przy starcie.

Erick

0

Updated
Jeśli umieścisz w tajemnicy w niezaufanym obszarze (np kontroli źródła publiczne), jest zagrożone. Nawet jeśli jest zaszyfrowany, z dostateczną starannością można go odzyskać.

Jedynym sposobem na utrzymanie go poza zasięgiem jest posiadanie usługi zewnętrznej, która współdziała z interfejsem API innej firmy. Ma to swoje własne kompromisy (np. Uwierzytelnienie użytkownika, o którym wspomniałeś w komentarzach). Zwłaszcza jeśli programiści muszą korzystać z interfejsu API strony trzeciej podczas testowania, nie widzę innej alternatywy, która ograniczy ekspozycję tajemnicy.

+0

Nie ma to nic wspólnego z samą aplikacją. Jest to tajemnica uwierzytelniania w stosunku do API strony trzeciej. Nigdy nie powiedziałem, że to dla konfiguracji aplikacji. – xdumaine

+0

Integracja Live Connect jest zewnętrzną integracją, ale jest skonfigurowana na poziomie Windows Store zamiast na poziomie aplikacji. Nieoptymalne obejście polega na tym, aby mieć pośrednią usługę, która odpowiada na żądania z twojej aplikacji i przekazuje je do tajnego interfejsu API strony trzeciej. W zależności od tego, kto kontroluje bezpieczeństwo serwera, sekret serwera może znajdować się w pliku konfiguracyjnym na serwerze i nigdzie indziej. –

+0

Co sugerujesz, to dodanie dodatkowego serwera, aby zapobiec sekretowi API? Nadal będę musiał uwierzytelnić użytkownika, ale teraz mam dodatkowy skok. Wydaje się to zbyteczne i nie zapewnia niczego lepszego niż szyfrowanie wartości. Jest to poza tym, że jest to związane z ochroną klucza przed użytkownikiem końcowym, zamiast z moim pytaniem, które dotyczy ochrony klucza przed kontrolą źródła/innymi programistami. – xdumaine

0

Utwórz nowy plik klasy w projekcie, który ma gniazda dla wszystkich tajnych wartości i przechowuje wartości pozorowane/testowe dla wszystkich z nich. Sprawdź to w kontrolerze źródłowym wraz z resztą projektu, aby ktokolwiek budując go bez dostępu do sekretów dostał jakąś wersję testową.

Następnie utwórz kopię tego pliku klasy z prawdziwymi tajnymi wartościami i umieść go poza kontrolą źródła. Napisz skrypt wsadowy w zdarzeniu pre-build, które szuka tego pliku klasy, a jeśli go znajdziesz, zastępuje go plikiem dummy zawartym w projekcie.

W ten sposób Twój projekt może nadal być w kontroli źródła i każdy może go sprawdzić, zbudować i uruchomić w trybie testowym. Twoje tajne pliki/wartości są przechowywane tylko na serwerze budowania, więc tylko podczas budowania projektu będą miały prawdziwe wartości.

Pamiętaj, aby gdzieś utworzyć kopię zapasową pliku tajnego. Pamiętaj też, że kod .NET może być łatwo dekompilowany, więc twoje sekrety mogą nie być tak tajne, jak ci się wydaje - każdy użytkownik z reflektorem .NET może zobaczyć cały kod w zespole zwalniającym, w tym tajną klasę.

Powiązane problemy