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ę.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.
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.
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
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.
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):
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.
- Użyj dwóch odpowiednich algorytmów szyfrowania/deszyfrowania łańcuchów, powiedzmy algorytm x i y.
- Umieść zaszyfrowane hasło db w aplikacji.config przed opublikowaniem go.
- Decypt app.config password (algo y) to connect the db for taking new encrypted string(real one).
- Zamknij połączenie i decyrpt nowy ciąg za pomocą algorytmu x, jeśli reflektor / itp. nie uciekam. Użyj go.
- Usuń obiekt, który trzyma łańcuch.
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