Flutter数据加密插件aws_encryption_sdk的使用

Flutter数据加密插件aws_encryption_sdk的使用

概述

在Dart中实现的AWS加密套件描述为“一个客户端端加密库,旨在使每个人都可以轻松地使用行业标准和最佳实践来加密和解密数据”。该套件在C、Java、TypeScript和Python等语言中都有实现。这是Dart部分实现。

该套件从v1迁移到v2已有几年。此实现仅支持v2的密码套件和格式。

该套件使用包装密钥对数据进行加密和解密。每个明文使用由随机生成的数据密钥派生的提交密钥进行加密。数据密钥在一个或多个包装密钥中加密。加密后的密钥存储在密文中。为了进行解密,SDK至少解密一个加密密钥以恢复数据密钥,并从此恢复加密密钥。

SDK可选择使用ECDSA对密文进行数字签名。

密码套件

支持的两种密码套件是SDK标准中最现代的两种。它们除了是否包含数字签名外,其他相同。

加密算法 数据密钥长度(位) 密钥派生算法 签名算法 密钥承诺算法
AES-GCM 256 HKDF with SHA-512 ECDSA with P-384 and SHA-384 HKDF with SHA-512
AES-GCM 256 HKDF with SHA-512 None HKDF with SHA-512

密钥环

包装密钥由密钥环提供。此实现支持以下内容:

  • 对称AES密钥(128、192和256位)
  • 非对称RSA密钥(支持PKCS1和OAEP填充选项)
  • AWS KMS对称密钥

“多”密钥环支持在多个包装密钥下加密,并且可以使用任何提供的包装密钥进行解密。

使用

简单的使用示例:

import 'package:aws_encryption_sdk/aws_encryption_sdk.dart';

void main() async {
  // 使用默认值实例化库
  final awsCrypto = AwsCrypto();

  // 使用AWS KMS密钥ID实例化密钥环
  final keyring = AwsKmsKeyring(
    'arn:aws:kms:us-west-2:658956600833:key/b3537ef1-d8dc-4780-9f5a-55776cbb2f7f',
  );

  // 使用密钥环加密数据
  final encryptionResult = await awsCrypto.encryptData(
    data: data, // 待加密的数据
    keyring: keyring,
  );
}

流式处理

如果明文和密文适合内存,可以使用encryptDatadecryptData方法。SDK还可以处理流。

由于API的异步特性(为了允许KMS接口,它本身也是异步的),流接口不是以StreamTransformerCodec的形式提供的。请参阅streaming_example.dart了解用法。

选项

要控制加密的密码套件(当前唯一的选择是是否使用ECDSA签名),请在构造AWSCrypto实例时指定encryptionAlgorithm。构造函数的另一个选项是encryptionFrameSize,用于设置加密时使用的块大小,默认为4096。

当构建密钥环时,可以设置RSA密钥的包装算法,例如:

final rsaKeyring = RawRsaKeyring(
  'examples',
  'rsa-4096-example',
  keyPair.publicKey,
  keyPair.privateKey,
  WrappingAlgorithm.rsaOaepSha256Mgf1,
);

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用aws_encryption_sdk插件进行数据加密和解密的示例代码。aws_encryption_sdk是一个用于在Flutter应用中集成AWS Encryption SDK的插件,允许你使用AWS KMS(Key Management Service)管理的密钥来加密和解密数据。

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

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

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

接下来,我们来看一个示例代码,展示如何使用这个插件进行数据加密和解密。

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

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

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

class _MyAppState extends State<MyApp> {
  String plaintext = "This is a secret message!";
  String ciphertext = "";
  String decryptedText = "";

  Future<void> encryptMessage() async {
    // 初始化加密上下文(使用AWS KMS管理的密钥ID)
    final masterKeyId = 'alias/my-key-alias';  // 替换为你的AWS KMS密钥别名或ID
    final encryptionContext = <String, String>{
      'userId': '12345',
      'appData': 'sensitive',
    };

    // 创建加密材料提供程序
    final materialsProvider = await AwsEncryptionMaterialsProvider.fromMasterKeyId(
      masterKeyId: masterKeyId,
      region: 'us-west-2',  // 替换为你的AWS区域
    );

    // 创建加密器
    final encryptor = Encryptor(
      materialsProvider: materialsProvider,
      encryptionContext: encryptionContext,
    );

    // 加密消息
    final result = await encryptor.encrypt(Uint8List.fromList(plaintext.codeUnits));
    setState(() {
      ciphertext = base64Encode(result.ciphertext);
    });
  }

  Future<void> decryptMessage() async {
    // 创建解密材料提供程序(与加密时相同)
    final masterKeyId = 'alias/my-key-alias';  // 替换为你的AWS KMS密钥别名或ID
    final encryptionContext = <String, String>{
      'userId': '12345',
      'appData': 'sensitive',
    };

    final materialsProvider = await AwsEncryptionMaterialsProvider.fromMasterKeyId(
      masterKeyId: masterKeyId,
      region: 'us-west-2',  // 替换为你的AWS区域
    );

    // 创建解密器
    final decryptor = Decryptor(
      materialsProvider: materialsProvider,
      encryptionContext: encryptionContext,
    );

    // 解密消息
    final result = await decryptor.decrypt(Uint8List.fromList(base64Decode(ciphertext)));
    setState(() {
      decryptedText = String.fromCharCodes(result.plaintext);
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('AWS Encryption SDK Demo'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('Plaintext: $plaintext'),
              SizedBox(height: 20),
              Text('Ciphertext: $ciphertext'),
              SizedBox(height: 20),
              Text('Decrypted Text: $decryptedText'),
              SizedBox(height: 40),
              ElevatedButton(
                onPressed: encryptMessage,
                child: Text('Encrypt Message'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  if (ciphertext.isEmpty) {
                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(content: Text('Please encrypt a message first!')),
                    );
                  } else {
                    await decryptMessage();
                  }
                },
                child: Text('Decrypt Message'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意事项:

  1. AWS凭证:确保你的AWS凭证(访问密钥ID和秘密访问密钥)已经配置在你的开发环境中,或者通过AWS SDK的凭证提供者机制正确加载。
  2. 依赖配置:确保aws_encryption_sdk插件的依赖正确配置,并且你的Flutter环境支持该插件的运行。
  3. 安全性:不要在生产代码中硬编码敏感信息,如AWS KMS密钥ID或凭证。使用更安全的凭证管理方式,如AWS Secrets Manager或环境变量。

这个示例展示了如何使用aws_encryption_sdk插件在Flutter应用中加密和解密消息。根据你的具体需求,你可能需要调整加密上下文、材料提供程序配置等。

回到顶部