Flutter跨平台公钥基础设施插件crosspki的使用

Flutter跨平台公钥基础设施插件crosspki的使用

crosspki 是一个用于处理 X509 证书和密钥对的 Flutter 插件。它可以从原生平台密钥库中导入和管理证书。

使用

import 'dart:convert';
import 'package:crosspki/crosspki.dart';

// 简单签名
await CrossPki.importPkcs12(p12Content, p12Password);
final certificates = await CrossPki.listCertificatesWithKey();
final userCertificate = certificates.first;

final hash = base64Decode('3/1gIbsr1bCvZ2KQgJ7DpTGR3YHH9wpLKGiKNiGCmG8=');
final signature = await CrossPki.signHash(userCert.thumbprint, DigestAlgorithm.sha256, hash);

完整示例代码

下面是一个完整的 Flutter 示例代码,展示了如何使用 crosspki 插件来导入 PKCS#12 文件、列出证书、签署数据和哈希值等操作。

示例代码

import 'dart:convert';
import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:crosspki/crosspki.dart';

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

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    runCrossPkiApis();
  }

  // 异步方法初始化平台消息
  Future<void> runCrossPkiApis() async {
    try {
      print('LISTING CERTIFICATES');
      var certs = await CrossPki.listCertificatesWithKey();
      print('Certs count: ${certs.length}');

      print('IMPORTING PKCS#12');
      final p12Content = base64Decode(
          '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');
      await CrossPki.importPkcs12(p12Content, "1234");
      certs = await CrossPki.listCertificatesWithKey();
      print('Certs count: ${certs.length}');
      final userCertificate = certs.first;
      print('Imported: ${userCertificate.subjectName}');
      print('CPF: ${userCertificate.pkiBrazil.cpfFormatted}');

      print('SIGN DATA TEST');
      var sig = await CrossPki.signData(userCertificate.thumbprint,
          DigestAlgorithm.sha256, base64Decode('SGVsbG8sIFdvcmxkIQ=='));
      print('Signature: ${base64Encode(sig.toList())}');

      print('SIGN HASH TEST');
      sig = await CrossPki.signHash(
          userCertificate.thumbprint,
          DigestAlgorithm.sha256,
          base64Decode('3/1gIbsr1bCvZ2KQgJ7DpTGR3YHH9wpLKGiKNiGCmG8='));
      print('Signature: ${base64Encode(sig.toList())}');

      await CrossPki.removeCertificate(certs[0].thumbprint);
      print('Removed');
      certs = await CrossPki.listCertificatesWithKey();
      print('Certs count: ${certs.length}');

      print('GENERATING RSA KEY PAIR...');
      var keyPair = await CrossPki.generateRsaKeyPair(2048);
      print('keyId: ${keyPair.keyId}');
      print(
          'publicKey ${keyPair.algorithm}: ${base64Encode(keyPair.publicKeyEncoded.toList())}');

      print('GENERATING CSR...');
      var csr = await CrossPki.generateCsr(keyPair);
      print('CSR: ${base64Encode(csr.toList())}');

      print('DONE');
    } on CrossPkiException catch (ex) {
      print('ERROR: $ex');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Cross PKI Plugin example app'),
        ),
        body: const Center(
          child: Text('Running Cross PKI API'),
        ),
      ),
    );
  }
}

说明

  1. 导入证书

    await CrossPki.importPkcs12(p12Content, "1234");
    
  2. 列出证书

    final certificates = await CrossPki.listCertificatesWithKey();
    final userCertificate = certificates.first;
    
  3. 签署数据

    var sig = await CrossPki.signData(userCertificate.thumbprint,
        DigestAlgorithm.sha256, base64Decode('SGVsbG8sIFdvcmxkIQ=='));
    print('Signature: ${base64Encode(sig.toList())}');
    
  4. 签署哈希值

    sig = await CrossPki.signHash(
        userCertificate.thumbprint,
        DigestAlgorithm.sha256,
        base64Decode('3/1gIbsr1bCvZ2KQgJ7DpTGR3YHH9wpLKGiKNiGCmG8='));
    print('Signature: ${base64Encode(sig.toList())}');
    
  5. 移除证书

    await CrossPki.removeCertificate(certs[0].thumbprint);
    
  6. 生成RSA密钥对

    var keyPair = await CrossPki.generateRsaKeyPair(2048);
    print('keyId: ${keyPair.keyId}');
    print(
        'publicKey ${keyPair.algorithm}: ${base64Encode(keyPair.publicKeyEncoded.toList())}');
    
  7. 生成CSR(证书签名请求)

    var csr = await CrossPki.generateCsr(keyPair);
    print('CSR: ${base64Encode(csr.toList())}');
    

更多关于Flutter跨平台公钥基础设施插件crosspki的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter跨平台公钥基础设施插件crosspki的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于Flutter跨平台公钥基础设施(PKI)插件crosspki的使用,以下是一个基本的代码示例,展示如何在Flutter应用中集成和使用该插件。请注意,由于crosspki是一个假设的插件名称(实际上Flutter生态系统中可能没有这样一个精确命名的插件),以下示例将基于一个通用的PKI插件概念进行编写。如果你使用的是具体某个PKI插件,请参考其官方文档进行适当调整。

假设的crosspki插件功能

假设crosspki插件提供了以下功能:

  1. 生成密钥对(公钥和私钥)。
  2. 使用私钥签名数据。
  3. 使用公钥验证签名。

Flutter项目结构

首先,确保你的Flutter项目已经创建好,并且pubspec.yaml文件中已经添加了crosspki插件的依赖(注意:这里crosspki是假设的,实际使用时请替换为真实插件名)。

dependencies:
  flutter:
    sdk: flutter
  crosspki: ^x.y.z  # 替换为实际版本号

使用示例

以下是一个简单的Flutter应用示例,展示如何使用crosspki插件进行密钥生成、签名和验证。

import 'package:flutter/material.dart';
import 'package:crosspki/crosspki.dart'; // 假设的插件导入

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

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

class _MyAppState extends State<MyApp> {
  String publicKey = '';
  String privateKey = '';
  String signature = '';
  bool isVerified = false;

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

  Future<void> _generateKeyPair() async {
    try {
      final keyPair = await Crosspki.generateKeyPair();
      setState(() {
        publicKey = keyPair.publicKey;
        privateKey = keyPair.privateKey;
      });
      print('Public Key: $publicKey');
      print('Private Key: $privateKey');
    } catch (e) {
      print('Error generating key pair: $e');
    }
  }

  Future<void> _signData(String data) async {
    try {
      signature = await Crosspki.signData(data, privateKey);
      print('Signature: $signature');
    } catch (e) {
      print('Error signing data: $e');
    }
  }

  Future<void> _verifySignature(String data) async {
    try {
      isVerified = await Crosspki.verifySignature(data, signature, publicKey);
      print('Signature verified: $isVerified');
    } catch (e) {
      print('Error verifying signature: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Crosspki Demo'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text('Public Key:'),
              Text(publicKey, style: TextStyle(fontSize: 14)),
              SizedBox(height: 16),
              ElevatedButton(
                onPressed: () {
                  setState(() {
                    isVerified = false;
                    signature = '';
                  });
                  _signData('Hello, Flutter!');
                  _verifySignature('Hello, Flutter!');
                },
                child: Text('Sign and Verify Data'),
              ),
              SizedBox(height: 16),
              Text('Signature Verified: $isVerified'),
            ],
          ),
        ),
      ),
    );
  }
}

// 假设的Crosspki插件接口定义(实际使用时请参考插件文档)
class Crosspki {
  static Future<KeyPair> generateKeyPair() async {
    // 插件内部实现密钥对生成逻辑
    // 返回KeyPair对象,包含publicKey和privateKey
    return KeyPair('publicKeyString', 'privateKeyString');
  }

  static Future<String> signData(String data, String privateKey) async {
    // 插件内部实现数据签名逻辑
    // 返回签名字符串
    return 'signatureString';
  }

  static Future<bool> verifySignature(String data, String signature, String publicKey) async {
    // 插件内部实现签名验证逻辑
    // 返回验证结果(true或false)
    return true;
  }
}

class KeyPair {
  final String publicKey;
  final String privateKey;

  KeyPair(this.publicKey, this.privateKey);
}

注意

  1. 插件接口:上述代码中的Crosspki类及其方法是假设的。实际使用时,请查阅你所使用的PKI插件的文档,了解其具体接口和用法。
  2. 密钥管理:在实际应用中,请务必妥善管理密钥,避免硬编码在代码中,可以考虑使用安全的密钥管理服务。
  3. 错误处理:示例代码中的错误处理较为简单,实际应用中应根据需求进行更详细的错误处理和用户提示。

希望这个示例能帮助你理解如何在Flutter应用中集成和使用PKI插件。如果你使用的是具体的某个插件,请参考其官方文档进行实现。

回到顶部