Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振中的安全性:谷歌地图颤振需要API密钥,但如何安全地提供它们? 这个问题怎么不重复?_Flutter_Google Maps_Dart_Api Key_Google Maps Flutter - Fatal编程技术网

Flutter 颤振中的安全性:谷歌地图颤振需要API密钥,但如何安全地提供它们? 这个问题怎么不重复?

Flutter 颤振中的安全性:谷歌地图颤振需要API密钥,但如何安全地提供它们? 这个问题怎么不重复?,flutter,google-maps,dart,api-key,google-maps-flutter,Flutter,Google Maps,Dart,Api Key,Google Maps Flutter,尽管@MrUpsidedown在评论部分提供了一些相关问题,但没有一个真正回答了我在这里试图强调的部分:如何安全地提供API密钥? 在阅读了所有相关问题的答案后,我倾向于自己写一个答案 上下文 我是一个非常新鲜的Flutter开发者,他试图将谷歌地图集成到一个演示应用程序中 为了节省时间,我决定尝试我能找到的最流行的谷歌地图小部件库,即。该库简洁的文档展示了Android和iOS的使用示例,并都说明了作为代码库的一部分,内联提供的API键: 导入UIKit 进口颤振 导入谷歌地图 @UIAppl

尽管@MrUpsidedown在评论部分提供了一些相关问题,但没有一个真正回答了我在这里试图强调的部分:如何安全地提供API密钥?

在阅读了所有相关问题的答案后,我倾向于自己写一个答案

上下文 我是一个非常新鲜的Flutter开发者,他试图将谷歌地图集成到一个演示应用程序中

为了节省时间,我决定尝试我能找到的最流行的谷歌地图小部件库,即。该库简洁的文档展示了Android和iOS的使用示例,并都说明了作为代码库的一部分,内联提供的API键:

导入UIKit
进口颤振
导入谷歌地图
@UIApplicationMain
@objc类AppDelegate:AppDelegate{
重写func应用程序(
_应用程序:UIApplication,
didFinishLaunchingWithOptions launchOptions:[UIApplication.launchOptions键:任意]?
)->布尔{

下面是我的研究结论

客户端设备是不受信任的环境 API密钥在客户端设备上不安全。从安全角度来看,客户端设备应被视为已被破坏

因此,以下每种方法都是不安全的:

  • 将API密钥直接存储在应用程序代码中。用户可以反编译应用程序,在调试器下运行应用程序等,并读取API密钥

  • 在应用程序中间接存储API密钥。通过环境变量提供API密钥实际上没有什么不同。这些密钥会印在构建应用程序的构件中,并且与前面的方法一样可读

  • 通过受控服务将API密钥传送到应用程序中。用户可能会干扰应用程序,就像篡改导致从远程服务器接收密钥时截获一样。换句话说,经典的API密钥

在理想情况下,API密钥永远不会离开服务器 是的,你说得对。你的API密钥应该存在于只有你才能访问的服务中。该服务应该作为你的应用程序正在进行的所有上游API调用的代理。你不会将密钥公开给客户端设备,因此它们不会从设备环境中被盗

然而,一个新的问题马上出现了:如何限制对API端点的访问?这是一个开放的问题,超出了这个答案的范围。我想指出的是,如果您为您的服务添加一个自己的API密钥,这在某种程度上会导致您遇到问题。不过,自己的API密钥是向前迈出的一步,因为您可以TTE客户端请求来自特定的客户端。换句话说,您确保自己能够控制事情,并且不会超过上游服务(如Google Maps API)的配额

但是,我不知道你如何才能可靠地识别出呼叫者是你的应用程序(如果你需要的话)。如果我理解正确,应用程序id是不可靠的,因为上一节-客户端设备不可信

google\u maps\u flatter上
google\u maps\u flatter
库仅在其文档中演示了通过在应用程序中硬编码来提供API密钥(见附录1)。这是不安全的

正如有人在Flatter的GitHub问题部分中注意到的那样,
google\u maps\u Flatter
没有推荐在应用程序中为生产环境硬编码API密钥。但是,它没有说明或建议可以从其他地方提供API密钥

更重要的是,它没有显示如何将代理服务器的响应/数据馈送到小部件本身,这是一个巨大的问题

有人建议我使用谷歌地图API服务本身来限制API密钥。以下是这些限制对Android和iOS的作用:

Android应用程序

添加您的软件包名称和SHA-1签名证书指纹,以限制Android应用程序的使用

iOS应用程序

使用您提供的捆绑包标识符接受来自iOS应用程序的请求

我看不出它是如何作为一个可靠的工具工作的。SHA-1密钥和捆绑标识不能在客户的手机上被篡改吗?!(我相信,他们可以。)

原问题的答案
  • 看起来,如今的图书馆用户不得不使用不可靠的密钥泄漏缓解技术。要么大多数颤振开发人员不想发出足够的噪音来修复问题,要么根本不理解问题,要么干脆放弃让它正常工作的想法
  • 目前,似乎不可能以安全的方式使用
    google\u maps\u flatter
    ,以避免API密钥泄露。
  • 如果该库为开发人员提供了一种将谷歌地图的响应/数据直接输入小部件的方法,事情就会发生变化,但我没有看到任何信息表明这是为可观察的未来计划的变化
  • 附录1 安卓

    在应用程序清单android/app/src/main/AndroidManifest.xml中指定API密钥:

    <manifest ...
      <application ...
        <meta-data android:name="com.google.android.geo.API_KEY"
                   android:value="YOUR KEY HERE"/>
    

    可能重复的可能重复的可能重复的@MrUpsidown所有链接的问题都是相关的和有帮助的。但是,他们中没有人明确地说了实话:不可能安全地将API密钥提供给Flatter应用程序。这一事实的逻辑结果是——确保API密钥的安全非常重要使它们对恶意的第三方毫无用处。@MrUpsidown这篇媒体文章没有提供任何处理密钥的线索。将密钥保留在源代码之外是这个问题中最小的问题。这是一个很好的分析。我同意
    #include "AppDelegate.h"
    #include "GeneratedPluginRegistrant.h"
    #import "GoogleMaps/GoogleMaps.h"
    
    @implementation AppDelegate
    
    - (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
      [GMSServices provideAPIKey:@"YOUR KEY HERE"];
      [GeneratedPluginRegistrant registerWithRegistry:self];
      return [super application:application didFinishLaunchingWithOptions:launchOptions];
    }
    @end