Zaszyfrowany magazyn lokalny

Klasa EncryptedLocalStore (ELS) udostępnia mechanizm zaszyfrowanego magazynu lokalnego, który może służyć jako mały bufor na prywatne dane aplikacji. Dane ELS nie mogą być współużytkowane przez aplikacje. Dzięki danym ELS aplikacja może przechowywać elementy łatwe do ponownego utworzenia, takie jak poświadczenia logowania i inne informacje osobiste. Dane ELS nie mają charakteru trwałego, co opisano w poniższych tematach „Ograniczenia szyfrowanego magazynu lokalnego” i Sprawdzone procedury”.

Uwaga: Poza szyfrowanym magazynem lokalnym środowisko AIR zapewnia również szyfrowanie dla treści zapisanej w bazach danych SQL. Szczegółowe informacje zawiera sekcja Korzystanie z szyfrowania w bazach danych SQL .

Lokalny magazyn zaszyfrowany jest przydatny do przechowywania informacji, które muszą być zabezpieczone, takie jak poświadczenia logowania dla usług Web Service. Szyfrowany magazyn lokalny nadaje się do przechowywania informacji, które nie powinny być ujawniane innym użytkownikom. Nie chroni on jednak danych przed innymi procesami działającymi w ramach tego samego konta użytkownika. Nie nadaje się zatem do ochrony tajnych danych aplikacji, takich jak informacje DRM lub klucze szyfrowania.

Na platformach komputerowych środowisko AIR do kojarzenia zaszyfrowanego magazynu lokalnego z każdą aplikacją i użytkownikiem używa interfejsu DPAPI w systemie Windows, KeyChain w systemie Mac OS oraz KeyRing lub KWallet w systemie Linux. Magazyn lokalny jest szyfrowany przy użyciu algorytmu AES-CBC z kluczem 128-bitowym.

W systemie Android dane przechowywane w klasie EncryptedLocalStorage nie są szyfrowane. Zamiast tego dane są chronione za pomocą udostępnianego przez system operacyjny mechanizmu zabezpieczeń na poziomie użytkownika. System operacyjny Android przypisuje oddzielny identyfikator użytkownika do każdej aplikacji. Aplikacje mogą uzyskiwać dostęp tylko do plików własnych i utworzonych w lokalizacjach publicznych (takich jak wymienna karta pamięci). Na urządzeniach z systemem Android, które obsługują użytkownika root, aplikacje uruchomione z uprawnieniami tego użytkownika MOGĄ uzyskiwać dostęp do plików innych aplikacji. Dlatego na takich urządzeniach zaszyfrowany magazyn lokalny nie oferuje tak wysokiego poziomu ochrony danych, jaki jest dostępny na urządzeniach bez użytkownika root.

Informacje o zaszyfrowanym magazynie lokalnym są dostępne tylko do treści aplikacji AIR w obszarze izolowanym bezpieczeństwa aplikacji.

W wypadku aktualizacji aplikacji AIR zaktualizowana wersja zachowuje dostęp do istniejących danych w szyfrowanym magazynie lokalnym, chyba że:

  • Elementy dodawano do magazynu z parametrem stronglyBound ustawionym na true .

  • Zarówno dotychczasowa, jak i zaktualizowana wersja zostały opublikowane wcześniej niż wersja 1.5.3 środowiska AIR, a aktualizacja jest podpisana przy użyciu podpisu migracyjnego.

Ograniczenia szyfrowanego magazynu lokalnego

Dane w szyfrowanym magazynie lokalnym są chronione poświadczeniami konta użytkownika w systemie operacyjnym. Inne podmioty nie mogą uzyskać dostępu do danych w magazynie, chyba że mogą zalogować się jako odpowiedni użytkownik. Dane nie są jednak zabezpieczone przed dostępem innych aplikacji uruchomionych przez uwierzytelnionego użytkownika.

Aby tego rodzaju atak powiódł się, użytkownik musi być uwierzytelniony, dlatego dane prywatne użytkownika wciąż są chronione (o ile konto użytkownika nie zostanie wykorzystane w sposób nieuprawniony). Jednak dane aplikacji, które nie powinny być ujawniane użytkownikom, takie licencji i mechanizmu DRM, nie są bezpieczne. Dlatego zaszyfrowany magazyn lokalny nie jest odpowiednim miejscem do przechowywania takich informacji. Jest on przeznaczony do przechowywania danych poufnych użytkownika, takich jak hasła.

Dane zapisane w szyfrowanym magazynie lokalnym mogą zostać z różnych przyczyn utracone. Na przykład użytkownik może odinstalować aplikację i usunąć zaszyfrowany plik. Ewentualnie, w wyniku aktualizacji, może ulec zmianie identyfikator wydawcy. Zaszyfrowany magazyn lokalny powinien być traktowany jako osobista pamięć podręczna, nie zaś jako pamięć trwała.

Parametr stronglyBound ma status przestarzałego i nie należy go ustawiać na true . Ustawienie tego parametru na true nie zapewnia żadnej dodatkowej ochrony danych. Spowoduje natomiast, że po każdej aktualizacji aplikacji nastąpi utrata dostępu do danych — nawet jeśli identyfikator wydawcy nie ulegnie zmianie.

Zaszyfrowany magazyn lokalny może działać wolniej, jeśli objętość zapisanych danych przekracza 10 MB.

Podczas odinstalowywania aplikacji AIR program odinstalowujący nie usuwa danych zapisanych w zaszyfrowanym magazynie lokalnym.

Sprawdzone procedury

Dobre praktyki przy korzystaniu z szyfrowanego magazynu lokalnego:

  • Szyfrowanego magazynu lokalnego należy używać do przechowywania danych użytkownika objętych szczególną ochroną, na przykład haseł (ustawiając parametr stronglyBound na false).

  • W szyfrowanym magazynie lokalnym nie należy przechowywać tajnych informacji aplikacji, takich jak klucze DRM lub tokeny licencyjne.

  • Należy wyposażyć aplikację w mechanizm odtwarzania danych z szyfrowanego magazynu lokalnego, na wypadek gdyby doszło do ich utraty. Mechanizm ten może np. polegać na ponownym wyświetleniu monitu o wprowadzenie poświadczeń użytkownika.

  • Nie należy używać parametru stronglyBound .

  • Jeśli parametr stronglyBound zostanie ustawiony na true , przy aktualizacji aplikacji nie należy przeprowadzać migracji elementów zapisanych w magazynie. Po aktualizacji należy odtworzyć dane.

  • W szyfrowanym magazynie lokalnym należy przechowywać dane o stosunkowo niewielkiej objętości. W przypadku większych ilości danych należy użyć bazy danych AIR SQL z szyfrowaniem.

Dodawanie danych do zaszyfrowanego magazynu lokalnego

Metoda setItem() klasy EncryptedLocalStore umożliwia zapisywanie danych w magazynie lokalnym. Dane są przechowywane w tabeli mieszania, w której kluczami są ciągi znaków, a właściwe dane mają postać tablic bajtów.

Na przykład poniższy kod zapisuje ciąg znaków w zaszyfrowanym magazynie lokalnym:

var str:String = "Bob"; 
var bytes:ByteArray = new ByteArray(); 
bytes.writeUTFBytes(str); 
EncryptedLocalStore.setItem("firstName", bytes);

Trzeci parametr metody setItem() stronglyBound — jest opcjonalny. W przypadku ustawienia tego parametru na wartość true zaszyfrowany magazyn lokalny wiąże zapisany element z podpisem cyfrowym i kodem bitowym aplikacji AIR:

var str:String = "Bob"; 
var bytes:ByteArray = new ByteArray(); 
bytes.writeUTFBytes(str); 
EncryptedLocalStore.setItem("firstName", bytes, false); 

W przypadku elementu zapisanego z parametrem stronglyBound ustawionym na true późniejsze wywołania metody getItem() kończą się powodzeniem tylko wówczas, gdy wywołująca aplikacja AIR jest identyczna z aplikacją zapisującą (jeśli nie uległy zmianie żadne dane w plikach zapisanych w katalogu aplikacji). Jeśli wywołująca aplikacja AIR jest różna od aplikacji zapisującej, to aplikacja generuje wyjątek Error przy próbie wywołania metody getItem() dla elementu silnie powiązanego. W przypadku zmodyfikowania aplikacji nie będzie możliwe odczytanie silnie powiązanych danych zapisanych wcześniej w zaszyfrowanym magazynie lokalnym. Ustawienie dla właściwości stronglyBound wartości true na urządzeniach przenośnych jest ignorowane. Parametr ten jest zawsze traktowany tak, jakby miał wartość false .

Jeśli parametr stronglyBound jest ustawiony na false (domyślnie), wówczas tylko identyfikator wydawcy musi pozostać taki sam, aby aplikacja mogła odczytywać dane. Kod bitowy aplikacji może być zmieniony (ale podpisany przez tego samego wydawcę) w stosunku do aplikacji, która zapisała dane. Zaktualizowane aplikacje o tym samym, co oryginalny, identyfikatorze wydawcy, mają nadal dostęp do danych.

Uwaga: W praktyce ustawienie dla parametru stronglyBound wartości true nie powoduje zwiększenia stopnia ochrony danych. Nadal istnieje możliwość, że złośliwy użytkownik dokona zmian w aplikacji w celu uzyskania dostępu do danych zapisanych w zaszyfrowanym magazynie lokalnym. Co więcej, dane są chronione przed zagrożeniami zewnętrznymi (niepochodzącymi od użytkownika) dokładnie tak samo, niezależnie od tego, czy parametr stronglyBound ma wartość true , czy false . Z tego względu odradza się ustawienie parametru stronglyBound na wartość true .

Dostęp do danych w zaszyfrowanym magazynie lokalnym

Istnieje możliwość pobrania wartości z zaszyfrowanego magazynu lokalnego za pomocą metody EncryptedLocalStore.getItem() , co ilustruje poniższy przykład:

var storedValue:ByteArray = EncryptedLocalStore.getItem("firstName"); 
trace(storedValue.readUTFBytes(storedValue.length)); // "Bob" 

Usuwanie danych z zaszyfrowanego magazynu lokalnego

Istnieje możliwość usunięcia wartości z zaszyfrowanego magazynu lokalnego za pomocą metody EncryptedLocalStore.removeItem() , co ilustruje poniższy przykład:

EncryptedLocalStore.removeItem("firstName"); 

Wywołanie metody EncryptedLocalStore.reset() umożliwia wyczyszczenie wszystkich danych z zaszyfrowanego magazynu lokalnego, co ilustruje poniższy przykład:

EncryptedLocalStore.reset();