加密本機儲存Adobe® AIR® 執行階段為使用者電腦安裝的每個 AIR 應用程式,都提供持續加密的本機儲存區 (ELS)。這可讓您以加密格式儲存和擷取儲存在使用者本機硬碟中的資料,而其它使用者則難以解譯這類加密的資料。每個 AIR 應用程式都擁有獨立的加密本機儲存區,而且每個 AIR 應用程式都會針對每位使用者規劃獨立的加密本機儲存區。 備註: 除了加密本機儲存區以外,AIR 也可為 SQL 資料庫的儲存內容加密。如需詳細資訊,請參閱為 SQL 資料庫加密。
您可以使用加密本機儲存區快取機密資訊 (例如,網路服務的登入認證),確保其安全性。ELS 很適合用來儲存必須對其他使用者保密的資訊。但是,它無法保護在相同使用者帳戶下執行之其他處理程序的資料。因此,不適用於保護機密的應用程式資料,例如 DRM 或加密金鑰。 AIR 在 Windows 中會使用 DPAPI (在 Mac OS 中使用 KeyChain,在 Linux 中則使用 KWallet) 使加密本機儲存區與每個應用程式及每個使用者產生關聯。加密本機儲存區會使用 AES-CBC 128 位元加密。 只有應用程式安全執行程序中的 AIR 應用程式內容才能存取加密本機儲存區中的資訊。 如果您更新 AIR 應用程式,更新的版本會保留加密本機儲存區中任何現有資料的存取權,除非您執行下列動作:
加密本機儲存區的限制加密本機儲存區中的資料受到使用者作業系統帳戶憑證的保護。其他實體除非以該使用者身份登入,否則無法存取儲存區的資料。不過,對於驗證的使用者所執行之其他應用程式存取的資料,並無法保護其安全。 由於使用者必須獲得驗證,這些攻擊才有作用,因此使用者的私人資料仍受到保護 (除非使用者帳戶本身有所洩漏)。 但您應用程式希望保持機密、不受到使用者存取的資料 (例如授權或數位版權管理的金鑰) 並不安全。 因此 ELS 並不是儲存這些資訊的適當位置。這裡僅適合儲存使用者的私人資料,如密碼。 ELS 的資料可能會因各種原因遺失。例如,使用者可能會解除安裝應用程式並刪除加密檔案。或者,發行者 ID 可能會在更新時遭到變更。因此,應該將 ELS 視為私人快取,而不是永久的資料儲存區。 不建議使用 stronglyBound 參數,不應將它設為 true。將此參數設為 true 不會對資料提供任何額外的保護。同時,應用程式每次更新時,都會喪失資料的存取權,即使發行者 ID 不變也一樣。 如果儲存的資料超過 10 MB,加密本機儲存區的效能可能變慢。 解除安裝 AIR 應用程式時,解除安裝程式不會刪除加密本機儲存區中的資料。 使用 ELS 的最佳作法包括:
將資料加入加密的本機儲存區使用 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 (預設值),只有發行者 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(); |
|