flutter 代码混淆和SSL

代码混淆
代码混淆是将人类可读的代码转换成看似垃圾的读代码,使攻击者更难理解捆绑是否被反编译以进行反向工程。在 Flutter 2.0 + 上,本地平台默认已经做到了这一点,对于混淆 Dart 代码,我们可以包含——模糊标志以及带有模糊符号位置的—— split-debug-info 标志。然后可以使用这些符号将混淆后的代码转换回可读代码,以便在需要时调试问题。

flutter build appbundle --obfuscate --split-debug-info=./symbols/
Flutter build appbundle —— obfuscate —— split-debug-info = ./marks/
flutter build apk --obfuscate --split-debug-info=./symbols/
Flutter build apk —— obbuscate —— split-debug-info = ./marks/
flutter build ios --obfuscate --split-debug-info=./symbols/
Flutter build ios —— obbuscate —— split-debug-info = ./marks/
SSL Pinning
SSL 固定是一种安全措施,它将可信证书的身份固定在移动应用程序上,并阻止来自可疑服务器的未知文档。带有固定 SSL 证书的应用程序依赖于其存储的证书,而不是依赖于证书颁发机构存储许可证。使用这种技术,您可以在开发期间将 SSL 证书主机ーー可信证书列表固定到您的应用程序,并在运行期间进一步比较服务器证书与列表。

You can read more about SSL Pinning here: https://medium.com/@anuj.rai2489/ssl-pinning-254fa8ca2109

你可以在这里阅读更多关于 SSL 固定的内容: https://medium.com/@anuj.rai2489/SSL-Pinning-254fa8ca2109

Diagrammatic view of how SSL pinning works
Diagrammatic view of how SSL pinning works
SSL Pinning

因此,要实现这一点,我们需要:

Pem 格式的证书
预请求钩子处理程序
要获得所需格式的证书,首先需要从 Web 浏览器下载该证书,该证书将位于。Cerformat,然后使用以下命令:

openssl x509 -in cert.cer -out cert.pem
Openssl x509-in cert.cer.out cert.pem
然后在所选的 http 库中的预请求钩子处理程序中使用 verifyHandshake 函数。

import ‘dart:io’;

import ‘package:flutter/material.dart’;
import ‘package:flutter/services.dart’;
import ‘package:http/io_client.dart’;

Future get globalContext async {
final sslCert = await rootBundle.load(‘assets/certs/ryandsilva-dev.pem’);
final sc = SecurityContext(withTrustedRoots: false);
sc.setTrustedCertificatesBytes(sslCert.buffer.asInt8List());
return sc;
}

Future verifyHandshake(String url) async {
try {
final client = HttpClient(context: await globalContext);
client.badCertificateCallback = ((cert, host, port) => false);
final ioClient = IOClient(client);
await ioClient.get(Uri.parse(url));
return true;
} catch (e) {
debugPrint(‘Could not complete SSL handshake: ${e.toString()}’);
return false;
}
}

bool isSecureConnection = await verifyHandshake(‘https://ryandsilva.dev/’);
SSL Pinning

网络安全配置(Android 专用)
这是本机配置,使应用程序只能与强制 HTTPS 连接的允许域进行通信。Security_config.xml 文件应该包含应用程序需要与之通信的所有域的条目。Include 包含子域参数指定是否要包含主域的所有子域。如果选择不包括所有子域,则可以在域列表中单独指定每个子域。中添加到以下位置的每个域的证书。Pem 格式: android/app/src/main/res/raw 和 security_config.xml 文件位于 android/app/src/main/res/xml 文件夹中。




ryandsilva.dev 安全配置 ー Android

NSAppTransportation 安全(仅限 iOS)
这是本机配置,使应用程序只能与强制 HTTPS 连接的允许域进行通信。NSExceptionDomains 键应该包含应用程序需要与之通信的所有域的条目。NSPackesSubdomain 键指定是否要包括主域的所有子域。如果选择不包括所有子域,则可以在域列表中单独指定每个子域。下面的代码片段应该附加到 IOS/Runner 下的 Info.plist 文件。

NSAppTransportSecurity

NSExceptionDomains

ryandsilva.dev

NSIncludesSubdomains

NSTemporaryExceptionAllowsInsecureHTTPLoads




NSAppTransportSecurity Config — iOS

越狱及根源侦测
根据应用程序的类型,您可能希望限制在有根/破解设备上的使用。不允许您的应用程序在植根/破解设备上运行将阻止黑客访问设备上的应用程序数据和其他可能危害您的应用程序的活动。为此,我们将使用 flutter_jailbreak_check 包。

import ‘dart:io’;

import ‘package:flutter/services.dart’;
import ‘package:flutter_jailbreak_detection/flutter_jailbreak_detection.dart’;

Future checkJailbrokenOrRooted() async {
bool jailbrokenOrRooted = true;
try {
if (Platform.isAndroid) {
jailbrokenOrRooted = await FlutterJailbreakDetection.developerMode;
} else if (Platform.isIOS) {
jailbrokenOrRooted = await FlutterJailbreakDetection.jailbroken;
} else {
jailbrokenOrRooted = true;
}
return jailbrokenOrRooted;
} on PlatformException {
jailbrokenOrRooted = true;
return jailbrokenOrRooted;
}
}
根/ 越狱检测

谢谢!

你可能感兴趣的:(flutter,ssl,网络协议)