【问题标题】:How to securely save a SharedPreference on Android device?如何在 Android 设备上安全地保存 SharedPreference?
【发布时间】:2012-10-01 17:22:42
【问题描述】:

我有一些 SharedPreferences 我想尽可能安全地保存在设备本身上。我对安全一无所知,但我通过一些研究发现我想要的是一种叫做“混淆器”的东西。那正确吗?这与“加密”有什么不同,还是我想两者都做?我还发现我可以使用AESObfuscatorProGuard。有什么区别?还有更多选择吗?我应该使用哪个?

我显然对安全性非常陌生,因此任何教程或其他参考资料都会有所帮助。

【问题讨论】:

  • 您存储了哪些值,为什么要保护它们?
  • 一对字符串和一对长。没什么太复杂的。因为它们是访问密钥,而我没有服务器来存储它们,所以我必须将它们存储在本地。

标签: android encryption obfuscation sharedpreferences proguard


【解决方案1】:

在这种情况下,混淆器不会为您做任何事情,因为它本质上所做的只是将变量重命名为非人类可读的名称。

您要做的是在数据保存到您的SharedPreferences 时对其进行加密,并在您从中读取数据时对其进行解密。

这个想法的一个例子Encrypted SharedPrefs,我不能说它有多有效,我之前没有使用过。

【讨论】:

  • 链接的AESObfuscator 实际上确实使用静态密钥加密字符串,以便可以将它们保存到共享首选项。这与 ProGuard 等 code 混淆器不同。它被称为“混淆”而不是“加密”,因为密钥在应用程序中,并且很容易反转(通过解密)。
  • @jug6ernaut 我找到了您的帖子并决定在链接中使用加密的共享首选项。它非常易于实施且易于使用。至于加密的强度,我不知道,但是如果你进入并尝试更改root手机上的值,所有的文本都是乱码。
【解决方案2】:

链接的AESObfuscator 使用静态密钥对字符串进行加密,以便可以将它们保存到共享首选项中,而且它们是什么并不是很明显。这与诸如 ProGuard 之类的代码混淆器不同,后者会破坏代码中的方法和变量名称,从而使其更难进行逆向工程。它被称为“混淆”而不是“加密”,因为密钥在应用程序中,并且很容易反转(通过提取密钥和解密)。共享首选项混淆会使读取和修改字符串变得更加困难,但并非不可能。如果您可以接受该级别的保护,请使用此方法。使用代码混淆也是一个好主意,因此您希望同时使用这两种方法。

唯一支持的“不可能”解密字符串的方法是让用户在每次使用应用程序时输入密码并从中派生加密密钥。这可行,但不用说,它对用户不是很友好。如果你有兴趣,这里是some details

【讨论】:

  • 我想我会尝试使用 AESObfuscator。我需要整个许可库吗,还是可以只使用 PreferenceObfuscator 类?
  • 不是全部,而是像Security等相关的类,IIRC。检查它引用了哪些类并将它们添加到您的项目中,直到编译器满意为止。
【解决方案3】:

当我需要在 Java 文件中“隐藏”一些 URL 时,我对这个问题进行了一些研究。在您的情况下,它将是某种加密您的字符串的密钥。存在一个问题,即任何人都可以使用某种逆向工程来读取 Java/Android 中的整个代码。有时它很容易,而像 ProGuard 这样的混淆器让它变得更难一些。因此,任何人都可以看到您的加密密钥。有一些(付费)混淆器甚至可以隐藏 Java 文件中的字符串,但我不确定它们有多可靠。
简而言之 - 将您的字符串保存在您的服务器上的设备之外,并在您的设备和服务器之间使用某种安全连接 (SSL)。或者您可以要求您的服务器对其进行加密并将其发送回给您。如果您将密钥保存在设备上,您将永远无法确定是否有人会使用逆向工程来读取它。

【讨论】:

  • 谢谢,但我特意询问有关在设备本身上保存 SharedPreference 的问题。我没有服务器。
  • 我知道,但在这种情况下,它不会受到 100% 的保护。
【解决方案4】:

唯一安全的方法是不在设备上保留任何敏感信息 - 如果它存在,它将被提取,前提是它的价值超过工作人员的时间(第三世界国家的熟练孩子真的便宜,就金钱而言,准时富裕)。您可能会看到这是如何使用 OAuth 完成的 - 该技术允许(例如)将 3rd 方应用程序登录到 twitter,而不会损害安全凭据(或应用程序曾经看到它们)

一个好的库是:http://code.google.com/p/oauth-signpost/

【讨论】:

  • 谢谢,但我想问的是如何在设备上存储数据。我知道它不安全,但我想让它尽可能安全。
  • 访问密钥的使用场景是什么?如果它们用于识别用户,您可以使用单向哈希对它们进行加密并使用它来识别用户 - 当物理访问磁盘驱动器时,这将像每个 unix 系统一样获得合理的安全性。如果这些密钥用于向其他应用程序识别您的应用程序,那么 OAuth 将是最安全的解决方案,您仍然可以控制并且可以撤销对某些应用程序甚至设备的访问权限
猜你喜欢
  • 2012-03-03
  • 2013-12-23
  • 1970-01-01
  • 2012-06-11
  • 2022-01-08
  • 2015-03-24
  • 1970-01-01
  • 2023-03-13
  • 2012-08-18
相关资源
最近更新 更多