Skip to content

Commit 75b64b8

Browse files
gitubpatriceclaude
andcommitted
v0.9.10: bump flutter_secure_storage 9.2.2 → 10.x (Tink-style ciphers)
Le backend 9.x EncryptedSharedPreferences (Jetpack Crypto) est déprécié et non maintenu. La 10.x utilise ses propres ciphers (RSA-OAEP wrap + AES-256-GCM contenu) avec clé maître toujours scellée par AndroidKeystore. Migration KEK SQLCipher : AUTOMATIQUE via `migrateOnAlgorithmChange: true` (défaut 10.x). Au premier boot post-upgrade, la lib lit la KEK existante chiffrée par ESP, puis la ré-écrit avec les nouveaux ciphers — aucune perte de données utilisateur. Pattern validé en prod sur pass_tech v2.x. CRITIQUE : on force `resetOnError: false` (défaut 10.x = `true`), sinon une erreur transitoire de déchiffrement Keystore au boot froid effacerait silencieusement la KEK et rendrait toutes les notes illisibles à jamais. Breaking API 10.x : IOSOptions / MacOsOptions unifiés en AppleOptions → adaptation du mock _InMemoryStorage dans vault_service_test.dart. Tests : 60 passed + 2 skipped, analyze clean (3 infos préexistantes). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 24b4133 commit 75b64b8

5 files changed

Lines changed: 50 additions & 39 deletions

File tree

lib/core/constants.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ class AppConstants {
55
AppConstants._();
66

77
static const String appName = 'Notes Tech';
8-
static const String appVersion = '0.9.9';
8+
static const String appVersion = '0.9.10';
99
// NB : la clé Kotlin équivalente côté `MainActivity.kt` est
1010
// `flutter.secure_window_enabled` (préfixe `flutter.` ajouté
1111
// automatiquement par `shared_preferences` au moment de la persistance).

lib/services/security/vault_service.dart

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,23 @@ class VaultService {
4343

4444
Future<Uint8List>? _inflight;
4545

46+
// flutter_secure_storage v10+ : EncryptedSharedPreferences (Jetpack Crypto)
47+
// est déprécié côté lib (sera retiré en v11). Le backend par défaut en 10.x
48+
// utilise ses propres ciphers (RSA_ECB_OAEPwithSHA_256andMGF1Padding pour
49+
// wrap key + AES_GCM_NoPadding pour contenu) avec une clé maître scellée
50+
// par AndroidKeystore. La migration depuis 9.x est AUTOMATIQUE via
51+
// `migrateOnAlgorithmChange: true` (défaut) : la lib lit la KEK existante
52+
// (chiffrée par ESP), puis ré-écrit avec les nouveaux ciphers.
53+
//
54+
// CRITIQUE : `resetOnError: false` — en 10.x le défaut est `true` ce qui
55+
// EFFACERAIT silencieusement la KEK en cas d'erreur transitoire de
56+
// déchiffrement (ex. crash Keystore au boot froid). Si la KEK disparaît,
57+
// SQLCipher refuse d'ouvrir la base et TOUTES LES NOTES UTILISATEUR
58+
// deviennent illisibles à jamais. On force donc le comportement
59+
// « préserver à tout prix » et on laisse l'erreur remonter — l'app
60+
// affichera un écran d'erreur plutôt que de wiper les données.
4661
static FlutterSecureStorage _defaultStorage() => const FlutterSecureStorage(
4762
aOptions: AndroidOptions(
48-
encryptedSharedPreferences: true,
49-
// `keyCipherAlgorithm` et `storageCipherAlgorithm` laissent
50-
// les défauts les plus récents (RSA_ECB_PKCS1Padding pour le
51-
// wrap key, AES_256_GCM_NoPadding pour le contenu).
5263
resetOnError: false,
5364
),
5465
);

pubspec.lock

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -248,50 +248,50 @@ packages:
248248
dependency: "direct main"
249249
description:
250250
name: flutter_secure_storage
251-
sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea"
251+
sha256: "8b302d17096ba88f911b7eb317c71d5e691da60a259549f42b38c658d1776d87"
252252
url: "https://pub.dev"
253253
source: hosted
254-
version: "9.2.4"
255-
flutter_secure_storage_linux:
254+
version: "10.1.0"
255+
flutter_secure_storage_darwin:
256256
dependency: transitive
257257
description:
258-
name: flutter_secure_storage_linux
259-
sha256: be76c1d24a97d0b98f8b54bce6b481a380a6590df992d0098f868ad54dc8f688
258+
name: flutter_secure_storage_darwin
259+
sha256: "3af15a3cb2bf5b8b776832bd01776f8018766aece55623176e28b406481fb320"
260260
url: "https://pub.dev"
261261
source: hosted
262-
version: "1.2.3"
263-
flutter_secure_storage_macos:
262+
version: "0.3.0"
263+
flutter_secure_storage_linux:
264264
dependency: transitive
265265
description:
266-
name: flutter_secure_storage_macos
267-
sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247"
266+
name: flutter_secure_storage_linux
267+
sha256: "2b5c76dce569ab752d55a1cee6a2242bcc11fdba927078fb88c503f150767cda"
268268
url: "https://pub.dev"
269269
source: hosted
270-
version: "3.1.3"
270+
version: "3.0.0"
271271
flutter_secure_storage_platform_interface:
272272
dependency: transitive
273273
description:
274274
name: flutter_secure_storage_platform_interface
275-
sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8
275+
sha256: "8ceea1223bee3c6ac1a22dabd8feefc550e4729b3675de4b5900f55afcb435d6"
276276
url: "https://pub.dev"
277277
source: hosted
278-
version: "1.1.2"
278+
version: "2.0.1"
279279
flutter_secure_storage_web:
280280
dependency: transitive
281281
description:
282282
name: flutter_secure_storage_web
283-
sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9
283+
sha256: "073a62b3aeb866ab4ce795f960413948e51e5a42a9b0c8333b6daf5bb3208a1c"
284284
url: "https://pub.dev"
285285
source: hosted
286-
version: "1.2.1"
286+
version: "2.1.1"
287287
flutter_secure_storage_windows:
288288
dependency: transitive
289289
description:
290290
name: flutter_secure_storage_windows
291-
sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709
291+
sha256: "3b7c8e068875dfd46719ff57c90d8c459c87f2302ed6b00ff006b3c9fcad1613"
292292
url: "https://pub.dev"
293293
source: hosted
294-
version: "3.1.2"
294+
version: "4.1.0"
295295
flutter_test:
296296
dependency: "direct dev"
297297
description: flutter
@@ -374,14 +374,6 @@ packages:
374374
url: "https://pub.dev"
375375
source: hosted
376376
version: "1.0.1"
377-
js:
378-
dependency: transitive
379-
description:
380-
name: js
381-
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
382-
url: "https://pub.dev"
383-
source: hosted
384-
version: "0.6.7"
385377
json_annotation:
386378
dependency: transitive
387379
description:

pubspec.yaml

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: notes_tech
22
description: "Notes Tech — notes Markdown chiffrées avec coffres par dossier, IA on-device (Gemma + Whisper) et backlinks. 100 % local, zéro permission Internet."
33
publish_to: 'none'
4-
version: 0.9.9+26
4+
version: 0.9.10+27
55

66
environment:
77
sdk: ^3.11.5
@@ -34,9 +34,17 @@ dependencies:
3434
intl: ^0.20.0
3535
crypto: ^3.0.5
3636

37-
# Sécurité v0.5 — KEK 32 octets stockée dans EncryptedSharedPreferences
38-
# côté Android (clé maître scellée par AndroidKeystore, hardware-backed).
39-
flutter_secure_storage: ^9.2.2
37+
# Sécurité v0.5 — KEK 32 octets stockée via flutter_secure_storage,
38+
# clé maître scellée par AndroidKeystore (hardware-backed sur S24+).
39+
# v0.9.10 : migration 9.x → 10.x. Le backend 9.x (EncryptedSharedPreferences /
40+
# Jetpack Crypto) est déprécié et non maintenu. La 10.x utilise ses propres
41+
# ciphers (RSA-OAEP wrap + AES-256-GCM contenu) avec migration AUTOMATIQUE
42+
# depuis 9.x via `migrateOnAlgorithmChange: true` (défaut).
43+
# ⚠️ NE PAS bumper vers 11.x sans tester explicitement la persistance de
44+
# la KEK SQLCipher : v11 retirera complètement le backend ESP, donc tout
45+
# device qui n'aurait pas migré depuis 9.x perdrait sa KEK → notes illisibles.
46+
# Avant v11 : ajouter un test E2E ou forcer un boot intermédiaire en 10.x.
47+
flutter_secure_storage: ^10.0.0
4048

4149

4250
# v0.6 — Speech-to-Text on-device (Whisper) via package partagé sibling.

test/vault_service_test.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ class _InMemoryStorage implements FlutterSecureStorage {
1414
@override
1515
Future<String?> read({
1616
required String key,
17-
IOSOptions? iOptions,
17+
AppleOptions? iOptions,
1818
AndroidOptions? aOptions,
1919
LinuxOptions? lOptions,
2020
WebOptions? webOptions,
21-
MacOsOptions? mOptions,
21+
AppleOptions? mOptions,
2222
WindowsOptions? wOptions,
2323
}) async {
2424
reads++;
@@ -29,11 +29,11 @@ class _InMemoryStorage implements FlutterSecureStorage {
2929
Future<void> write({
3030
required String key,
3131
required String? value,
32-
IOSOptions? iOptions,
32+
AppleOptions? iOptions,
3333
AndroidOptions? aOptions,
3434
LinuxOptions? lOptions,
3535
WebOptions? webOptions,
36-
MacOsOptions? mOptions,
36+
AppleOptions? mOptions,
3737
WindowsOptions? wOptions,
3838
}) async {
3939
writes++;
@@ -47,11 +47,11 @@ class _InMemoryStorage implements FlutterSecureStorage {
4747
@override
4848
Future<void> delete({
4949
required String key,
50-
IOSOptions? iOptions,
50+
AppleOptions? iOptions,
5151
AndroidOptions? aOptions,
5252
LinuxOptions? lOptions,
5353
WebOptions? webOptions,
54-
MacOsOptions? mOptions,
54+
AppleOptions? mOptions,
5555
WindowsOptions? wOptions,
5656
}) async {
5757
_store.remove(key);

0 commit comments

Comments
 (0)