Flutter数据加密插件steel_crypt的使用

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

Flutter数据加密插件steel_crypt的使用

Steel Crypt 3.0 (BETA)

Steel Crypt 是一个提供高层次密码学API的库,这些API可以手动定义或从PointyCastle中提取。该库目前支持哈希、对称双向加密和密钥/IV生成。它还包含一个CLI,用于执行基本的密码学操作。

这个库是 PointyCastle 的高层次封装。曾经包含了一个PointyCastle的分支,但是自从该包归BouncyCastle组织所有后,分支中的添加内容已经被合并到上游。


Null Safety

此库已完全迁移到null safety。版本3.0.0在功能上与2.3.1+6相同,只是进行了这个迁移过程。由于一些参数从前是“可选”的命名参数,现在变成了必填项,接口可能会有轻微的变化。


注意:文档

当前文档尚未完全编写!Steel Crypt 3.X带来了重大变化,并将在GitHub Pages上有静态网站作为文档。目前,您可以查看API参考以获取更多关于beta版类的信息。每个类都有相当详细的文档。


注意:RSA弃用

考虑到pub.dev上的包过于饱和,这使得独立开发者难以做出选择。我担心会加剧这个问题。此外,我没有研究过非对称加密;我不觉得舒适地处理它,也不认为这个包在非对称加密方面为生态系统增添了太多价值。因此,我将不再维护Steel Crypt中的RSA功能。受影响的用户可以考虑使用crypton,这是一个更专注于非对称操作的包。


示例代码

以下是一个完整的示例demo,展示了如何使用Steel Crypt进行各种加密操作:

import 'package:steel_crypt/steel_crypt.dart';

void main() {
  // 密钥/IV/Nonce生成
  var keyGen = CryptKey();
  var key32 = keyGen.genFortuna(len: 32); // 生成32字节的密钥
  var key16 = keyGen.genFortuna(len: 16); // 生成16字节的密钥
  var iv16 = keyGen.genDart(len: 16);     // 生成AES的IV
  var iv8 = keyGen.genDart(len: 8);       // 生成ChaCha20的IV

  // 创建加密器
  var aes = AesCrypt(key: key32, padding: PaddingAES.pkcs7);
  var stream = LightCrypt(key: key32, algo: StreamAlgo.chacha20_12);
  var hasher = HashCrypt(algo: HashAlgo.Blake2b);
  var mac = MacCrypt(key: key16, type: MacType.CMAC);
  var passHash = PassCrypt.scrypt();

  // 打印生成的密钥和IV
  print('Keys:');
  print('key32: $key32 \nkey16: $key16');
  print('');

  print('IVs:');
  print('For AES/SCrypt: $iv16 \nFor ChaCha20: $iv8');
  print('');

  // SHA-3 512 哈希
  print('SHA-3 512 Hash:');
  var hash = hasher.hash(inp: 'example'); // 执行哈希
  print(hash);
  print(hasher.check(plain: 'example', hashed: hash)); // 验证哈希
  print('');

  // CMAC AES CBC 哈希
  print('CMAC AES CBC Hash:');
  var hash2 = mac.process(inp: 'words'); // 执行哈希
  print(hash2);
  print(mac.check(plain: 'words', hashed: hash2)); // 验证哈希
  print('');

  // scrypt 密码哈希
  print('Password hash (scrypt):');
  var hash3 = passHash.hash(salt: iv16, inp: 'words'); // 执行哈希
  print(hash3);
  print(passHash.check(
      salt: iv16, plain: 'words', hashed: hash3)); // 验证哈希
  print('');

  // ChaCha20 对称加密
  print('ChaCha20 Symmetric:');
  var crypted3 = stream.encrypt(inp: 'broken', iv: iv8); // 加密
  print(crypted3);
  print(stream.decrypt(enc: crypted3, iv: iv8)); // 解密
  print('');

  // AES GCM 加密解密
  print('AES Symmetric GCM:');
  var crypted = aes.gcm.encrypt(inp: 'words', iv: iv16); // 加密
  print(crypted);
  print(aes.gcm.decrypt(enc: crypted, iv: iv16)); // 解密
  print('');

  // AES CTR 对称流加密
  print('AES Symmetric CTR:');
  var crypted2 = aes.ctr.encrypt(inp: 'words', iv: iv16); // 加密
  print(crypted2);
  print(aes.ctr.decrypt(enc: crypted2, iv: iv16)); // 解密
  print('');
}

依赖配置

pubspec.yaml文件中添加依赖:

dependencies:
  steel_crypt: ^3.0.0-beta

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

通过以上步骤,您可以在Flutter项目中使用Steel Crypt进行各种加密操作。希望这些信息能帮助您更好地理解和使用Steel Crypt插件。如果有任何问题或需要进一步的帮助,请随时提问。


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用steel_crypt插件进行数据加密和解密的示例代码。steel_crypt是一个用于Flutter的加密库,支持多种加密算法。假设我们要使用AES加密和解密一个字符串。

首先,确保你已经在pubspec.yaml文件中添加了steel_crypt依赖:

dependencies:
  flutter:
    sdk: flutter
  steel_crypt: ^latest_version  # 请替换为实际最新版本号

然后运行flutter pub get来获取依赖。

接下来,在你的Flutter项目中,你可以创建一个Dart文件(例如encryption_service.dart)来处理加密和解密逻辑。

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

class EncryptionService {
  // AES加密密钥(16, 24, 或 32字节长度)
  final String key = '1234567890abcdef1234567890abcdef'; // 32字节示例
  final SteelCrypt steelCrypt = SteelCrypt();

  // AES加密方法
  Future<String> encrypt(String plainText) async {
    try {
      final encryptedData = await steelCrypt.aesEncrypt(
        plainText,
        key: key,
        iv: null, // 如果不指定IV,steel_crypt会生成一个随机的
      );
      return encryptedData;
    } catch (e) {
      print("Encryption error: $e");
      return null;
    }
  }

  // AES解密方法
  Future<String> decrypt(String encryptedData) async {
    try {
      final decryptedData = await steelCrypt.aesDecrypt(
        encryptedData,
        key: key,
        iv: null, // 确保解密时使用的IV与加密时相同,如果加密时没有指定,这里也应为null
      );
      return decryptedData;
    } catch (e) {
      print("Decryption error: $e");
      return null;
    }
  }
}

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final EncryptionService _encryptionService = EncryptionService();
  String _plainText = 'Hello, Flutter!';
  String _encryptedText = '';
  String _decryptedText = '';

  @override
  void initState() {
    super.initState();
    _encryptText();
  }

  Future<void> _encryptText() async {
    String encrypted = await _encryptionService.encrypt(_plainText);
    setState(() {
      _encryptedText = encrypted;
      _decryptText();
    });
  }

  Future<void> _decryptText() async {
    String decrypted = await _encryptionService.decrypt(_encryptedText);
    setState(() {
      _decryptedText = decrypted;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('AES Encryption/Decryption Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              Text('Plain Text: $_plainText'),
              SizedBox(height: 16),
              Text('Encrypted Text: $_encryptedText'),
              SizedBox(height: 16),
              Text('Decrypted Text: $_decryptedText'),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个EncryptionService类,该类包含AES加密和解密的方法。key是用于AES加密的密钥,必须是16、24或32字节长度。iv(初始化向量)在加密时如果未指定,steel_crypt会生成一个随机的IV,并在返回的加密数据中包含它,因此解密时需要确保使用相同的IV。

MyApp中,我们初始化EncryptionService实例,并在initState方法中调用加密方法,然后调用解密方法以显示结果。

请注意,在实际应用中,密钥管理非常重要,不应硬编码在客户端代码中。此外,还要确保处理加密和解密过程中的错误情况。

回到顶部