Bezpieczne przechowywanie tajnych danych w aplikacji internetowej po stronie klienta

11

Mam tę aplikację internetową, która będzie w całości technologią po stronie klienta (HTML, CSS, JavaScript / AngularJS itp.). Ta aplikacja internetowa będzie współdziałać z interfejsem API REST w celu uzyskiwania dostępu i modyfikowania danych. Obecnie nie jest zadecydowane, jakiego rodzaju systemu uwierzytelniania będzie używać interfejs API REST.

Z mojego zrozumienia, każdy rodzaj systemu uwierzytelniania API (klucze API, OAuth 1/2 itd.) Będzie miał pewne dane, które muszą być utrzymywane w tajemnicy, w przeciwnym razie dostęp może zostać naruszony. W przypadku kluczy API klucze te same muszą być tajne, w przypadku OAuth 2 klient tajny / tokeny dostępu / tokeny odświeżania muszą być utrzymywane w tajemnicy, jestem pewien, że kilka z 4 kluczy zaangażowanych w OAuth 1 należy zachować w tajemnicy (nie zbyt duże doświadczenie z OAuth 1). Próbowałem zastanowić się, czy istnieje sposób na przechowywanie tych tajnych rzeczy w czystej aplikacji internetowej po stronie klienta bez pośredniej warstwy po stronie serwera.

Próbowałem o tym myśleć i nie mogę wymyślić żadnego miejsca do zrobienia tego. Mam na myśli, że nie mogę przechowywać go w javascript, ponieważ każdy może po prostu wyświetlić źródło lub otworzyć konsolę i pobrać dane. Nie jestem w 100% pewien, jak bezpieczne jest przechowywanie lokalne i czy użytkownicy mogą uzyskać dostęp do tych danych lub je modyfikować. Nawet jeśli lokalna pamięć masowa była bezpieczna, dwa sposoby, w jakie mogę myśleć o wprowadzeniu do niej danych, nie są. Jednym ze sposobów jest po prostu przechowywanie danych w kodzie źródłowym javascript, co jest najbardziej niepewną rzeczą, jaką mogę wymyślić. Teraz, gdybym używał czegoś takiego jak OAuth 2, w którym reszta interfejsu API dałaby mi tokeny, nadal nie byłoby to tak bezpieczne (lepiej niż pierwsza opcja), ponieważ te tokeny byłyby zwracane jako zwykły tekst, że każdy, kto może zobaczyć żądania wysyłane przez komputer mogą zobaczyć.

Czy jest jakiś sposób, aby aplikacja całkowicie działająca po stronie klienta mogła bezpiecznie przechowywać tajne dane bez jakiejś warstwy pośredniej po stronie serwera?

ryanzec
źródło
Localstorage jest specyficzny dla przeglądarki, ale biorąc pod uwagę Opera w systemie Windows jako przykład, to tylko niektóre pliki na dysku w folderze profilu użytkownika, więc zasadniczo nie jest chroniony.
Ross Patterson
Jednym ze sposobów byłoby zachowanie tajemnicy na serwerze w bazie danych i posiadanie identyfikatora aplikacji tylko na kliencie. Następnie wykonaj oauth zapytanie z serwera, więc jest to pewnego rodzaju podejście proxy.
Simon Polak,

Odpowiedzi:

9

Nie, nigdy nie będzie całkowicie bezpieczny. Użytkownik ma kontrolę nad sprzętem, a Ty próbujesz trzymać coś z dala od ich rąk. Ostatecznie MOGĄ to zrobić w ten czy inny sposób. Ponieważ pracujesz z javascript, twoja pozycja jest DUŻO gorsza niż normalnej aplikacji komputerowej, ponieważ użytkownik nie tylko kontroluje sprzęt, ale także kontroluje piaskownicę, w której pracujesz.

Możesz ukryć rzeczy i utrudnić dostęp do rzeczy, ale w końcu MOGĄ to wyciągnąć, jeśli wystarczająco się starają.

Michael Kohne
źródło
4
^ to. Jak „tajne” są tajne dane i ile czasu i pieniędzy naprawdę je chroni? Wystarczające mogą być starania w zakresie „standardów branżowych”.
DaveE
+1 Doskonała odpowiedź. Za pomocą debugera JavaScript mogę zmienić twoją aplikację, przeglądać wartości pośrednie itp. Jeśli chcę uzyskać informacje, zdobędę je.
Ross Patterson
2

Projektując systemy bezpieczeństwa, zawsze należy pomyśleć o modelu zagrożenia. „ Uczyń to bezpiecznym ” to głupiutki wymóg, niepodlegający działaniu ani weryfikacji. „ Zapobieganie wyodrębnianiu tokenów dostępu z aplikacji ” jest znacznie lepsze i określa granice rozwiązania. „ Uniemożliwianie innym uzyskiwania tokenów dostępu użytkownika ” jest również lepsze i definiuje zupełnie inną przestrzeń rozwiązania. Rozwiązania dla jednego niekoniecznie rozwiązują drugi ( np . Ten drugi absolutnie wymaga protokołu SSL, jeśli dotyczy WiFi, ale to w ogóle nie wpłynie na to drugie).

Ross Patterson
źródło
0

jedną z opcji jest przyznanie dostępu przez interfejs API REST na podstawie loginu użytkownika; może zwrócić token oparty na sesji (identyfikator guid, ciąg skrótu, cokolwiek chcesz), który można przekazać do innych wywołań interfejsu API REST w celu uwierzytelnienia dostępu

jeśli martwisz się przechowywaniem danych logowania użytkownika na komputerze klienta, nie rób tego, ale użytkownik będzie musiał za każdym razem wprowadzać informacje o koncie i hasło

nie jest tak dobrze zaznajomiony z OAuth i in., ale nie widzę żadnego ważnego powodu, aby przechowywać informacje uwierzytelniające w sposób trwały w ogóle ...

Steven A. Lowe
źródło
Jeśli chodzi o powody, zawsze istnieje „komfort”, który oczywiście jest archimemezą „bezpieczeństwa” i „bezpieczeństwa”.
henon