@nativescript/secure-storage
Secure Storage NativeScript 插件
npm i --save @nativescript/secure-storage

@nativescript/secure-storage

在 iOS 上使用 SAMKeychain,在 Android 上使用 Hawk 实现安全存储。

npm install @nativescript/secure-storage

API

set | setSync

// require the plugin
import { SecureStorage } from "@nativescript/secure-storage";

// instantiate the plugin
const secureStorage = new SecureStorage();

// async
secureStorage.set({
key: "foo",
value: "I was set at " + new Date()
}).then(success => console.log("Successfully set a value? " + success));

// sync
const success = secureStorage.setSync({
key: "foo",
value: "I was set at " + new Date()
});

get | getSync

如果未找到,将返回 null

// async
secureStorage.get({
key: "foo"
}).then(value => console.log("Got value: " + value));

// sync
const value = secureStorage.getSync({
key: "foo"
});

remove | removeSync

// async
secureStorage.remove({
key: "foo"
}).then(success => console.log("Successfully removed a value? " + success));

// sync
const success = secureStorage.removeSync({
key: "foo"
});

removeAll | removeAllSync

// async
secureStorage.removeAll().then(success => console.log("Successfully removed a value? " + success));

// sync
const success = secureStorage.removeAllSync();

clearAllOnFirstRun | clearAllOnFirstRunSync

如果您想在应用重新安装时清除数据,则可以使用这些函数。

这对于 iOS 来说非常有用,因为如果您通过此插件向密钥链写入某些内容,当应用被卸载时,这些数据 不会 被删除。因此,下次安装相同的应用时,它将在密钥链中找到这些数据。

因此,如果您想清除先前安装中的“残留”数据,请确保在调用此插件提供的其他方法之前运行这些方法之一。

// async
secureStorage.clearAllOnFirstRun().then(success => {
console.log(success ? "Successfully removed all data on the first run" : "Data not removed because this is not the first run");
});

// sync
const success = secureStorage.clearAllOnFirstRunSync();

isFirstRun | isFirstRunSync

作为额外功能,您可以利用“首次运行”机制,在插件检测到这是首次运行(安装或安装-删除-重新安装后)时执行任何操作。

// sync
if (secureStorage.isFirstRunSync()) {
// do whatever you want
}

// async
secureStorage.isFirstRun().then(isFirst => {
// if isFirst is true, do whatever you like
});

iOS 安全++

默认情况下,该插件使用 kSecAttrAccessibleAlwaysThisDeviceOnly 访问控制密钥链。这意味着即使在设备锁定的情况下也可以访问密钥链值。如果您想增强安全性并且不需要后台访问,或者如果您想允许值被备份并迁移到其他设备,您可以使用以下链接中定义的任何密钥并当创建 SecureStorage 实例时传递它,例如

declare const kSecAttrAccessibleWhenUnlockedThisDeviceOnly; // This is needed in case you don't have tns-platform-declarations module installed. 
const secureStorage = new SecureStorage(kSecAttrAccessibleWhenUnlockedThisDeviceOnly);

iOS 模拟器

目前,此插件默认在 iOS 模拟器 上使用 NSUserDefaults。您可以通过向 SecureStorage 构造函数提供 disableFallbackToUserDefaults 来更改此行为。这样,在模拟器上就使用密钥链而不是 NSUserDefaults

如果您遇到类似于 issue_10 的问题,请考虑再次使用默认行为。

iOS 密钥链访问/应用组

您可以通过密钥链访问组或应用组在 iOS 应用/扩展之间共享秘密,有关详细信息,请参阅 此处

要设置

  • 通过在 app/App_Resources/iOS/<someName>.entitlements 文件中添加条目,将密钥链访问组权限添加到您的应用中。

    例如:

    <key>keychain-access-groups</key>
    <array>
    <string>$(AppIdentifierPrefix)com.my.app.sharedgroup</string>
    </array>
  • 然后,在您的应用中指定获取/设置值时的 accessGroup 属性。例如:

    import { SecureStorage } from "nativescript-secure-storage";
    export class MyComponent {
    secureStorage = new SecureStorage();
    // a method that can be called from your view
    setSecureValue() {
    this.secureStorage.set({
    accessGroup:"<TeamID>.com.my.app.sharedgroup",
    key: 'myKey',
    value: 'my value'
    }).then(success => { console.log(success)});
    }
    }

致谢

许可

Apache许可证版本2.0