加密本機儲存

EncryptedLocalStore 類別 (ELS) 提供加密本機儲存機制,您可以將這個機制當做應用程式私有資料的小型快取來使用。ELS 資料無法在應用程式之間共用。ELS 的用途是,讓應用程式可以輕鬆地儲存重新建立的項目 (例如登入憑證) 和其他私有資訊。系統不會將 ELS 資料視為永久資料,如下面的「加密本機儲存區的限制」和「最佳作法」所述。

備註: 除了加密本機儲存區以外,AIR 也可為 SQL 資料庫的儲存內容加密。如需詳細資訊,請參閱 為 SQL 資料庫加密

您可以使用加密本機儲存區快取機密資訊 (例如,網路服務的登入認證),確保其安全性。ELS 很適合用來儲存必須對其他使用者保密的資訊。但是,它無法保護在相同使用者帳戶下執行之其他處理程序的資料。因此,不適用於保護機密的應用程式資料,例如 DRM 或加密金鑰。

在桌面平台上,AIR 在 Windows 中會使用 DPAPI (在 Mac OS 與 iOS 中使用 KeyChain,在 Linux 中則使用 KeyRing 或 KWallet) 使加密本機儲存區與每個應用程式及每個使用者產生關聯。加密本機儲存區會使用 AES-CBC 128 位元加密。

在 Android 上,不會加密 EncryptedLocalStorage 類別儲存的資料。資料改由作業系統提供的使用者層級安全功能來保護。Android 作業系統會針對每個應用程式指定個別的使用者 ID。應用程式只能存取它們自己的檔案與在公用位置建立的檔案 (例如抽取式記憶卡)。請注意,在根層級的 Android 裝置以根權限執行的應用程式,能夠存取其它應用程式的檔案。因為根層級的裝置不像非根層級的裝置,會在加密的本機儲存區提供高階的資料保護功能。

只有應用程式安全執行程序中的 AIR 應用程式內容才能存取加密本機儲存區中的資訊。

如果您更新 AIR 應用程式,更新的版本會保留加密本機儲存區中任何現有資料的存取權,除非您執行下列動作:

  • stronglyBound 參數設為 true 來加入這些項目。

  • 現有版本及更新版本都是在 AIR 1.5.3 之前發佈,而且更新會以移轉簽章來簽署.

加密本機儲存區的限制

加密本機儲存區中的資料受到使用者作業系統帳戶憑證的保護。其他實體除非以該使用者身份登入,否則無法存取儲存區的資料。不過,對於驗證的使用者所執行之其他應用程式存取的資料,並無法保護其安全。

由於使用者必須獲得驗證,這些攻擊才有作用,因此使用者的私人資料仍受到保護 (除非使用者帳戶本身有所洩漏)。 但您應用程式希望保持機密、不受到使用者存取的資料 (例如授權或數位版權管理的金鑰) 並不安全。 因此 ELS 並不是儲存這些資訊的適當位置。這裡僅適合儲存使用者的私人資料,如密碼。

ELS 的資料可能會因各種原因遺失。例如,使用者可能會解除安裝應用程式並刪除加密檔案。或者,發行者 ID 可能會在更新時遭到變更。因此,應該將 ELS 視為私人快取,而不是永久的資料儲存區。

不建議使用 stronglyBound 參數,不應將它設為 true 。將此參數設為 true 不會對資料提供任何額外的保護。同時,應用程式每次更新時,都會喪失資料的存取權,即使發行者 ID 不變也一樣。

如果儲存的資料超過 10 MB,加密本機儲存區的效能可能變慢。

解除安裝 AIR 應用程式時,解除安裝程式不會刪除加密本機儲存區中的資料。

最佳作法

使用 ELS 的最佳作法包括:

  • 使用 ELS 儲存密碼等機密使用者資料 (將 stronglyBound 設為 false)

  • 不要使用 ELS 儲存 DRM 金鑰或授權憑證等應用程式機密。

  • 可讓應用程式在遺失 ELS 資料時,重新建立儲存在 ELS 的資料。例如,在需要時提示使用者重新輸入帳戶憑證。

  • 請勿使用 stronglyBound 參數。

  • 如果您將 stronglyBound 設為 true ,請勿在更新期間移轉儲存的項目。而是在更新之後重新建立資料。

  • 僅儲存相當少量的資料。針對較大量的資料,請使用加密的 AIR SQL 資料庫。

將資料加入加密的本機儲存區

使用 EncryptedLocalStore 類別的 setItem() 靜態方法,將資料儲存在本機儲存區。資料將儲存於雜湊表,使用字串做為索引鍵,資料則儲存為位元組陣列。

例如,下列程式碼將某字串儲存於加密本機儲存區:

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

setItem() 方法的第三個參數 stronglyBound 是選擇性參數。將此參數設為 true 時,加密本機儲存區會將儲存的項目繫結至儲存者 AIR 應用程式的數位簽名和位元:

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

若以 stronglyBound 設為 true 的方式儲存項目,則後續對 getItem() 的呼叫要能成功,呼叫端 AIR 應用程式必須與儲存者應用程式相同 (假設應用程式目錄中的檔案均未發生資料變更)。如果呼叫端 AIR 應用程式不同於儲存者應用程式,呼叫 getItem() 擷取強式繫結的項目時便會擲回 Error 例外。應用程式一旦更新,將無法讀取先前寫入加密本機儲存區的強式繫結資料。 stronglyBound 參數在行動裝置上一律視為 false ,所以會忽略將該參數設定為 true

stronglyBound 參數設定成 false (預設值),只有發行者 ID 需要保持相同,應用程式才能讀取資料。應用程式的位元可能會變更 (且必須由相同的發行者簽署),但無須與儲存資料的應用程式保持完全相同的位元。擁有原始發行者 ID 的已更新應用程式可繼續存取資料。

備註: 實際作業時,將 stronglyBound 設為 true 並不會對資料提供任何額外的保護。「惡意」使用者仍然可以變更應用程式,獲得儲存在 ELS 項目的存取權。此外,資料是從外部進行保護,無論 stronglyBound 設為 true false ,非使用者威脅還是很容易入侵。 因為上述原因,不建議將 stronglyBound 設為 true

在加密本機儲存區中存取資料

您可使用 EncryptedLocalStore.getItem() 方法,從加密本機儲存區中擷取值,如下範例所示:

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

從加密本機儲存區移除資料

您可以使用 EncryptedLocalStore.removeItem() 方法,從加密本機儲存區刪除任何值,如下列範例所示:

EncryptedLocalStore.removeItem("firstName"); 

您可以呼叫 EncryptedLocalStore.reset() 方法,從加密本機儲存區中清除所有資料,如下列範例所示:

EncryptedLocalStore.reset();