Jak bezpiecznie osadzić statyczny łańcuch (klucz) w C#?

Szukam sposobu na bezpieczne przechowywanie klucza API w aplikacji WP7. Klucz jest ciągiem znaków i jest obecnie mocno zakodowany w kodzie (patrz poniżej). Wiem, że ktoś z programem odblaskowym mógłby to łatwo zobaczyć. Czy istnieje lepszy sposób na spakowanie tego klucza w ramach mojej aplikacji? Czy zasoby byłyby bezpieczniejsze?

string key = "DSVvjankjnersnkaecjnDFSD44VDS23423423rcsedzcadERVSDRFWESDVTsdt";

(to właściwie nie jest klucz ;))

Z góry dziękuję.
Author: silkfire, 2012-03-01

6 answers

Spójrz na zabezpiecz ciągi połączeń z bazą danych i inne wrażliwe Ustawienia w kodzie, jest to dobra lektura. Twoje pytanie znajduje się w sekcji" ukrywanie kluczy w kodzie źródłowym aplikacji".

Fragment:

Jeśli zdefiniujesz klucz w aplikacji, oprócz zaciemniania złożenia, spróbuj nie przechowywać rzeczywistych bajtów kluczy w kodzie źródłowym. Zamiast tego zaimplementuj logikę generowania kluczy przy użyciu trwałych cech, takich jak szyfrowanie algorytm, rozmiar klucza, hasło, wektor inicjalizacji i salt (zobacz przykład w Szyfruj i Odszyfruj dane za pomocą klucza symetrycznego (Rijndael) ). Spowoduje to wprowadzenie dodatkowej warstwy indrection, więc klucz nie będzie dostępny po prostu wyrzucając symbole z pliku binarnego aplikacji. Tak długo, jak nie zmienisz logiki generowania kluczy i cech klucza, uzyskany klucz będzie taki sam. Dobrym pomysłem może być również nie używanie ciągów statycznych jako generowania kluczy cechy, ale raczej budować je w locie. Inną sugestią byłoby traktowanie zespołu w taki sam sposób, jak powinien być traktowany magazyn danych, czyli poprzez zastosowanie odpowiednich ACL. I używaj tej opcji tylko w ostateczności, gdy żadna z innych technik ochrony danych nie działa, a jedyną alternatywą jest pozostawienie poufnych danych niezaszyfrowanych.

 21
Author: maka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-15 15:22:40

Przeczytałem wszystkie te odpowiedzi i nie sądzę, że jest jakiś sposób, aby bezpiecznie osadzić to-niezależnie od tego, gdzie to umieścisz, lub jak to zaciemnisz. Tak długo, jak jest w XAP i dekodowane w aplikacji, to zawsze będzie dostępny do hackingu.

Jeśli musisz przesłać klucz wewnątrz xap z rozsądnym stopniem ochrony, to myślę, że odpowiedź @maka daje najlepsze wyjście - zaciemnij go najlepiej jak potrafisz-ale nie myśl, że to cię zabezpieczy - tj. nie rób tego dla swoich mobilnych aplikacji bankowych!

Alternatywnie, jeśli naprawdę potrzebujesz bezpieczeństwa, nie działaj wyłącznie w aplikacji - użyj również serwera www. Facebook facebook to aplikacja, która pozwala na tworzenie aplikacji na Facebooku, a także na tworzenie aplikacji na Facebooku, w celu uwierzytelnienia użytkownika z aplikacji na stronę internetową na serwerze. Strona ta musiałaby następnie przeprowadzić użytkownika przez proces uzyskiwania tokena dostępu - a potem właśnie ten dostęp token (wraz z publicznym appid) musiałby wrócić do Twojej aplikacji. A dla tych serwisów internetowych, które wymagają znajomości tajnego klucza do każdego połączenia, obawiam się, że każde połączenie będzie prawdopodobnie musiało przejść przez twój serwer.

 10
Author: Stuart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-01 10:07:42

Możesz zaszyfrować Api klucz za pomocą ProtectedData, a następnie odszyfrować go w trybie runtime. To jest dobry samouczek jak szyfrować dane w Windows Phone: szyfrowanie w Mango

 5
Author: Ku6opr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-01 08:16:55

Może być można zaszyfrować go przed ręką i zapisać go w aplikacji.config. I podczas czytania go odszyfrować go za pomocą tego samego algorytmu.

 0
Author: Dipesh Bhatt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-01 08:17:49

Możesz użyć DotFuscator aby wyłączyć możliwość używania reflektora. Ale to nie pozwoli Ci zmienić klucza bez rekompilacji.

W przeszłości używałem następującej metody w innym oprogramowaniu (opartym na web / winform):

Http://weblogs.asp.net/jgalloway/archive/2008/04/13/encrypting-passwords-in-a-net-app-config-file.aspx

 0
Author: Peter R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-01 08:23:35

To może nie jest odpowiedź, ale na pewno to sugestia:

Przechowuj kodowany klucz w db. I przechowuj zaszyfrowane "hasło db" w aplikacji.config.

  1. Użyj dwóch odpowiednich algorytmów szyfrowania/deszyfrowania łańcuchów, powiedzmy algorytm x i y.
  2. Umieść zaszyfrowane hasło db w aplikacji.config przed opublikowaniem go.
  3. Decypt app.config password (algo y) to connect the db for taking new encrypted string(real one).
  4. Zamknij połączenie i decyrpt nowy ciąg za pomocą algorytmu x, jeśli reflektor / itp. nie uciekam.
  5. Użyj go.
  6. Usuń obiekt, który trzyma łańcuch.
 0
Author: Lost_In_Library,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-12 20:01:28