如何在flutter中保护本地存储的数据

Posted

技术标签:

【中文标题】如何在flutter中保护本地存储的数据【英文标题】:How to protect stored data locally in flutter 【发布时间】:2022-01-20 22:34:31 【问题描述】:

我创建了一个带有本地存储 pdf 文件的颤振应用程序,我想保护它免受逆向工程的影响,当有人从 google play 下载该应用程序并想要查看该应用程序的内容时,他们不能这样做吗? 注意:该应用程序仅适用于 android 用户。

【问题讨论】:

【参考方案1】:

我假设您的应用必须在某个时候访问该 PDF,否则它不应该是您的项目文件夹。

即使 Android 拥有所有安全机制,也无法确保这一点。用户可以完全访问他的设备。您可以加密 PDF 并仅将加密的内容存储在手机上,但随后您必须将密钥存储在其他地方。在原生 android 中,有一个叫做 Android keystore system 的东西,您可以使用它来存储加密密钥,但同样您只是将问题更进一步。

最终,您只能使提取 PDF 变得困难,但您永远无法阻止人们最终提取它。与普通攻击者一样,一旦有人可以物理访问设备,您几乎可以假设他可以访问所有内容。


更新: OP 询问如何使 PDF 难以提取。

我建议在本地使用 AES 加密 PDF,然后将密钥存储在安全的本地存储中。

第 1 步: 加密 PDF:如果您想在运行时加密 PDF,请查看 package,但如果可以的话,我建议您事先使用其他工具对其进行加密。无论如何,您最终都需要这个包来解密 PDF。

代码可能看起来像这样(阅读文档以获取工作代码示例):

// Don't use a hardcoded key. Generate a long random string for the AES key or fetch it (with authentication) from somewhere if it is pre-generated.
String yourKey = 'YOUR ENCRYPTION KEY';
var crypt = AesCrypt(yourKey);
// Encrypts the file srcfile.txt and saves encrypted file under original name 
// with '.aes' extention added (srcfile.txt.aes).
crypt.encryptFileSync('srcfile.txt');

解密:

// Decrypt the data from 'mydata.bin.aes' file
Uint8List decryptedData = crypt.decryptDataFromFileSync('mydata.bin.aes');

第 2 步:确保您已删除未加密的文件。

第 3 步: 存储加密密钥。看看this 包。它将密钥分别存储在Android Keystoreios Keychain 中(这也是API 密钥的最佳实践)。 代码可能如下所示:

import 'package:flutter_secure_storage/flutter_secure_storage.dart';

// Create storage
final storage = new FlutterSecureStorage();
// Write value using your another key, this one can be hardcoded
await storage.write(key: "yourStorageKey123", value: yourKey );

获取解密 PDF 的密钥:

// Read value
String value = await storage.read(key: "yourStorageKey123");

总而言之,这应该会使提取 PDF 变得非常烦人,但并非不可能。顺便说一句,这也是存储 API 密钥的应用程序的数量。

【讨论】:

感谢您提供的所有信息。我的问题是我如何使提取 PDF 变得困难? 我已经更新了我的答案。 非常感谢,我会试试的。 如果您发现对 *** 有帮助的答案,请记得接受并投上一票,欢迎来到 SO ;)

以上是关于如何在flutter中保护本地存储的数据的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 并将数据保存到本地存储

在本地管理 Flutter 应用和 Flutter Web 数据

如何在浏览器本地存储 Flutter Web 应用程序中保存对象列表

flutter 本地存储数据(shared_preferences)

在 Flutter 中使用 SQFlite 将本地存储的 DB 导出为可读文件

如何在本地存储/外部 Flutter 中创建文件夹?