Flutter加密解密插件fernet的使用

发布于 1周前 作者 itying888 来自 Flutter

Flutter 加密解密插件 fernet 的使用

fernet

Pub Package Coveralls LICENSE

一个用于使用 Fernet 方案对消息进行加密和解密的 Dart 库。

这是 Python cryptography 库中 Fernet 实现的直接移植版本。

要求

  • Dart SDK: 3.4+

使用密码与 Fernet

可以使用密码与 Fernet 结合。为此,需要通过 PBKDF2HMAC、bcrypt、scrypt 或 argon2 等密钥派生函数处理密码。示例见 example/password.dart

实现

Fernet 基于一系列标准的加密原语构建。具体而言,它使用:

  • AES 在 CBC 模式下使用 128 位密钥进行加密;使用 PKCS7 填充。
  • 使用 SHA256 进行 HMAC 认证。
  • 初始化向量通过 Random.secure() 生成。

有关详细信息,请参阅 specification

此库中使用的加密原语由 pointycastle 提供。

限制

Fernet 适用于容易放入内存的数据加密。作为设计特性,它不暴露未认证的字节。这意味着完整的消息内容必须在内存中可用,这使得 Fernet 目前不适合非常大的文件。

致谢

本库使用了其他开源项目的代码。这些开源项目的版权声明列在 CREDITS.md 中。大多数文档和实现细节都是从 Python cryptography 库中改编而来的。


完整示例 Demo

import 'dart:convert';
import 'dart:typed_data';

import 'package:fernet/fernet.dart';

void main() {
  // 生成一个随机的密钥
  final Fernet f = Fernet(Fernet.generateKey());

  // 待加密的消息
  final String message = 'A really secret message. Not for prying eyes.';
  
  // 将消息转换为 Uint8List 类型
  final Uint8List plainText = Uint8List.fromList(utf8.encode(message));

  // 加密消息
  final Uint8List token = f.encrypt(plainText);

  // 解密消息
  final Uint8List decryptedText = f.decrypt(token);

  // 将解密后的 Uint8List 转换为字符串并打印
  print(utf8.decode(decryptedText));
  // 输出: 'A really secret message. Not for prying eyes.'
}

代码解释

  1. 导入必要的库

    import 'dart:convert';
    import 'dart:typed_data';
    
    import 'package:fernet/fernet.dart';
    
  2. 生成一个随机的密钥

    final Fernet f = Fernet(Fernet.generateKey());
    
  3. 定义待加密的消息

    final String message = 'A really secret message. Not for prying eyes.';
    
  4. 将消息转换为 Uint8List 类型

    final Uint8List plainText = Uint8List.fromList(utf8.encode(message));
    
  5. 加密消息

    final Uint8List token = f.encrypt(plainText);
    
  6. 解密消息

    final Uint8List decryptedText = f.decrypt(token);
    
  7. 将解密后的 Uint8List 转换为字符串并打印

    print(utf8.decode(decryptedText));
    

    输出:

    A really secret message. Not for prying eyes.
    

更多关于Flutter加密解密插件fernet的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter加密解密插件fernet的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用Fernet加密解密插件的一个基本示例。Fernet是一种基于密码学的消息加密协议,通常用于确保消息的机密性、完整性和来源验证。

首先,确保你已经在Flutter项目中添加了Fernet相关的依赖。你可以在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  fernet_dart: ^x.y.z  # 请将x.y.z替换为最新的版本号

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

接下来,你可以在你的Flutter应用中使用Fernet进行加密和解密操作。以下是一个简单的示例代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Fernet Encryption/Decryption Example'),
        ),
        body: Center(
          child: FernetExample(),
        ),
      ),
    );
  }
}

class FernetExample extends StatefulWidget {
  @override
  _FernetExampleState createState() => _FernetExampleState();
}

class _FernetExampleState extends State<FernetExample> {
  String? encryptedMessage;
  String? decryptedMessage;
  String keyBase64 = "your-32-byte-key-encoded-in-base64"; // 替换为你的32字节密钥的Base64编码

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        TextField(
          decoration: InputDecoration(labelText: 'Plain Text Message'),
          onChanged: (value) {
            // 可以在这里添加逻辑来动态加密或解密文本
          },
        ),
        ElevatedButton(
          onPressed: () async {
            try {
              // 生成密钥
              Uint8List key = Uint8List.fromList(
                base64Decode(keyBase64)!,
              );

              // 创建Fernet实例
              Fernet fernet = Fernet(key);

              // 获取输入框中的文本
              final TextEditingController controller = TextEditingController();
              // 这里应该使用TextField的controller来获取实际输入的值,为了简单起见,这里直接赋值
              String plainTextMessage = "Hello, this is a secret message!";

              // 加密
              String encrypted = fernet.encrypt(plainTextMessage).toString();
              setState(() {
                encryptedMessage = encrypted;
              });

              // 解密
              String decrypted = fernet.decrypt(Uint8List.fromList(base64Decode(encrypted)!)).toString();
              setState(() {
                decryptedMessage = decrypted;
              });

            } catch (e) {
              print("Error: $e");
            }
          },
          child: Text('Encrypt/Decrypt'),
        ),
        if (encryptedMessage != null)
          Text('Encrypted Message: $encryptedMessage'),
        if (decryptedMessage != null)
          Text('Decrypted Message: $decryptedMessage'),
      ],
    );
  }
}

注意

  1. 上述代码是一个简单的演示,实际使用时你应该从UI的TextField中获取用户输入的文本,而不是硬编码的字符串。
  2. 你需要确保你的密钥是32字节长,并且正确地进行了Base64编码。
  3. fernet_dart插件的具体API可能会随着版本更新而变化,请参考最新的文档以获取准确的使用方式。
  4. 错误处理在实际应用中非常重要,上述代码中的错误处理只是简单地打印了错误信息,你应该根据实际需求进行更详细的错误处理。

这个示例展示了如何使用Fernet在Flutter应用中进行基本的加密和解密操作。希望这对你有所帮助!

回到顶部