Flutter 保護你的APP資料安全

會煮咖啡的貓發表於2021-11-10

原文

https://medium.com/@mohammadE...

參考

正文

目前,大多數應用程式都包含支付或儲存一些重要的個人資料,這增加了資料被攻擊者利用或暴露的風險。

在這篇文章中,我將談論最有效的做法,以儘量減少 Flutter 應用程式中任何安全漏洞的風險,並設定儘可能多的路障,以任何攻擊者的方式。當然,這並不能保證你的應用程式是 100% 安全的。

讓我們開始

保護通訊層

https://www.guardsquare.com/e...

當攻擊者鎖定一個應用程式時,首先要做的事情之一就是檢視他們是否 能攔截在應用程式和伺服器後端之間傳遞的任何資料

1- 採用高度加密:

您可以通過使用 SSLTLS 等協議來實現這一點,這些協議很容易新增到您的程式碼中,並且很難妥協。

如果您正在處理特別敏感的資料,您甚至可能需要更進一步,在應用程式中構建一個類似 vpn 的解決方案。

2- 限制網路流量

將網路流量或連線限制到不安全端點的一種方法是顯式地將域名列為白名單。

要做到這一點,在 flutter 應用程式,我們需要為每個平臺做一些步驟:

android :

go to the android folder and create this file under

進入 android 資料夾,建立下面的檔案

res/xml/network_security_config.xml

然後複製這個並將其新增到建立的 xml 檔案中:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">YOURDOMAIN.com</domain>
        <trust-anchors>
            <certificates src="@raw/YOURCERTIFICATE"/>
        </trust-anchors>
    </domain-config>
</network-security-config>

for ios:

add this to the info.plist file:

把這個新增到 info.plist 檔案:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <false/>
  <key>NSExceptionDomains</key>
  <dict>
    <key>YOURDOMAIN.com</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSExceptionAllowsInsecureHTTPLoads</key>
      <true/>
    </dict>
  </dict>
</dict>

然後用你的伺服器域名替換 YOURDOMAIN.com

這樣做將確保您的應用程式不被允許與任何其他域通訊。

3- 認可證書

SSL pinning 解決了 MITM (Man In The Middle)攻擊。

怎麼做到的?

在簡單的語言中,您將從後端開發人員獲得一個伺服器證書檔案,並將證書釘在每個 API 呼叫中。因此,HTTP 客戶端將把這個證書作為一個可信賴的證書。現在,如果出現了 MITM,並且應用程式得到了一些錯誤的證書,那麼由於握手錯誤,API 呼叫將被中斷。

所以讓我們實現這個 Flutter :

最有可能的證書延長將是。“.cef” 但是這個擴充套件在 flutter 中不可讀,所以我們需要將其轉換為 “.pem” 使用這個命令。

_openssl x509 -inform der -in_ Certificate_.cer -out_ Certificate_.pem_

證書是您可以自己使用的檔名。

然後將證書作為資產新增到 pubspec.yaml

現在使用 Dio 包,我們可以管理應用程式中的所有請求:

final dio = Dio(); ByteData bytes = await rootBundle.load('assets/Certificate.pem');
(dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate  = (client) {
  SecurityContext sc = SecurityContext();
  sc.setTrustedCertificatesBytes(bytes.buffer.asUint8List());
  HttpClient httpClient = HttpClient(context: sc);
  return httpClient;
};

在這段程式碼中,我們從資產中讀取證書,並將其作為可信證書新增到 dio 例項的 http 客戶端。

現在,當使用這個 dio 例項向另一個伺服器發出任何請求時,由於伺服器的證書無效,我們將得到一個握手錯誤。

4-使身份認證刀槍不入

除了你的應用程式的資料流,下一個最常見的攻擊載體是它的認證方法的任何弱點。

因此,與伺服器進行雙因素身份驗證是必要的,也是值得實現的。

除此之外,你還需要注意如何處理像鑰匙交換這樣的事情。至少,您應該使用加密來保證這些事務的安全。

  • 到目前為止,我們已經盡力保護與伺服器的傳輸層。

現在我們開始保護應用本身。

保護申請

基本瞭解 Android app. Source — Pranay Airan.

1- 模糊編碼

編譯後的二進位制檔案和應用程式的程式碼可以被逆向設計。可以公開的內容包括字串、方法和類名以及 API 鍵。這些資料要麼是原始形式,要麼是純文字形式。

  • 你可以做的是使用 --obfuscate 引數時,建立您的 apk。
flutter build appbundle --obfuscate --split-debug-info=/<directory>

從本土的角度來說,你需要通過以下方式來處理這個問題:

android

/android/app/build.gradle 檔案中,新增以下內容:

android {
    ...
    buildTypes {
        release {
            signingConfig signingConfigs.release
            minifyEnabled true
            useProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

/android/app/proguard-rules.pro 中建立一個 ProGuard 配置檔案:

# Flutter
-keep class io.flutter.app. { *; }
-keep class io.flutter.plugin.  { *; }
-keep class io.flutter.util.  { *; }
-keep class io.flutter.view.  { *; }
-keep class io.flutter.  { *; }
-keep class io.flutter.plugins.  { *; }

使用 ProGuard,它不僅可以模糊你的程式碼,還可以幫助你縮小 Android 應用程式的大小。

iOS

如果你使用 Objective-C 或 Swift 來編譯 iOS,編譯器會去掉這些符號並對你的程式碼進行優化,這就使得攻擊者很難讀取你的程式碼的編譯輸出。

還有一些付費工具可以幫助你模糊程式碼: iXGuardVermatrix.

2- 越獄和植根裝置

越獄的 iOS 和安卓裝置有更多的特權,可能會給使用者的裝置帶來惡意軟體,從而繞過裝置的正常執行。

flutter_jailbreak_detection 是一個軟體包,它可以幫助你檢測你的應用是否正在一個越獄或根植的裝置上執行,

它在 Android 上使用 RootBeer on Android, and DTTJailbreakDetection ,在 iOS 上使用 DTTJailbreakDetection

而且很容易使用:

import 'package:flutter_jailbreak_detection/flutter_jailbreak_detection.dart';

bool jailbroken = await FlutterJailbreakDetection.jailbroken;
bool developerMode = await FlutterJailbreakDetection.developerMode; _// android only._

https://pub.dev/packages/flut...

3-保護使用者資料

為了儲存敏感的使用者資料,你不應該使用共享首選項或 sqflite,因為它很容易在任何裝置上開啟,因為你需要對儲存的資料進行加密,你可以使用 flutter_secure_storage

https://pub.dev/packages/flut...

這個軟體包使用了 Android 的 Keystore 和 iOS 的 Keychains。

還值得設定一個週期性時間,以便自動清除過期的資料快取。

4. 使用本地身份驗證

假設使用者手機被盜,並且您的應用程式已經安裝在手機上,並且它有一些支付資訊:)

為了防止任何訪問您的應用程式,您應該使用生物特徵識別認證使用此軟體包。

https://pub.dev/packages/loca...

5- 背景快拍預防

當一個應用程式被背景化時,作業系統會獲取任務切換器中最後一個可見狀態的快照。因此,防止後臺快照捕捉到賬戶餘額和付款細節是非常需要的。

用這個 secure_application 包就能解決這個問題

https://pub.dev/packages/secu...

他的外掛允許你保護你的應用程式內容不被點選檢視。

總結

最終,作為一個開發人員,這就是所有人對你的要求。

我還想提到“如何保護您的 Flutter 應用程式?” 是移動應用程式開發者在求職面試中最常見的問題,所以我希望這將是有用的。


© 貓哥

相關文章