在 Android 应用程序中加密大量文本数据的最佳方法?

Posted

技术标签:

【中文标题】在 Android 应用程序中加密大量文本数据的最佳方法?【英文标题】:Best way to encrypt large amounts of text data in Android application? 【发布时间】:2016-07-17 17:08:33 【问题描述】:

我有一个正在开发的 android 应用程序,其中包含大量基于文本的数据(该应用程序本质上是一个参考/学习指南)。

我想确保如果设备上的升级版 APK 从设备中提取并“反编译”,文本数据会以某种方式加密。有什么方法可以加密文本数据,使提取的文本不可用?

【问题讨论】:

是什么让您认为用于加密文本的密钥不是从 apk 中提取并用于解密这些文本? 这个关键问题正是我问这个问题的原因。我已经遇到了关键问题,我从您的回复中假设您至少知道无法保护密钥并仍然允许访问数据。我假设它可能只是不可行,但我仍然不得不问。 没错。像 proguard 这样的混淆器只能对懒惰的“黑客”隐藏这些信息,但不能完美地保护这些信息。如果你想加密一些东西,那么你仍然需要附近的解密密钥。 【参考方案1】:

使用 AES 加密对文本进行加密。使用带有随机 IV 的 PKCS#7 née PKCS#5 填充和 CBC 模式,将 IV 添加到加密数据。您还应该预先添加加密数据的哈希以进行身份​​验证。

您可以查看RNCryptor-Spec 了解数据布局。 RNCryptor 用于实现包括 IV、加密身份验证、版本控制。

【讨论】:

感谢所有有关加密方法的链接。对于我遇到的任何加密方法,我遇到的最大问题是必须在 apk 中“公开”密钥才能访问加密数据。关于如何以某种方式不公开密钥但仍以某种方式加密/解密代码中的数据的任何想法。 (我意识到这是一项艰巨的任务,但我认为那里有人必须面对这个问题并提出一些聪明的想法/解决方法)。即使我可以加密 APK 超出 pro Guard 提供的范围,那也很棒。 对加密密钥保密是一个问题,在手机上没有完整的解决方案。显然,在使用密钥进行加密/解密时,它必须在内存中,并且可以由熟练的攻击者获得。如果密钥被编译到应用程序中,任何可以访问应用程序二进制文件的人都可以访问它,那么最好的办法就是以某种方式对其进行混淆,可能将其编码并拆分成碎片,搜索此类方法。如果密钥是在运行时创建的,请将其保存在 Android 密钥库中,请注意用户将有权访问该密钥。您可能需要的是 DRM 解决方案。 您可能已经找到了拆分密钥的解决方案,然后以某种方式使用混淆过程使用户几乎不可能将密钥重新组合在一起。我将深入研究 proguards 混淆过程,看看我可以如何“完成”这个过程。非常感谢! 我相信有兴趣的人可以使用调试器单步调试您的代码,因此定制的混淆器将不起作用。由于这个原因(据我所知),Android Keystore api 在您的应用程序进程之外工作。 这一切都是为了增加工作系数,因为没有 100% 的保护可用。确定攻击者的能力和兴趣以及受保护内容的价值,并尝试防范。鉴于混淆不是特别安全,它确实会增加工作量。

以上是关于在 Android 应用程序中加密大量文本数据的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

比较大量相似文本的最简单方法是啥?

Android:在应用程序中显示大量格式化文本

在Android中处理非常大量数据的好方法是啥?

Android使用KeyStore对数据进行加密

AndroidiPhone和Java三个平台一致的加密工具

Expo/React Native 可以将大量加密数据保存到 iCloud 吗?