Zaszyfrowany magazyn lokalnyŚrodowisko Adobe® AIR® udostępnia trwały magazyn danych lokalnych (ELS) każdej aplikacji AIR zainstalowanej na komputerze użytkownika. Magazyn taki umożliwia zapisywanie i pobieranie danych przechowywanych na lokalnym dysku twardym użytkownika w formacie zaszyfrowanym, którego inni użytkownicy nie są w stanie w prosty sposób rozszyfrować. Dla każdej aplikacji AIR używany jest odrębny lokalny magazyn danych zaszyfrowanych i każda aplikacja AIR używa odrębnego magazynu dla każdego użytkownika. 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. Środowisko AIR do powiązania szyfrowanego 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 zaszyfrowany przy użyciu algorytmu 128-bitowego AES-CBC. 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:
Ograniczenia szyfrowanego magazynu lokalnegoDane 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. Dobre praktyki przy korzystaniu z szyfrowanego magazynu lokalnego:
Dodawanie danych do zaszyfrowanego magazynu lokalnegoMetoda 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 wypadku zmodyfikowania aplikacji nie będzie możliwe odczytanie silnie powiązanych danych zapisanych wcześniej w zaszyfrowanym magazynie lokalnym. 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 lokalnymIstnieje 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 lokalnegoIstnieje 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(); |
|