包 | flash.data |
类 | public class EncryptedLocalStore |
继承 | EncryptedLocalStore Object |
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 |
ELS 数据不能在应用程序之间实现共享。ELS 的目的是允许应用程序方便地存储重新创建的项目,如登录凭据和其他隐私信息。不应将 ELS 数据视为永久性的,请参见下面的“加密本地存储区的限制”和“使用 ELS 的最佳做法”。
AIR 配置文件支持:AIR for TV 设备不支持此功能。您可以使用 EncryptedLocalStore.isSupported
属性在运行时测试是否受支持。有关在多个配置文件之间支持 API 的详细信息,请参阅 AIR 配置文件支持。
AIR 为安装在用户计算机或设备上的每个 AIR 应用程序都提供了一个加密本地存储区 (ELS)。这样,您就可以以加密格式保存和检索存储在用户本地硬盘驱动器上的数据,使其他用户不能轻易地对这些数据进行解密。为每个 AIR 应用程序使用一个单独的加密本地存储区,且每个 AIR 应用程序为计算机上的每个用户帐户使用一个单独的加密本地存储区。
使用加密本地存储区可以缓存需要得到很好保护的信息,如用于 Web 服务的登录凭据。ELS 适用于存储不能向其他用户公开的信息。但是,它不能防止这些信息被同一用户帐户下运行的其他进程使用。因此,它不适用于保护机密应用程序数据,例如 DRM 或加密密钥。
通过在 Windows 中使用 DPAPI,在 Mac OS 和 iOS 中使用 KeyChain,以及在 Linux 中使用 KeyRing 或 KWallet,AIR 将加密本地存储区与每个应用程序和用户相关联。加密本地存储区使用 AES-CBC 128 位加密。
在 Android 上,EncryptedLocalStorage 类存储的数据未加密。而该数据由操作系统提供的用户级别的安全性进行保护。Android 操作系统为每个应用程序分配一个单独的用户 ID。应用程序只能访问自己的文件和在公共位置创建的文件(如移动存储卡)。注意,在 Android 的根设备上,使用根权限运行的应用程序可以访问其他应用程序的文件。因此,在根设备上,加密的本地存储不提供与非根设备上级别一样高的数据保护。
加密本地存储区中的信息仅可用于应用程序安全沙箱中的 AIR 应用程序内容。
如果更新 AIR 应用程序,更新版本将保留对加密本地存储区中任何现有数据的访问权限,下列情况除外:
- 使用设置为
true
的stronglyBound
参数添加的项 - 您已从 AIR 3.2 命名空间升级到 AIR 3.3(在 AIR 3.2 和 AIR 3.3 之间,Mac OS 和 Windows 的加密本地存储的物理位置已发生变化)
- 现有和更新版本的发布均早于 AIR 1.5.3,并且更新使用迁移签名进行签名
加密本地存储区的限制
加密本地存储区中的数据由用户的操作系统帐户凭据保护。其他实体无法访问该存储区中的数据,除非他们可以使用该用户的身份登录。但是,无法防止数据被已验证的用户运行的其他应用程序访问。因此,应用程序可能对用户保密的数据(如用于授权或数字权限管理的密钥)是不安全的。ELS 不是存储此类信息的适当位置。它只是用于存储用户的隐私数据(如密码)的适当位置。
出于各种原因,ELS 中的数据可能会丢失。例如,用户可能会卸载应用程序并删除加密的文件。或者,发布者 ID 可能会由于更新而更改。因此,应将 ELS 视为私有缓存,而非永久性数据存储。
不推荐使用 stronglyBound
参数,因此不应将其设置为 true
。将此参数设置为 true
不会为数据提供任何额外保护。同时,当应用程序更新时将丢失对数据的访问权限,即使发布者 ID 保持不变。
若存储的数据超过 10 MB,加密本地存储将进行得更慢。
当卸载 AIR 应用程序时,卸载程序不会删除存储在加密本地存储中的数据。
使用 ELS 的最佳做法
使用 ELS 的最佳做法包括:
- 使用 ELS 存储密码等敏感用户数据(将
stronglyBound
设置为false
) - 请不要使用 ELS 存储应用程序机密,例如 DRM 密钥或许可令牌
- 如果 ELS 数据丢失,为您的应用程序提供一种重新创建在 ELS 中存储的数据的方法。例如,通过在必要时提示用户重新输入他们的帐户凭据。
- 请不要使用
stronglyBound
参数。 - 如果必须将
stronglyBound
设置为true
,请不要在更新期间迁移存储的项。在更新之后再重新创建数据。 - 只存储相对少量的数据。对于大量数据,使用加密的 AIR SQL 数据库。
加密的本地存储中的项目用字符串进行标识。所有项目都存储为字节数组数据。
属性 | 由以下参数定义 | ||
---|---|---|---|
constructor : Object
对类对象或给定对象实例的构造函数的引用。 | Object | ||
isSupported : Boolean [静态] [只读]
如果当前平台支持 EncryptedLocalStore 类,则 isSupported 属性设置为 true,否则设置为 false。 | EncryptedLocalStore |
方法 | 由以下参数定义 | ||
---|---|---|---|
[静态]
与指定的名称对应的数据。 | EncryptedLocalStore | ||
表示对象是否已经定义了指定的属性。 | Object | ||
表示 Object 类的实例是否在指定为参数的对象的原型链中。 | Object | ||
表示指定的属性是否存在、是否可枚举。 | Object | ||
[静态]
从加密本地存储中删除具有给定名称的项目。 | EncryptedLocalStore | ||
[静态]
清除整个加密本地存储,从而删除所有数据。 | EncryptedLocalStore | ||
[静态]
用指定的名称存储 ByteArray 对象。 | EncryptedLocalStore | ||
设置循环操作动态属性的可用性。 | Object | ||
返回此对象的字符串表示形式,其格式设置遵守区域设置特定的约定。 | Object | ||
返回指定对象的字符串表示形式。 | Object | ||
返回指定对象的原始值。 | Object |
isSupported | 属性 |
getItem | () | 方法 |
public static function getItem(name:String):ByteArray
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 |
与指定的名称对应的数据。
如果不存在具有指定名称的项目,则此方法返回 null
。
参数
name:String — 加密的本地存储中的项目的名称。
|
ByteArray — ByteArray 数据。如果没有用于所提供的 name 的数据,则该方法返回 null 。
|
引发
ArgumentError — name 值为 null 或空字符串。
|
removeItem | () | 方法 |
public static function removeItem(name:String):void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 |
从加密本地存储中删除具有给定名称的项目。
参数
name:String — 加密的本地存储中的项目的名称。
|
引发
ArgumentError — name 值为 null 或空字符串。
|
reset | () | 方法 |
setItem | () | 方法 |
public static function setItem(name:String, data:ByteArray, stronglyBound:Boolean = false):void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 |
用指定的名称存储 ByteArray 对象。
参数
name:String — 加密的本地存储中的项目的名称。
| |
data:ByteArray — 数据。
| |
stronglyBound:Boolean (default = false ) — (不推荐使用)stronglyBound 参数应设置为 false (默认值)。如果设置为 true ,当任何应用程序文件发生更改时,无法检索存储的项。例如,如果用户安装应用程序更新,则更新的应用程序无法读取先前写入到加密本地存储区的任何强绑定数据。
|
引发
ArgumentError — name 值为 null 或空字符串。
| |
ArgumentError — data 值为 null 。
|
var str:String = "Bob"; var bytes:ByteArray = new ByteArray(); bytes.writeUTFBytes(str); EncryptedLocalStore.setItem("firstName", bytes); var storedValue:ByteArray = EncryptedLocalStore.getItem("firstName"); trace(storedValue.readUTFBytes(storedValue.length)); // "Bob" EncryptedLocalStore.removeItem("firstName");
Tue Jun 12 2018, 11:04 AM Z