Jak ukrywać "delikatne" dane w aplikacji?

0

Witam.

Zakładając że moja aplikacja ma np łączyć się z serwerem FTP (zawsze ten sam na to samo konto) - w jaki sposób poprawnie powinienem zapisywać dane na temat serwera w aplikacji ?
Używając zwykłych stringów, wyciągnięcie takich danych (co za tym idzie uzyskanie dostępu do serwera FTP) to chwila...

Z góry dziękuję za wyjaśnienie.

0

W ogóle generalnie nie powinieneś. Zwykle robi sie po drodze jakieś proxy. Proxy to aplikacja serwerowa, która autoryzuje i autentykuje klienta (twoją aplikację). Twoja aplikacja zna tylko adres tego proxy, a konfiguracje ftp zna tylko proxy.

0

A jak działa taki proxy ?

I w jaki sposób może odbywać się autentykacja ?
Osoba która dobierze się do kodu będzie również widziała co jest wysyłane do serwera (i znała jego adres) więc będzie mogła zrobić to samo chyba

0

To już zależy od tego co ta aplikacja w ogóle ma robić ;] Zwykle takie proxy stawia sie np. pomiędzy aplikacją kliencką a bazą danych, żeby nikt nie mógł sie do bazy zalogować bezpośrednio. Wtedy takie proxy ogranicza operacje które klient może wykonać.

Ale faktem jest że użytkownik aplikacji może na podstawie analizy kodu uzyskać identyczne możliwości jakie ma twoja aplikacja, tylko że tego nie przeskoczysz.

0

IMHO najlepiej dać każdemu użytkownikowi osobne dane dostępowe, wtedy można nadzorować w jaki sposób użytkownik korzysta z serwera, ograniczyć dostęp do danych pozostałych użytkowników i odebrać dostęp w razie potrzeby, bez wpływania na pracę pozostałych użytkowników.

2

Używając zwykłych stringów, wyciągnięcie takich danych (co za tym idzie uzyskanie dostępu do serwera FTP) to chwila...

Jak by nie kombinować, jeśli umieścisz po prostu w aplikacji hasło i username do FTP to (jeśli ktoś będzie chciał) to się źle skończy.

Zakładając nawet że ukryjesz te dane w sposób idealny (co jest niemożliwe), wystarczy krótka randka z wiresharkiem - bo to hasło przecież i tak musi być jakoś wysłane do serwera :P.

Dobre rozwiązanie to zrobienie jakiejś aplikacji serwerowej, do której użytkownik będzie się autoryzował i która będzie pozwolała dokładnie na tyle ile użytkownik powinien móc.

A złe rozwiązanie (ale odpowiadające na Twój post) to obfuskacja binarki - patrz np Dotfuscator (https://en.wikipedia.org/wiki/Dotfuscator) albo jeden z wielu innych obfuscatorów dla .net. Nie polecam, ale lepsze to niż nic...

0

Rozumiem, a czy znacie możecie polecić jakiś "kurs" tworzenia takiej aplikacji która obsługiwała by podstawowe zapytania (typu: wysyłam login i hasło i otrzymuje odpowiedź w stylu true lub false w zależności od tego czy użytkownik został znaleziony w bazie danych czy nie).

0

@Haskell to nie zawsze da sensowne efekty. Na przykład bazę danych można załatwić nawet jeśli twój dostęp jest mocno ograniczony. Wystarczy mieć dostęp do selecta na jednej tabeli (a jeśli nie masz to po co ci w ogóle dostęp do bazy? ;]) i można zabić bazę. Ot wystarczy zapytanie z kilkoma iloczynami kartezjańskimi i sortowaniem. Jak baza zacznie sortować z użyciem dysku to mogiła ;]

1

Dla hasła: "sftp authorization key c#"
znalazłem np. to:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/091bfb3b-73c5-406a-b7fc-214020dad3cf/sftp-communications-in-c-using-private-public-key

SFTP z kluczem zapewni że:

  • komunikacja będzie szyfrowana
  • nikt nie będzie mógł udawać serwera

Nie zapewni:

  • wykonania analizy odwrotnej aplikacji klienta i zasymulowania jego pracy.

Jeśli chcesz zabezpieczyć stację klienta przed analizą i podpięciem innej aplikacji to jedyny sposób jaki znam to zastosowanie "API key" - unikalny klucz stacji/aplikacji/klienta, który pozwoli na zablokowanie aplikacji/końcówki (czasowe lub trwałe) w momencie gdy zostaną wykryte nieprawidłowe żądania (za dużo IP, za dużo requestów).

W Linux są mechanizmy bezpiecznego przechowywania haseł (w momencie odczytu trzeba podać hasło "master"), ale w Windows - nie widziałem nic takiego.

Edit: w uzupełnieniu - kilka mechanizmów stosowanych do przechowywania haseł:

0

@Shalom - Akurat nie miałem na myśli db. Ale nawet w przypadku db można to chyba sensownie ominąć dając dostęp tylko do procedur, a nie do tabel. Na pewno osobne konto dla każdego usera to krok we właściwym kierunku i lepsze rozwiązanie niż wielu użytkowników logujących się na te same dane.

0

Nie ogarniam :/...

Znalazłem w sieci ten tutorial: http://www.asp.net/web-api/overview/older-versions/build-restful-apis-with-aspnet-web-api#Exercise1
Zrobiłem punkt pierwszy (Create a Read-Only Web API).
Projekt się kompiluje i uruchamia.

Co teraz ?
O ile dobrze rozumiem powinienem wrzucić ten projekt na serwer tak ?
"Super" pytanie: jak to zrobić ?
(szukałem w katalogu z projektem jakichś plików które mógłbym wrzucić na serwer ale nie skutecznie...)

1 użytkowników online, w tym zalogowanych: 0, gości: 1