Flutter安全二维码生成插件secure_qr_generator的使用

Flutter安全二维码生成插件secure_qr_generator的使用

secure_qr_generator 是一个用于生成安全、自动刷新的二维码的 Flutter 插件。它支持AES加密、HMAC-SHA256签名、自动过期管理和自定义样式。

特性

  • 安全性:支持AES加密和HMAC-SHA256签名。
  • 自动过期:内置有效期管理。
  • 自动刷新:二维码在过期前自动刷新。
  • Flutter集成:现成的 Flutter 小部件。
  • 可定制样式:完全控制二维码外观。
  • 性能优化:高效再生,最小化开销。

安装

将以下内容添加到你的 pubspec.yaml 文件中:

dependencies:
  secure_qr_generator: ^1.0.4

然后运行:

flutter pub get

快速开始

基本用法
import 'package:secure_qr_generator/secure_qr_generator.dart';

// 创建配置
final config = GeneratorConfig.production(
  secretKey: 'your-32-character-secret-key-here!!!',
  validityDuration: Duration(minutes: 5),
);

// 初始化生成器
final generator = SecureQRGenerator(config);

// 创建二维码数据
final data = QRData(
  payload: {'userId': '123', 'access': 'granted'},
  metadata: {'purpose': 'access_control'},
  tags: ['entrance', 'visitor'],
);

// 生成二维码
final result = await generator.generateQR(data);
使用自动刷新的小部件
AutoRegeneratingQRView(
  data: data,
  generator: generator,
  size: 200,
  style: QrStyle(
    eyeStyle: QrEyeStyle(eyeShape: QrEyeShape.square),
    dataModuleStyle: QrDataModuleStyle(
      dataModuleShape: QrDataModuleShape.circle,
    ),
  ),
  onRegenerate: (result) {
    print('新二维码已生成: ${result.id}');
  },
  onError: (error) {
    print('错误: $error');
  },
)

配置选项

开发环境配置
final devConfig = GeneratorConfig.development();
生产环境配置
final prodConfig = GeneratorConfig.production(
  secretKey: 'your-secure-production-key-here!!!!!!',
  validityDuration: Duration(minutes: 5),
);
自定义配置
final customConfig = GeneratorConfig(
  secretKey: 'your-secret-key',
  validityDuration: Duration(minutes: 10),
  enableEncryption: true,
  enableSignature: true,
  dataVersion: 1,
  idPrefix: 'CUSTOM_',
);

高级功能

自定义二维码样式
QrStyle(
  eyeStyle: QrEyeStyle(
    eyeShape: QrEyeShape.square,
    color: Colors.blue,
  ),
  dataModuleStyle: QrDataModuleStyle(
    dataModuleShape: QrDataModuleShape.circle,
    color: Colors.black,
  ),
  embeddedImage: AssetImage('assets/logo.png'),
  embeddedImageStyle: QrEmbeddedImageStyle(
    size: Size(40, 40),
  ),
)
自定义刷新间隔
AutoRegeneratingQRView(
  data: data,
  generator: generator,
  regenerationInterval: Duration(minutes: 2),
  // 其他参数
)
自定义二维码构建器
AutoRegeneratingQRView(
  data: data,
  generator: generator,
  builder: (qrData) => Container(
    decoration: BoxDecoration(
      border: Border.all(color: Colors.blue),
    ),
    child: QrImageView(
      data: qrData,
      size: 200,
    ),
  ),
)

错误处理

该插件包括全面的错误处理:

try {
  final result = await generator.generateQR(data);
  // 使用结果
} on GenerationError catch (e) {
  switch (e.type) {
    case GenerationErrorType.configuration:
      print('配置错误: ${e.message}');
      break;
    case GenerationErrorType.encryption:
      print('加密错误: ${e.message}');
      break;
    case GenerationErrorType.payloadTooLarge:
      print('载荷过大: ${e.message}');
      break;
    // 处理其他错误类型...
  }
}

安全注意事项

  • 保持你的 secretKey 安全,不要将其提交到版本控制系统。
  • 在开发和生产环境中使用不同的密钥。
  • 在添加数据时考虑二维码的大小限制。
  • 根据使用场景选择合适的有效期。
  • 在生产环境中定期更换加密密钥。

示例代码

以下是一个完整的示例代码,展示了如何使用 secure_qr_generator 插件:

import 'dart:developer';

import 'package:flutter/material.dart';
import 'package:qr_flutter/qr_flutter.dart';
import 'package:secure_qr_generator/secure_qr_generator.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Secure QR Genrator Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const QRDisplayScreen(),
    );
  }
}

class QRDisplayScreen extends StatefulWidget {
  const QRDisplayScreen({super.key});

  [@override](/user/override)
  State<QRDisplayScreen> createState() => _QRDisplayScreenState();
}

class _QRDisplayScreenState extends State<QRDisplayScreen> {
  late TextEditingController phoneController;
  late TextEditingController secretKeyController;
  bool enableEncryption = true;
  bool enableSignature = true;
  int validityDuration = 60;
  String phoneNumber = '07070707';

  // 配置
  late GeneratorConfig secureConfig;
  late SecureQRGenerator generator;

  // 更新生成器
  void updateGenerator() {
    setState(() {
      secureConfig = GeneratorConfig(
        secretKey: secretKeyController.text,
        enableEncryption: enableEncryption,
        enableSignature: enableSignature,
        validityDuration: Duration(seconds: validityDuration),
      );
      generator = SecureQRGenerator(secureConfig);
    });
  }

  [@override](/user/override)
  void initState() {
    phoneController = TextEditingController(text: phoneNumber);
    secretKeyController =
        TextEditingController(text: '2024#@#qrcod#orange@##perform#==');
    // 初始化配置
    secureConfig = GeneratorConfig(
      secretKey: secretKeyController.text,
      enableEncryption: enableEncryption,
      enableSignature: enableSignature,
      validityDuration: Duration(seconds: validityDuration),
    );
    generator = SecureQRGenerator(secureConfig);
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Secure QR Generator Demo')),
      body: SingleChildScrollView(
        padding: const EdgeInsets.all(16),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            TextField(
              controller: secretKeyController,
              decoration: const InputDecoration(
                  labelText: 'AES-256 密钥(可选)'),
              onChanged: (_) => updateGenerator(),
            ),
            SwitchListTile(
              title: const Text('加密(可选)'),
              value: enableEncryption,
              onChanged: (value) {
                setState(() {
                  enableEncryption = value;
                  updateGenerator();
                });
              },
            ),
            SwitchListTile(
              title: const Text('签名(可选)'),
              value: enableSignature,
              onChanged: (value) {
                setState(() {
                  enableSignature = value;
                  updateGenerator();
                });
              },
            ),
            Text('有效期 ($validityDuration 秒)'),
            Slider(
              value: validityDuration.toDouble(),
              min: 10,
              max: 300,
              divisions: 29,
              label: '$validityDuration 秒',
              onChanged: (value) {
                setState(() {
                  validityDuration = value.toInt();
                  updateGenerator();
                });
              },
            ),
            TextField(
              decoration:
                  const InputDecoration(labelText: '电话号码'),
              controller: phoneController,
              onChanged: (value) {
                setState(() {
                  phoneNumber = value;
                });
              },
            ),
            const SizedBox(height: 40),
            // 二维码
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                AutoRegeneratingQRView(
                  data: QRData(
                    payload: {
                      'phoneNumber': phoneNumber,
                    },
                  ),
                  generator: generator,
                  size: 250,
                  style: const QrStyle(
                    eyeStyle: QrEyeStyle(
                      eyeShape: QrEyeShape.square,
                      color: Colors.deepOrangeAccent,
                    ),
                  ),
                  onRegenerate: (result) =>
                      log('新二维码已生成: ${result.toMap()}'),
                  onError: (error) {
                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(content: Text('错误: $error')),
                    );
                  },
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    secretKeyController.dispose();
    super.dispose();
  }
}

更多关于Flutter安全二维码生成插件secure_qr_generator的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter安全二维码生成插件secure_qr_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用secure_qr_generator插件来生成安全二维码的示例代码。这个插件允许你生成包含敏感信息的二维码,并且提供了加密功能以增强安全性。

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

dependencies:
  flutter:
    sdk: flutter
  secure_qr_generator: ^最新版本号  # 请替换为实际可用的最新版本号

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

接下来,在你的Flutter项目中,你可以按照以下步骤生成一个安全的二维码:

  1. 导入必要的包
import 'package:flutter/material.dart';
import 'package:secure_qr_generator/secure_qr_generator.dart';
  1. 创建生成二维码的函数
Future<Uint8List?> generateSecureQRCode(String data) async {
  try {
    // 配置加密选项(可选)
    final encryptionOptions = EncryptionOptions(
      algorithm: EncryptionAlgorithm.aes256,  // 加密算法
      password: "your-secure-password",  // 加密密码
      salt: "your-unique-salt",  // 盐值,用于增强密码强度
    );

    // 生成二维码
    final qrCodeGenerator = SecureQrCodeGenerator();
    final qrCode = await qrCodeGenerator.generateQRCode(
      data: data,
      encryptionOptions: encryptionOptions,  // 如果不需要加密,可以省略此行
    );

    return qrCode;
  } catch (e) {
    print("Error generating QR code: $e");
    return null;
  }
}
  1. 在UI中显示二维码
class QRCodeGeneratorScreen extends StatefulWidget {
  @override
  _QRCodeGeneratorScreenState createState() => _QRCodeGeneratorScreenState();
}

class _QRCodeGeneratorScreenState extends State<QRCodeGeneratorScreen> {
  Uint8List? qrCodeImage;

  @override
  void initState() {
    super.initState();
    // 初始化时生成二维码
    _generateQRCode("Your secure data here");
  }

  Future<void> _generateQRCode(String data) async {
    final qrCode = await generateSecureQRCode(data);
    if (mounted) {
      setState(() {
        qrCodeImage = qrCode;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Secure QR Code Generator'),
      ),
      body: Center(
        child: qrCodeImage == null
            ? CircularProgressIndicator()
            : Image.memory(
                qrCodeImage!,
                width: 300,
                height: 300,
              ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 重新生成二维码(如果需要)
          _generateQRCode("Updated secure data here");
        },
        tooltip: 'Generate QR Code',
        child: Icon(Icons.add),
      ),
    );
  }
}
  1. 运行你的应用

确保你的主屏幕或导航器指向QRCodeGeneratorScreen,然后运行你的Flutter应用。你应该能看到一个显示生成的二维码的界面,如果配置了加密选项,二维码内容将被加密。

这是一个基本的示例,实际应用中你可能需要根据具体需求进行更多的配置和优化。希望这个示例能帮助你开始使用secure_qr_generator插件来生成安全的二维码。

回到顶部