Flutter ED25519密钥管理插件openssh_ed25519的使用

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

Flutter ED25519密钥管理插件openssh_ed25519的使用

Dart 包用于将 ED25519 密钥序列化为 OpenSSH 格式。

使用方法

以下是如何在 Flutter 应用程序中使用 openssh_ed25519 插件生成并保存 ED25519 公钥和私钥的示例代码:

import 'dart:io';

import 'package:cryptography/cryptography.dart';
import 'package:openssh_ed25519/openssh_ed25519.dart';

Future<void> main() async {
  // 生成新的 ED25519 密钥对
  final keyPair = await Ed25519().newKeyPair();

  // 提取私钥字节
  var privateBytes = await keyPair.extractPrivateKeyBytes();

  // 提取公钥
  var public = await keyPair.extractPublicKey();
  var publicBytes = public.bytes;

  // 将公钥编码为 OpenSSH 格式的字符串
  var publicStr = encodeEd25519Public(publicBytes);

  // 将私钥编码为 OpenSSH 格式的字符串
  var privateStr = encodeEd25519Private(
    privateBytes: privateBytes,
    publicBytes: publicBytes,
  );

  // 将公钥写入文件
  await File('id_ed25519.pub').writeAsString(publicStr);

  // 将私钥写入文件
  await File('id_ed25519').writeAsString(privateStr);
}

完整示例 Demo

以下是一个完整的 Flutter 示例 Demo,展示了如何使用 openssh_ed25519 插件生成并保存 ED25519 公钥和私钥。

文件结构

example/
├── main.dart

main.dart

/*
 * SPDX-FileCopyrightText: 2021 Vishesh Handa &lt;me@vhanda.in&gt;
 *
 * SPDX-License-Identifier: Apache-2.0
 */

import 'dart:io';

import 'package:cryptography/cryptography.dart';
import 'package:openssh_ed25519/openssh_ed25519.dart';

Future<void> main() async {
  // 生成新的 ED25519 密钥对
  final keyPair = await Ed25519().newKeyPair();

  // 提取私钥字节
  var privateBytes = await keyPair.extractPrivateKeyBytes();

  // 提取公钥
  var public = await keyPair.extractPublicKey();
  var publicBytes = public.bytes;

  // 将公钥编码为 OpenSSH 格式的字符串
  var publicStr = encodeEd25519Public(publicBytes);

  // 将私钥编码为 OpenSSH 格式的字符串
  var privateStr = encodeEd25519Private(
    privateBytes: privateBytes,
    publicBytes: publicBytes,
  );

  // 将公钥写入文件
  await File('id_ed25519.pub').writeAsString(publicStr);

  // 将私钥写入文件
  await File('id_ed25519').writeAsString(privateStr);
}

更多关于Flutter ED25519密钥管理插件openssh_ed25519的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter ED25519密钥管理插件openssh_ed25519的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter应用中使用openssh_ed25519插件进行ED25519密钥管理的代码示例。这个插件允许你生成、加载和保存ED25519密钥对,非常适合需要进行安全通信的应用。

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

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

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

接下来是一个简单的Flutter应用示例,展示如何使用openssh_ed25519插件生成密钥对,并进行签名和验证:

import 'package:flutter/material.dart';
import 'package:openssh_ed25519/openssh_ed25519.dart';
import 'dart:typed_data';
import 'dart:convert';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'ED25519 Key Management',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String privateKeyPem = '';
  String publicKeyPem = '';
  String signatureHex = '';
  bool isVerified = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('ED25519 Key Management'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _generateKeyPair,
              child: Text('Generate Key Pair'),
            ),
            SizedBox(height: 20),
            Text('Private Key (PEM):'),
            TextField(
              maxLines: 10,
              readOnly: true,
              controller: TextEditingController(text: privateKeyPem),
            ),
            SizedBox(height: 20),
            Text('Public Key (PEM):'),
            TextField(
              maxLines: 10,
              readOnly: true,
              controller: TextEditingController(text: publicKeyPem),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _signMessage,
              child: Text('Sign Message'),
            ),
            SizedBox(height: 20),
            Text('Signature (Hex):'),
            TextField(
              readOnly: true,
              controller: TextEditingController(text: signatureHex),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _verifySignature,
              child: Text('Verify Signature'),
            ),
            SizedBox(height: 20),
            Text('Is Verified: $isVerified'),
          ],
        ),
      ),
    );
  }

  Future<void> _generateKeyPair() async {
    final keyPair = await Ed25519KeyPair.generate();
    setState(() {
      privateKeyPem = keyPair.privateKey.toPem();
      publicKeyPem = keyPair.publicKey.toPem();
    });
  }

  Future<void> _signMessage() async {
    if (privateKeyPem.isEmpty) {
      return;
    }
    final privateKey = Ed25519PrivateKey.fromPem(privateKeyPem);
    final message = Uint8List.fromList(utf8.encode('Hello, World!'));
    final signature = await privateKey.sign(message);
    setState(() {
      signatureHex = signature.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join();
    });
  }

  Future<void> _verifySignature() async {
    if (publicKeyPem.isEmpty || signatureHex.isEmpty) {
      return;
    }
    final publicKey = Ed25519PublicKey.fromPem(publicKeyPem);
    final signatureBytes = Uint8List.fromList(
      signatureHex.chunks(2).map((hex) => int.parse(hex, radix: 16)).toList(),
    );
    final message = Uint8List.fromList(utf8.encode('Hello, World!'));
    final isVerifiedResult = await publicKey.verify(signatureBytes, message);
    setState(() {
      isVerified = isVerifiedResult;
    });
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,它允许用户生成ED25519密钥对,对消息进行签名,并验证签名。以下是代码的主要部分:

  1. 生成密钥对

    • 使用Ed25519KeyPair.generate()生成一个新的密钥对。
    • 将生成的私钥和公钥保存为PEM格式。
  2. 签名消息

    • 使用生成的私钥对消息进行签名。
    • 将签名结果转换为十六进制字符串显示。
  3. 验证签名

    • 使用生成的公钥验证签名。
    • 显示签名验证结果。

这个示例展示了openssh_ed25519插件的基本用法,你可以根据需要进行扩展和修改。

回到顶部