Flutter安全客户端插件security_client的使用

Flutter安全客户端插件security_client的使用

简介

Flutter Security Client 是一个非常简单的安全客户端库,用于本地存储加密数据。该项目使用 SQLite 作为加密密钥的数据库,并通过 sqflite 库集成 SQLCipher 层来实现加密功能。


关于

此项目的核心特点包括:

  • 使用 SQLite 存储加密后的密钥。
  • 使用 SQLCipher 提供强大的加密功能。
  • 支持跨平台(iOS 和 Android)。

开始使用

要开始使用 SecurityClient,您只需传递两个参数即可创建实例:

安装步骤

  1. 确保您的项目已安装 sqflitepath_provider 插件。

    dependencies:
      sqflite: ^2.0.0+4
      path_provider: ^2.0.9
    
  2. 导入必要的库:

    import 'package:sqflite/sqflite.dart';
    import 'package:path/path.dart';
    import 'package:path_provider/path_provider.dart';
    

创建实例

// 创建 SecurityClient 实例
final SecurityClient securityClient = await SecurityClient.create("<db-name>", "<db-password>");

// 示例:使用自定义数据库名和密码
final SecurityClient securityClient = await SecurityClient.create("my-cool-database", "1234567890");

多实例支持

您可以同时创建多个实例,每个实例都会使用独立的数据库文件:

final SecurityClient client1 = await SecurityClient.create("client1-db", "password1");
final SecurityClient client2 = await SecurityClient.create("client2-db", "password2");

API 文档

更多方法信息可以参考官方文档: https://bfpimentel.github.io/flutter-security/security/SecurityClient-class.html


示例代码

以下是一个完整的示例,展示如何使用 SecurityClient 进行加密和解密操作:

示例代码

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart'; // 如果在桌面端运行,需要引入 ffi
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:flutter_security/security_client.dart';

void main() async {
  // 初始化 sqflite 的 ffi 支持(仅限桌面端)
  if (Platform.isWindows || Platform.isLinux) {
    sqfliteFfiInit();
    databaseFactory = databaseFactoryFfi;
  }

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  final TextEditingController _controller = TextEditingController();

  Future<void> _encryptData() async {
    final SecurityClient securityClient = await SecurityClient.create("test-db", "password");

    String dataToEncrypt = _controller.text;
    String encryptedData = await securityClient.encrypt(dataToEncrypt);

    print("Encrypted Data: $encryptedData");
  }

  Future<void> _decryptData() async {
    final SecurityClient securityClient = await SecurityClient.create("test-db", "password");

    String encryptedData = "your-encrypted-data-here";
    String decryptedData = await securityClient.decrypt(encryptedData);

    print("Decrypted Data: $decryptedData");
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Security Client Demo")),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: _controller,
              decoration: InputDecoration(hintText: "Enter data to encrypt"),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _encryptData,
              child: Text("Encrypt"),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _decryptData,
              child: Text("Decrypt"),
            ),
          ],
        ),
      ),
    );
  }
}

Demo

demo 文件夹中包含了一个 SecurityClient 的实现演示。

运行 Demo

为了运行演示项目,您必须设置一个名为 GLOBAL_SECURITY_CLIENT_PASSWORD 的环境变量,其值可以是任意文本。

示例命令

export GLOBAL_SECURITY_CLIENT_PASSWORD="your-secret-password"
flutter run

贡献指南

如果您希望为项目贡献代码,请按照以下步骤操作:

  1. 确保您已安装 Flutter。
  2. 克隆仓库:
    git clone https://github.com/bfpimentel/flutter-security.git
    
  3. 安装依赖:
    flutter pub get
    

更多关于Flutter安全客户端插件security_client的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter安全客户端插件security_client的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


security_client 是一个用于 Flutter 的安全 HTTP 客户端插件,它可以帮助你在应用程序中实现安全的网络通信。这个插件通常用于处理 HTTPS 请求,并提供了对证书固定(Certificate Pinning)等安全功能的支持。

安装 security_client 插件

首先,你需要在 pubspec.yaml 文件中添加 security_client 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  security_client: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

使用 security_client 插件

security_client 插件提供了一个 SecurityClient 类,你可以使用它来发送安全的 HTTP 请求。以下是一个简单的示例,展示了如何使用 SecurityClient 来发送 GET 请求:

import 'package:flutter/material.dart';
import 'package:security_client/security_client.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Security Client Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 创建 SecurityClient 实例
              var client = SecurityClient();

              try {
                // 发送 GET 请求
                var response = await client.get(Uri.parse('https://example.com'));

                // 打印响应内容
                print('Response status: ${response.statusCode}');
                print('Response body: ${response.body}');
              } catch (e) {
                print('Error: $e');
              } finally {
                // 关闭客户端
                client.close();
              }
            },
            child: Text('Send Request'),
          ),
        ),
      ),
    );
  }
}

证书固定(Certificate Pinning)

security_client 支持证书固定,这是一种防止中间人攻击的安全机制。你可以通过配置 SecurityClient 来固定特定的证书。

以下是一个证书固定的示例:

import 'package:security_client/security_client.dart';

void main() async {
  // 创建 SecurityClient 实例并配置证书固定
  var client = SecurityClient(
    securityContext: SecurityContext.defaultContext
      ..setTrustedCertificatesBytes([
        // 这里添加你的证书的字节数据
        // 例如:File('path/to/certificate.pem').readAsBytesSync()
      ]),
  );

  try {
    // 发送 GET 请求
    var response = await client.get(Uri.parse('https://example.com'));

    // 打印响应内容
    print('Response status: ${response.statusCode}');
    print('Response body: ${response.body}');
  } catch (e) {
    print('Error: $e');
  } finally {
    // 关闭客户端
    client.close();
  }
}
回到顶部