在Flutter应用程序中存储API凭据

Unn*_*nan 1 dart flutter flutter-dependencies

我在flutter应用程序中使用googleapis服务,该服务需要一些JSON格式的凭据。在我的应用程序中存储此凭据的最佳方法是什么?

我可以在自己的资产文件夹中保留一个JSON文件并在主函数中读取它吗?

还是应该在主要功能中对凭证进行硬编码?我是开发开发的新手。

我的代码如下所示

import 'package:googleapis/storage/v1.dart';
import 'package:googleapis_auth/auth_io.dart';

final _credentials = new ServiceAccountCredentials.fromJson(r'''
{
  "private_key_id": ...,
  "private_key": ...,
  "client_email": ...,
  "client_id": ...,
  "type": "service_account"
}
''');

const _SCOPES = const [StorageApi.DevstorageReadOnlyScope];

void main() {
  clientViaServiceAccount(_credentials, _SCOPES).then((http_client) {
    var storage = new StorageApi(http_client);
    storage.buckets.list('dart-on-cloud').then((buckets) {
      print("Received ${buckets.items.length} bucket names:");
      for (var file in buckets.items) {
        print(file.name);
      }
    });
  });
}
Run Code Online (Sandbox Code Playgroud)

我应该保留以下凭据:

{
  "private_key_id": ...,
  "private_key": ...,
  "client_email": ...,
  "client_id": ...,
  "type": "service_account"
}
Run Code Online (Sandbox Code Playgroud)

我不认为像上面这样的硬编码是个好主意。

我认为这应该工作:https : //medium.com/@sokrato/storing-your-secret-keys-in-flutter-c0b9af1c0f69

谢谢。

Ben*_*rth 11

评论:我不明白罗宾实际上是如何回答这个问题的。原始发布者需要应用程序具有访问 API 的凭据。使用安全密钥存储不会为应用程序提供任何数据,因此它仍然无法访问 API。如果您在项目中添加文件,那么安全密钥存储不会以任何方式保护文件。


2 方法

环境变量:我建议将环境变量用于根据环境而变化的变量:您可能有 2 个 API_KEYS,因为您有生产和测试环境。但是,您的应用程序的攻击者仍然可以通过“中间人”窃取您的请求,例如,使用代理程序。攻击者可以嗅探流量或反编译您的应用程序以窃取 API_KEYS 并在他们自己的情况下使用它们项目、漏洞利用或加密挖掘。因此,如果您使用环境变量,请确保您的 API 密钥不是那么强大。某些 API 提供商将允许您限制该密钥的权力。

后端:因此,如果 API_KEY 功能强大且不受限制,则根本不应该在应用程序上使用它。它应该在您的后端,它代表客户端调用外部 API。您可以托管服务器来执行此操作,或使用无服务器函数(例如 AWS Lambda、GCP 云函数、Azure 函数、Firebase 云函数等等)。


一个例子

这取决于您的威胁模型:您认为您的应用程序可能面临什么样的威胁。就我而言,我并不担心有人反编译我的黑客马拉松项目以窃取我免费获得的天气 API_KEY,但我担心某些 github 爬虫或 api 提供者找到了这个 api_key 并禁用它(这发生在我的与她的 Google Cloud Platform 服务帐户凭据的朋友)。所以,我正在使用环境变量。


Rob*_*ter 8

为了存储诸如凭证之类的敏感信息,您应该使用iOS下的Keychain和Android下的Keystore。

有一个完善的图书馆flutter_secure_storage

使用方法如下:

// Create storage
final storage = new FlutterSecureStorage();

// Store password 
await storage.write(key: "password", value: "my-secret-password");

// Read value 
String myPassword = await storage.read(key: "password");
Run Code Online (Sandbox Code Playgroud)

要使用它添加flutter_secure_storage: 3.2.1+1到您pubspec.yaml和运行flutter packages get在终端。

这是软件包以及有关如何使用它的更详细的示例:https : //pub.dartlang.org/packages/flutter_secure_storage

  • 这是 API 凭证,如 API 密钥。这不是我从用户那里得到的。我应该在哪里保存我的 api 密钥? (7认同)
  • 这基本上是一个与 Flutter 无关的问题。如果黑客可以访问您的二进制文件,那么将 API 密钥作为常量字符串存储在代码中的某处总是很容易被检测到的。有多种方法可以解决此类问题。例如,您可以使用用户名和密码实现某种 https 登录系统。然后,您的 API 可能会生成一个您可以安全存储的密钥。但这只是这样做的一种方式。 (5认同)
  • @RobinReiter 用于身份验证的 API 密钥怎么样?鸡蛋? (3认同)
  • 这并不能回答问题,他需要一种方法来存储 API KEY 而无需对其进行硬编码 (3认同)