Flutter安全存储接口插件dart_ssi的使用

Flutter安全存储接口插件dart_ssi的使用

dart_ssi

dart_ssi 是一个支持SSI(去中心化身份)空间中几个标准的Dart包,包括基于 Hive 的最小钱包实现。该包包含用于存储可验证凭证和相关密钥对的类和函数;可以签发、验证和撤销凭证和演示文稿,并与 ERC1056 智能合约进行交互。此外,该包还支持两个交换协议(IWCE 和 DIDComm V2),用于可验证凭证和演示文稿。

重要提示:此包尚处于开发阶段。API 可能会更改,并且代码尚未经过广泛测试。

开始使用

要设置一个钱包,只需执行以下操作:

void main() {
  var wallet = new WalletStore('holder');
  await wallet.openBoxes('holderPW');
  wallet.initialize();
}

凭证

此包中最重要的一部分是支持的凭证。这些凭证能够通过简单的基于哈希的机制实现选择性披露。因此,每个凭证属性都使用盐进行哈希处理。由发行者签署的可验证凭证只包含这些哈希值。在持有者的钱包中,存储了两种凭证——一种包含所有值及其盐的凭证和一种已签名的凭证。选择性披露机制的使用是可选的。例如,第一种类型——在包中称为明文凭证——看起来像这样:

{
   "id":"did:ethr:0x1611994c317bed3102D65A93B667Dbe0591Da41c",
   "type": ["HashedPlaintextCredential2021","NameAgeCredential"],
   "hashAlg": "keccak-256",
   "name": {
   "value":"Max",
   "salt":"dc0931a0-60c6-4bc8-a27d-b3fd13e62c63",
  },
  "age": {
   "value":20,
   "salt":"3e9bacd3-aa74-42c1-9895-e490e3931a73",
  }
}

相应的签名可验证凭证如下所示:

{
    "@context":["https://www.w3.org/2018/credentials/v1",
    "https://credentials.hs-mittweida.de/credentials/ld-context/"],
    "type":["VerifiableCredential"],
    "credentialSubject": {
        "id":"did:ethr:0x1611994c317bed3102D65A93B667Dbe0591Da41c",
        "type":"NameAgeCredential",
        "name":"0xd8925653ed000200d2b491bcabe2ea69f378abb91f056993a6d3e3b28ad4ccc4",
        "age":"0x43bde6fcd11015c6a996206dadd25e149d131c69a7249280bae723c6bad53888"},
    "issuer":"did:ethr:0x6d32738382c6389eF0D79045a76411C42Fff3a5e",
    "issuanceDate":"2020-11-30T11:06:39.423520Z",
    "proof": {
        "type":"EcdsaSecp256k1RecoverySignature2020",
        "proofPurpose":"assertionMethod",
        "verificationMethod":"did:ethr:0x6d32738382c6389eF0D79045a76411C42Fff3a5e",
        "created":"2020-11-30T11:06:39.497073Z",
        "jws":"ey..E="}
}

目前仅支持 EcdsaSecp256k1RecoverySignature2020Ed25519Signature2020 作为证明部分的签名套件。如果需要其他套件,可以通过扩展签名器API来实现。如何开发和使用自己的签名套件详见 extendSigners.md

关于Json-Ld签名的一些注意事项

凭证的使用

根据 W3C 验证凭证规范,凭证由发行者签发,由持有者存储并提交给验证者。使用此包实现这一点的示例可以在 issuance.dartverification.dart 中找到。除了这之外,凭证还可以由发行者撤销,如 credential_revocation.dart 所示。对于撤销,使用了一个简单的以太坊智能合约,每个发行者都应该部署这样的合约。

密钥和标识符管理

这里使用的标识符是根据 did:ethr 方法did:key 方法 的去中心化标识符(DID)。在后一种情况下,目前只支持 Ed25519 和 X25519 密钥。所有密钥以类似于比特币钱包的方式进行分层确定性管理,因为建议为每个凭证或服务使用新的标识符。生成新的标识符可以使用以下代码:

var newDID = await wallet.getNextCredentialDID();
// 或者(当与新服务联系时)
var newDID = await wallet.getNextConnectionDID();

更多关于Flutter安全存储接口插件dart_ssi的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter安全存储接口插件dart_ssi的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用dart_ssi(假设这是一个用于安全存储接口的插件)的示例代码。由于dart_ssi并非一个广泛知名的官方或主流插件,这里将提供一个假设性的实现框架,基于通常的安全存储插件的使用方式。

首先,确保你已经在pubspec.yaml文件中添加了dart_ssi依赖(注意:这里dart_ssi是一个假设的包名,你需要替换为实际的包名):

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

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

接下来,在你的Flutter项目中,你可以按照以下方式使用dart_ssi进行安全存储操作。以下代码展示了如何存储和检索数据:

import 'package:flutter/material.dart';
import 'package:dart_ssi/dart_ssi.dart';  // 假设的包导入路径

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  late SecureStorage _secureStorage;

  @override
  void initState() {
    super.initState();
    // 初始化SecureStorage实例
    _secureStorage = SecureStorage();
  }

  Future<void> _saveData() async {
    String key = 'example_key';
    String value = 'example_value';
    try {
      await _secureStorage.write(key: key, value: value);
      print('Data saved successfully');
    } catch (e) {
      print('Error saving data: $e');
    }
  }

  Future<void> _readData() async {
    String key = 'example_key';
    try {
      String? value = await _secureStorage.read(key: key);
      if (value != null) {
        print('Data retrieved: $value');
      } else {
        print('No data found for key: $key');
      }
    } catch (e) {
      print('Error retrieving data: $e');
    }
  }

  Future<void> _deleteData() async {
    String key = 'example_key';
    try {
      await _secureStorage.delete(key: key);
      print('Data deleted successfully');
    } catch (e) {
      print('Error deleting data: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Secure Storage Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _saveData,
              child: Text('Save Data'),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: _readData,
              child: Text('Read Data'),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: _deleteData,
              child: Text('Delete Data'),
            ),
          ],
        ),
      ),
    );
  }
}

请注意,上面的代码是一个假设性的实现,因为dart_ssi插件的具体API可能会有所不同。你需要查阅该插件的官方文档来了解其确切的API和用法。

如果dart_ssi实际上是一个不存在的插件,你可能需要寻找一个类似的、用于安全存储的Flutter插件,如flutter_secure_storage,它是一个非常流行的用于在Flutter应用中安全存储数据的插件。使用flutter_secure_storage的方式非常类似,你只需要替换导入语句和初始化代码即可。

回到顶部