dart Flutter安全存储问题:无法读取或写入键和值

qgelzfjb  于 2023-03-21  发布在  Flutter
关注(0)|答案(3)|浏览(198)

我正在使用这个包来存储Flutter移动的应用程序中的一些登录凭据。我使用的版本是v5.0.2。我不确定我是否以正确的方式存储或阅读值。有人知道如何检查吗?或者我遗漏了什么或做错了什么。

import 'package:flutter_secure_storage/flutter_secure_storage.dart';

class SecureStorage {
  final _storage = const FlutterSecureStorage();

  Future<Map<String, String>> _readAll() async {
    return await _storage.readAll(
        iOptions: _getIOSOptions(), aOptions: _getAndroidOptions());
  }

  void deleteAll() async {
    await _storage.deleteAll(
        iOptions: _getIOSOptions(), aOptions: _getAndroidOptions());
    _readAll();
  }

  Future<String?> readSecureData(String key) async {
    return await _storage.read(key: key);
  }

  Future<void> deleteSecureData(String key) async {
    return await _storage.delete(key: key);
  }

  void writeSecureData(String key, String value) async {
    await _storage.write(
      key: key,
      value: value,
      iOptions: _getIOSOptions(),
      aOptions: _getAndroidOptions(),
    );
  }

  IOSOptions _getIOSOptions() => const IOSOptions(
        accessibility: IOSAccessibility.first_unlock,
      );

  AndroidOptions _getAndroidOptions() => const AndroidOptions(
        encryptedSharedPreferences: true,
      );
}

final secureStorage = SecureStorage();

这就是我调用值的方法

@override
  void initState() {
    Future.delayed(Duration.zero, () async {
      final username = await secureStorage.readSecureData('username') ?? '';
      final password = await secureStorage.readSecureData('password') ?? '';
      setState(() {
        _icNoController.text = username;
        _passwordController.text = password;
      });
    });
    super.initState();
  }

这是我如何存储值的

await secureStorage.writeSecureData('username', username);
await secureStorage.writeSecureData('password', password);
w6mmgewl

w6mmgewl1#

我认为阅读/写问题的原因可能是与使用aOptionsiOptions不一致。
例如,您将aOptionsreadAll()deleateAll()write()方法一起使用,而不将其与read()delete()一起使用。
因此,在将数据写入安全存储时在aOptions中使用encryptedSharedPreferences: true,时,您指定此数据必须写入EncryptedSharedPreferences
然而,当您读取数据而不提供aOptions再次,你尝试从默认的安全存储读取,这不是加密共享首选项,你已经存储了数据.示例与aOptions是为Android,我还没有测试这个库在iOS上.

0ve6wy6x

0ve6wy6x2#

我已经为你清理了课堂:

class SecureStorage {
  const _storage = FlutterSecureStorage();

  Future<Map<String, String>> _readAll() async {
    var map = <String, String>{};
    try {
      map = await _storage.readAll(
        iOptions: _getIOSOptions(),
        aOptions: _getAndroidOptions(),
      );
    } catch (e) {
      print(e);
    }
    return map;
  }

  Future<void> deleteAll() async {
    try {
      await _storage.deleteAll(
        iOptions: _getIOSOptions(),
        aOptions: _getAndroidOptions(),
      );
      // _readAll();
    } catch (e) {
      print(e);
    }
  }

  Future<String> readSecureData(String key) async {
    String value = "";
    try {
      value = (await _storage.read(key: key)) ?? "";
    } catch (e) {
      print(e);
    }
    return value;
  }

  Future<void> deleteSecureData(String key) async {
    try {
      await _storage.delete(key: key);
    } catch (e) {
      print(e);
    }
  }

  Future<void> writeSecureData(String key, String value) async {
    try {
      await _storage.write(
        key: key,
        value: value,
        iOptions: _getIOSOptions(),
        aOptions: _getAndroidOptions(),
      );
    } catch (e) {
      print(e);
    }
  }

  IOSOptions _getIOSOptions() => const IOSOptions(
    accessibility: IOSAccessibility.first_unlock,
  );

  AndroidOptions _getAndroidOptions() => const AndroidOptions(
    encryptedSharedPreferences: true,
  );
}

当然,我用的是Logger包而不是print,我也不明白为什么你在deleteAll之后做_readAll

答复

问:“我不确定是否以正确的方式存储或阅读值。”
存储和读取值的正确方法是将它们 Package 在try-catch块中,如上面的代码所示。
问:“有人知道如何检查吗?我遗漏了什么或做错了什么?”
A.看看上面的代码,看看如何用正确的方法来做,我个人认为这对我很有效。

i1icjdpr

i1icjdpr3#

在getter中使用const之后,我认为如果将const选项扔到FlutterSecureStorage构造函数中可能会更好,例如:

final _storage = const FlutterSecureStorage(
    iOptions: IOSOptions(accessibility: KeychainAccessibility.first_unlock),
    aOptions: AndroidOptions(encryptedSharedPreferences: true),
  );

相关问题