Flutter RSA数字签名插件rsa_digitalsignature的使用

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

Flutter RSA数字签名插件rsa_digitalsignature的使用

RSA Digital Signature

此库用于使用RSACNG私钥对数据进行签名,并支持macos和windows平台。


检索证书


签名数据


已签名的数据


使用方法

获取所有具有非否认用途(NonRepudiation)的证书

import 'package:rsa_digitalsignature/rsa_digitalsignature.dart';
import 'package:rsa_digitalsignature/certificate.dart';

final RsaDigitalsignature _rsaDigitalSignaturePlugin = RsaDigitalsignature();

final List<Certificate> _certificates = await _rsaDigitalSignaturePlugin.getCertifications();

使用私钥对数据进行签名

final String message = "Hello World !";
final Uint8List dataToSign = Uint8List.fromList(utf8.encode(message));
final Digest hash = sha256.convert(dataToSign);
final dynamic publickey = await _rsaDigitalSignaturePlugin.signWithprivatekey((hash.bytes as Uint8List), _selectedCertificate!.publickey);
Uint8List datasigned = Uint8List.fromList(List<int>.from(publickey as List<dynamic>));

Certificate类定义

class Certificate {
  final Uint8List publickey; // DER格式的公钥
  final X509Certificate x509certificate; // X509实例
  final String cn; // 公共名称
  const Certificate({
    required this.publickey,
    required this.x509certificate,
    required this.cn,
  });
}

设置

Windows

无需额外设置。

MacOS

无需额外设置。


示例

在example文件夹中可以找到完整的示例代码:

cd example && flutter run

示例代码:example/lib/main.dart

import 'package:rsa_digitalsignature/certificate.dart';
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'dart:convert';
import 'package:crypto/crypto.dart';
import 'package:rsa_digitalsignature/rsa_digitalsignature.dart';

void main() => runApp(const MyApp());

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final List<Certificate> _certificates = [];
  Uint8List datasigned = Uint8List(0);
  final RsaDigitalsignature _rsaDigitalSignaturePlugin = RsaDigitalsignature();
  Certificate? _selectedCertificate;
  final TextEditingController _messageController = TextEditingController();
  String _errorMessage = '';

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  Future<void> initPlatformState() async {
    try {
      final certificates = await _rsaDigitalSignaturePlugin.getCertifications();
      if (!mounted) return;
      setState(() {
        _certificates.addAll(certificates);
      });
    } on PlatformException catch (e) {
      setState(() {
        _errorMessage = "Failed to get certificates: ${e.message}";
      });
    }
  }

  Future<void> signMessage() async {
    if (_selectedCertificate != null && _messageController.text.isNotEmpty) {
      try {
        final String message = _messageController.text;
        final Uint8List dataToSign = Uint8List.fromList(utf8.encode(message));
        final Digest hash = sha256.convert(dataToSign);
        final dynamic publickey =
            await _rsaDigitalSignaturePlugin.signWithprivatekey(
                hash.bytes as Uint8List, _selectedCertificate!.publickey);
        setState(() {
          datasigned =
              Uint8List.fromList(List<int>.from(publickey as List<dynamic>));
        });
      } on PlatformException catch (e) {
        setState(() {
          _errorMessage = "Failed to sign message: ${e.message}";
        });
      }
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: const Center(child: Text('RSA Digital Signature Example App')),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            children: <Widget>[
              if (_errorMessage.isNotEmpty)
                Text(
                  _errorMessage,
                  style: const TextStyle(color: Colors.red),
                ),
              Align(
                alignment: Alignment.center,
                child: DropdownButton<Certificate>(
                  value: _selectedCertificate,
                  items: _certificates.map<DropdownMenuItem<Certificate>>(
                    (Certificate certificate) {
                      final cn = certificate.cn;
                      return DropdownMenuItem<Certificate>(
                        value: certificate,
                        child: Text(cn),
                      );
                    },
                  ).toList(),
                  onChanged: (value) {
                    setState(() {
                      _selectedCertificate = value;
                    });
                  },
                  hint: const Text("Select a certificate"),
                ),
              ),
              const SizedBox(height: 16.0),
              if (_selectedCertificate != null)
                TextField(
                  controller: _messageController,
                  decoration: const InputDecoration(labelText: "Message"),
                ),
              const SizedBox(height: 16.0),
              if (_selectedCertificate != null)
                ElevatedButton(
                  onPressed: signMessage,
                  child: const Text("Sign Message"),
                ),
              if (datasigned.isNotEmpty)
                Expanded(
                  child: SingleChildScrollView(
                    child: Text("Signed Data: $datasigned"),
                  ),
                ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter RSA数字签名插件rsa_digitalsignature的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter RSA数字签名插件rsa_digitalsignature的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,如果你想使用RSA数字签名,可以使用 rsa_digitalsignature 插件。这个插件可以帮助你生成RSA密钥对、签名数据以及验证签名。以下是如何使用 rsa_digitalsignature 插件的步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  rsa_digitalsignature: ^1.0.0  # 请检查最新版本

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

2. 导入插件

在你的 Dart 文件中导入 rsa_digitalsignature 插件:

import 'package:rsa_digitalsignature/rsa_digitalsignature.dart';

3. 生成RSA密钥对

使用 RsaDigitalSignature 类生成RSA密钥对:

void generateKeyPair() async {
  var rsa = RsaDigitalSignature();
  var keyPair = await rsa.generateKeyPair();
  
  print("Public Key: ${keyPair.publicKey}");
  print("Private Key: ${keyPair.privateKey}");
}

4. 签名数据

使用生成的私钥对数据进行签名:

void signData() async {
  var rsa = RsaDigitalSignature();
  var keyPair = await rsa.generateKeyPair();
  
  String data = "Hello, World!";
  String signature = await rsa.sign(data, keyPair.privateKey);
  
  print("Signature: $signature");
}

5. 验证签名

使用公钥验证签名的有效性:

void verifySignature() async {
  var rsa = RsaDigitalSignature();
  var keyPair = await rsa.generateKeyPair();
  
  String data = "Hello, World!";
  String signature = await rsa.sign(data, keyPair.privateKey);
  
  bool isValid = await rsa.verify(data, signature, keyPair.publicKey);
  
  print("Is Signature Valid? $isValid");
}

6. 完整示例

以下是一个完整的示例,展示了如何生成密钥对、签名数据以及验证签名:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('RSA Digital Signature Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: generateKeyPair,
                child: Text('Generate Key Pair'),
              ),
              ElevatedButton(
                onPressed: signData,
                child: Text('Sign Data'),
              ),
              ElevatedButton(
                onPressed: verifySignature,
                child: Text('Verify Signature'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  void generateKeyPair() async {
    var rsa = RsaDigitalSignature();
    var keyPair = await rsa.generateKeyPair();
    
    print("Public Key: ${keyPair.publicKey}");
    print("Private Key: ${keyPair.privateKey}");
  }

  void signData() async {
    var rsa = RsaDigitalSignature();
    var keyPair = await rsa.generateKeyPair();
    
    String data = "Hello, World!";
    String signature = await rsa.sign(data, keyPair.privateKey);
    
    print("Signature: $signature");
  }

  void verifySignature() async {
    var rsa = RsaDigitalSignature();
    var keyPair = await rsa.generateKeyPair();
    
    String data = "Hello, World!";
    String signature = await rsa.sign(data, keyPair.privateKey);
    
    bool isValid = await rsa.verify(data, signature, keyPair.publicKey);
    
    print("Is Signature Valid? $isValid");
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!