Вероятно, это глупый и повторяющийся вопрос для многих опытных разработчиков, однако у меня нет опыта, поэтому я задаю этот вопрос. Я хотел бы получить доступ к зашифрованному значению в этом поле, чтобы визуально, вручную проверить и увидеть, что шифрование выполнено. Кажется, я не могу распечатать зашифрованное значение, выходит только расшифрованное значение.

Я тестирую этот пример с помощью демонстрационного кода.

Я что-то делаю не так или метод .get () по умолчанию расшифровывает вызов?

import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:hive/hive.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:hive_flutter/hive_flutter.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Hive.initFlutter();

  String key = 'key';
  String secret = 'secret value';

  final FlutterSecureStorage secureStorage = const FlutterSecureStorage();
  var containsEncryptionKey = await secureStorage.containsKey(key: 'key');
  if (!containsEncryptionKey) {
    var key = Hive.generateSecureKey();
    await secureStorage.write(key: 'key', value: base64UrlEncode(key));
  }

  print(await secureStorage.readAll());

  var encryptionKey = base64Url.decode(await secureStorage.read(key: 'key'));
  print('Encryption key: $encryptionKey');

  var encryptedBox = await Hive.openBox('secure_box',
      encryptionCipher: HiveAesCipher(encryptionKey));
  encryptedBox.put(key, secret);

  print(Hive.box('secure_box').values);     // Should this not be encrypted text?
  print(encryptedBox.get(key));
}

Выход:

flutter: {key: Wr1fM3XHtIefLX8JKGJfPNiHdaWiNZspbml6NJeJkTk=}
flutter: Encryption key: [90, 189, 95, 51, 117, 199, 180, 135, 159, 45, 127, 9, 40, 98, 95, 60, 216, 135, 117, 165, 162, 53, 155, 41, 110, 105, 122, 52, 151, 137, 145, 57]
flutter: (secret value, secret_value)
flutter: secret_value
0
RobbB 22 Фев 2021 в 01:44

1 ответ

Лучший ответ

Потому что, когда ты звонишь Hive.box('secure_box').values
Фактически он возвращает ранее открытое поле, также известное как encryptedBox с HiveAesCipher(encryptionKey), поэтому вы можете видеть правильное значение
Вы можете сослаться на описание исходного кода здесь https: / /github.com/hivedb/hive/blob/59ad5403593283233d922f62f76832c64fa33a3b/hive/lib/src/hive.dart#L39

/// Returns a previously opened box.
  Box<E> box<E>(String name);

To open an existing box, you need to provide the key you used to create it
Вы можете ссылаться на комментарии команд куста в Encrypted box - Why store the encryption key? https: // github. com / hivedb / hive / issues / 556 # issuecomment-770458818
Таким образом, вы всегда получите правильное значение открытого текста, если откроете окно с правильным HiveAesCipher(encryptionKey)

1
chunhunghan 22 Фев 2021 в 01:54