按照最佳做法正确地将API密钥存储在抖动中

时间:2018-08-17 12:12:13

标签: dart flutter

在我想在github上推送代码的情况下,在Flutter中添加秘密API密钥的正确方法(最佳实践)是正确的。我已经制作了一个使用API​​的简单应用程序,但是我以粗鲁的方式使用了该密钥,只是为了测试该应用程序是否正常工作。通常,根据我在后端开发应用程序的经验,密钥存储在某个位置并存储在其他文件中,然后将密钥简单地导入到需要API_KEY的所需文件中,并将文件排除在.gitignore文件中。

到目前为止,我还实现了这种方法:

文件夹树

-lib
  -auth
    -keys.dart
    -secrets.json 

secrets.json

在这里,我将添加KEY并在.gitignore中指定此文件,以免在我推送代码时将其添加到github中。

//Add API KEY HERE
{
  "api_key": "ee4444444a095fc613c5189b2"
}

keys.dart

import 'dart:async' show Future;
import 'dart:convert' show json;
import 'package:flutter/services.dart' show rootBundle;


class Secret {
  final String apikey;

  Secret({this.apikey=""});

  factory Secret.fromJson(Map<String, dynamic>jsonMap){
    return new Secret(apikey:jsonMap["api_key"]);
  }
}


class SecretLoader {
  final String secretPath;

  SecretLoader({this.secretPath});
  Future<Secret> load() {
    return rootBundle.loadStructuredData<Secret>(this.secretPath,
            (jsonStr) async {
          final secret = Secret.fromJson(json.decode(jsonStr));
          return secret;

        });
  }
}

我觉得这种方法太多了。我希望获得更好方法的建议。

4 个答案:

答案 0 :(得分:2)

如前所述,如果密钥是秘密密钥,而您想保护它,那就不要将其放在客户端应用程序中。该应用程序可以反编译,并且可以为愿意定位您的客户的人提取密钥。

我会将与此API进行通信的任务委托给您的Application Server。您可以将密钥放入服务器中,并使服务器与此外部API通信,并将响应中继到客户端。

编辑:另一种安全性较低但更方便的方法是使用诸如proguard之类的代码对代码进行混淆。有关Android应用程序上的抖动说明,请参见此页:https://flutter.io/android-release/

答案 1 :(得分:1)

对于安全存储,您必须依赖于相应的本机平台,iO和Android均提供了一种安全存储密钥的机制。您可以自己实现它,并使用颤动通道来获取和存储密钥。有关此机制的信息可以在这里阅读:

Android Keystore

iOs KeyChain

此外,您可以使用this flutter插件,该插件使用上述服务并提供dart对象来访问安全存储。

答案 2 :(得分:1)

使用Firebase Remote Config。在Firebase控制台内,在菜单内,向下滚动至Grow,然后向下滚动至Remote Config。您可以在此处添加带有值的参数。完成后,别忘了发布更改。有点微妙。

enter image description here

现在为Flutter安装firebase_remote_config

导入所有内容后,您可以使用以下代码检索值:

RemoteConfig remoteConfig = await RemoteConfig.instance;
await remoteConfig.fetch(expiration: Duration(hours: 1));
await remoteConfig.activateFetched();

remoteConfig.getValue('key').asString();

这样,API密钥或令牌就永远不会成为您应用程序的一部分。

注意::目前有一个issue,您会收到一条警告,指出未设置应用程序的名称,但这不会影响功能。

答案 3 :(得分:0)

您可以使用官方Flutter软件包中的flutter_secure_storage