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'),
),
),
);
}
}
说明
-
导入证书:
await CrossPki.importPkcs12(p12Content, "1234");
-
列出证书:
final certificates = await CrossPki.listCertificatesWithKey(); final userCertificate = certificates.first;
-
签署数据:
var sig = await CrossPki.signData(userCertificate.thumbprint, DigestAlgorithm.sha256, base64Decode('SGVsbG8sIFdvcmxkIQ==')); print('Signature: ${base64Encode(sig.toList())}');
-
签署哈希值:
sig = await CrossPki.signHash( userCertificate.thumbprint, DigestAlgorithm.sha256, base64Decode('3/1gIbsr1bCvZ2KQgJ7DpTGR3YHH9wpLKGiKNiGCmG8=')); print('Signature: ${base64Encode(sig.toList())}');
-
移除证书:
await CrossPki.removeCertificate(certs[0].thumbprint);
-
生成RSA密钥对:
var keyPair = await CrossPki.generateRsaKeyPair(2048); print('keyId: ${keyPair.keyId}'); print( 'publicKey ${keyPair.algorithm}: ${base64Encode(keyPair.publicKeyEncoded.toList())}');
-
生成CSR(证书签名请求):
var csr = await CrossPki.generateCsr(keyPair); print('CSR: ${base64Encode(csr.toList())}');
更多关于Flutter跨平台公钥基础设施插件crosspki的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter跨平台公钥基础设施插件crosspki的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,关于Flutter跨平台公钥基础设施(PKI)插件crosspki
的使用,以下是一个基本的代码示例,展示如何在Flutter应用中集成和使用该插件。请注意,由于crosspki
是一个假设的插件名称(实际上Flutter生态系统中可能没有这样一个精确命名的插件),以下示例将基于一个通用的PKI插件概念进行编写。如果你使用的是具体某个PKI插件,请参考其官方文档进行适当调整。
假设的crosspki
插件功能
假设crosspki
插件提供了以下功能:
- 生成密钥对(公钥和私钥)。
- 使用私钥签名数据。
- 使用公钥验证签名。
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);
}
注意
- 插件接口:上述代码中的
Crosspki
类及其方法是假设的。实际使用时,请查阅你所使用的PKI插件的文档,了解其具体接口和用法。 - 密钥管理:在实际应用中,请务必妥善管理密钥,避免硬编码在代码中,可以考虑使用安全的密钥管理服务。
- 错误处理:示例代码中的错误处理较为简单,实际应用中应根据需求进行更详细的错误处理和用户提示。
希望这个示例能帮助你理解如何在Flutter应用中集成和使用PKI插件。如果你使用的是具体的某个插件,请参考其官方文档进行实现。