【问题标题】:What's the best way to save jwt tokens in flutter apps?在颤振应用程序中保存 jwt 令牌的最佳方法是什么?
【发布时间】:2019-07-28 20:31:42
【问题描述】:

不仅仅是在哪里(例如:SQLite...),还有如何(库,最佳特定实践)?

【问题讨论】:

    标签: flutter jwt token


    【解决方案1】:

    正如我在已删除的帖子中提到的,我一直在使用 hive 来存储我的令牌和其他本地数据。使用hive 可以创建an encrypted box

    import 'dart:typed_data';
    import 'package:hive/hive.dart';
    
    void main() async {
      var keyBox = await Hive.openBox('encryptionKeyBox');
      if (!keyBox.containsKey('key')) {
        var key = Hive.generateSecureKey();
        keyBox.put('key', key);
      }
    
      var key = keyBox.get('key') as Uint8List;
      print('Encryption key: $key');
    
      var encryptedBox = await Hive.openBox('vaultBox', encryptionKey: key);
      encryptedBox.put('secret', 'Hive is cool');
      print(encryptedBox.get('secret'));
    }
    

    如cmets中所述:

    上面的示例将加密密钥存储在未加密的盒子中。你永远不应该那样做。

    重要:

    • 只有值被加密,而密钥以明文形式存储。
    • 确保在您的应用程序关闭时安全地存储加密密钥。借助 Flutter,您可以使用 flutter_secure_storage 或类似的包。
    • 不检查加密密钥是否正确。如果不是,则可能会出现意外行为。

    因此,如果您不需要任何hive 特定功能,flutter_secure_storage 应该是您更好的选择。

    【讨论】:

    • 这个加密盒子可以在两个应用之间共享吗?
    • 您正在使用未加密的盒子来存储加密密钥。违背了使用加密盒子的目的。
    • 根据Hive documentation,使用加密盒子时,您需要安全地保存加密密钥。在 Flutter 中,他们建议 flutter_secure_storage 以便您可以保存它。 我的建议:改用这个选项。
    • @BrenoTeodoro 是的。
    • 移动设备和桌面设备真的需要安全存储吗?因为在网络中我们通常将 jwt 令牌存储在 HttpOnly cookie 中,用户仍然可以从开发工具中看到内容,所以我猜除非对于 Flutter Web,否则您可以将 jwt(不是用户和密码,这是敏感数据)存储在任何地方(Hive , SQLite, Get Storage 等),在 android 中有一个加密的应用程序特定位置,只有您的应用程序可以访问,developer.android.com/training/data-storage/app-specific
    【解决方案2】:

    您可能不想将敏感数据存储在共享首选项中。相反,您可能想研究这样的插件: https://pub.dartlang.org/packages/flutter_secure_storage

    import 'package:flutter_secure_storage/flutter_secure_storage.dart';
    
    // Create storage
    final storage = new FlutterSecureStorage();
    
    // Write value 
    await storage.write(key: 'jwt', value: token);
    

    【讨论】:

    • flutter_secure_storage 目前不支持网络。 Flutter Web 支持的任何其他替代方案?
    • @fvisticot 我知道这个问题是一年多前提出的,但我将答案留给后人。基本上,没有办法将令牌存储在网络上的加密存储中。但是 IMO 使用共享首选项(实际上是 localStorage)作为网络的后备是足够安全的。
    【解决方案3】:

    使用https://pub.dartlang.org/packages/shared_preferences 最适合您,因为它“为简单数据提供持久存储”。

    示例代码:

    import 'package:flutter/material.dart';
    import 'package:shared_preferences/shared_preferences.dart';
    
    void main() {
      runApp(MaterialApp(
        home: Scaffold(
          body: Center(
          child: RaisedButton(
            onPressed: _getAndSaveToken,
            child: Text('Get token'),
            ),
          ),
        ),
      ));
    }
    
    _getAndSaveToken() async {
      SharedPreferences prefs = await SharedPreferences.getInstance();
      String token = await _getTokenFromHttp();
      await prefs.setInt('jwt', token);
    }
    
    Future<String> _getTokenFromHttp() async {
      // http code here
    }
    

    【讨论】:

    • 在同一个项目中使用多个此选项是否有意义?
    • 软件包描述本身表明“此插件不得用于存储关键数据”。它最适合应用内偏好设置,例如打开/关闭暗模式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 2021-03-31
    • 2021-11-28
    • 2020-09-26
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    相关资源
    最近更新 更多