flutter_data_sodium 1.0.0
flutter_data_sodium: ^1.0.0 copied to clipboard
An extension package to flutter_data that adds End-To-End-Encryption to all requests
flutter_data_sodium #
An extension package to flutter_data that adds End-To-End-Encryption to all requests.
Table of Contents #
Features #
- Implements a
RemoteAdapterthat encrypts all request data and decrypts all response data - All encryption is based on a single master key that is unique per user
- Also providers methods to use sodium for encrypting the local hive boxes
Installation #
Simply add flutter_data_sodium to your pubspec.yaml and run dart pub get (or flutter pub get).
You should also add flutter_data to your dependencies. If you are build a flutter app, you should add sodium_libs as
well, or sodium for plain dart applications.
Usage #
Since this is only an extension to flutter_data, you should refer to flutter_data quick start guide.
After finishing that guide, you can start with encryption by following the next steps.
First, you need to create your own key manager. The easiest way is to use the PassphraseBasedKeyManager together with
the ParallelMasterKeyComputation mixin to get a smooth user experience.
import 'package:flutter/foundation.dart' as ff;
import 'package:sodium_libs/sodium_libs.dart';
class MyKeyManager extends PassphraseBasedKeyManager
with ParallelMasterKeyComputation {
MyKeyManager(Sodium sodium) : super(sodium: sodium);
@override
CreateSodiumFn get sodiumFactory => SodiumInit.init;
@override
Future<R> compute<Q, R>(ComputeCallback<Q, R> callback, Q message) =>
ff.compute(
callback,
message,
debugLabel: '$MyKeyManager.compute',
);
@override
FutureOr<MasterKeyComponents> loadMasterKeyComponents(int saltBytes) {
final password = await letUserInputPassword();
final salt = await generateSaltForUser(saltBytes);
return MasterKeyComponents(
password: password,
salt: salt
);
}
}
The letUserInputPassword and generateSaltForUser methods are dummy methods. Here you will have to implement your own
logic to get both, a passphrase of the user and some kind of salt that is unique for the user (but must never change).
To now add the encryption, you need to let your ApplicationAdapter be a mixin on the SodiumRemoteAdapter. The
following sample assumes you are build a flutter app and have already add the sodium_libs package as dependency.
import 'package:sodium_libs/sodium_libs.dart';
mixin ApplicationAdapter<T extends DataModel<T>> on SodiumRemoteAdapter<T> {
@override
String get baseUrl => 'https://my-json-server.typicode.com/flutterdata/demo/';
@override
late final Sodium sodium;
@override
late final keyManager = KeyManager(sodium);
@override
@mustCallSuper
Future<void> onInitialized() async {
await super.onInitialized();
sodium = await SodiumInit.init();
}
}
And thats it! With that, all your data will get encrypted. The data can also be synced between different devices, as long as they all use the same master key (in this example: The same passphrase and salt).
Documentation #
The documentation is available at https://pub.flutter-io.cn/documentation/flutter_data_sodium/latest/. A full example can be found at https://pub.flutter-io.cn/packages/flutter_data_sodium/example.