加密 SharedPreferences 中的数据

Posted

技术标签:

【中文标题】加密 SharedPreferences 中的数据【英文标题】:encrypt data in SharedPreferences 【发布时间】:2011-06-22 01:16:43 【问题描述】:

我目前正在为 oAuth 1 和 2 访问 web 服务开发一个框架,我的问题是,我如何以安全的方式存储敏感数据,如 oAuth 访问密钥? 这个密钥的问题是,像 twitter 这样的一些平台使用永久密钥,如果有人可以访问这个密钥,他可以对用户的 twitter 帐户做任何他想做的事情..

那么是否可以在数据存储到共享首选项之前自动加密数据?还是有更好的方法/地方来存储非常重要的数据?

更新 - 另请阅读:What is the most appropriate way to store user settings in android application

【问题讨论】:

***.com/a/6393502/82156 阅读这篇文章会让你对这个***.com/a/20560574/730807有更多的想法 【参考方案1】:

您还可以查看我为这样做而制作的这个课程:https://github.com/sveinungkb/encrypted-userprefs

它使用 AES 而不是其他建议中使用的已弃用和弱 DES。

【讨论】:

谢谢。这是非常需要的。我认为,如果您添加 JavaDocs,那将更加惊人。 :) @SveinungKvalBakken 你能检查一下我在 GitHub 上报告的问题。我被告知要随机化 IV 的大小。 @SveinungKvalBakken-在执行 getIv() 时,您已经完成了 "System.arraycopy("fldsjfodasjifudslfjdsaofshaufihadsf".getBytes(), 0, iv, 0, mWriter.getBlockSize());"你能更清楚地说明这一点吗?你复制的这个随机字符串是什么?【参考方案2】:

1)。如何加密?

在 Android 上,加密是通过 Java 密码体系结构 (JCA) 完成的。主要是javax.crypto.*包。

JCA Reference Guide

这是 JCA API 使用情况的example(特别是 AES 算法)。

2)。存放在哪里?

加密 API 使用字节数组(而不是字符串)进行操作。这意味着您可以使用SharedPreferences,但您需要在将加密字节数组放入SharedPreferences 之前对其应用Base-64 编码(否则XML 解析器将无法读取共享首选项文件)。然后要阅读,您将需要使用 Base-64 解码。请注意,默认情况下,大多数 Android 操作系统版本都没有内置的 Base-64 API(请参阅更新部分)。因此,为了消除这个 Base-64 开销,我建议将您的字节存储在 private file 中。

更新:从 API 级别 8 开始,API 有 android.util.Base64

【讨论】:

【参考方案3】:

我建议几乎每次都在 Android 上使用 Facebook Conceal 进行加密 - 这是一个快速的 Android 库,可以做出一些非常明智的决定,并为您提供一些简单的界面来实际执行工作。

奖金!我最近拼凑了如何从 Xamarin 使用它的难题 - 请参阅我在 securing your C# app's data using conceal 上的文章了解更多信息。

【讨论】:

【参考方案4】:

你应该看看Slink。 我开始意识到大多数 SharedPreferences 加密工具对您所做的每个操作都使用加密,这意味着每个键值对仅在键和值都分别加密后保存。这会产生很大的性能开销。

所以我搜索了一个可以为我提供更高效加密过程的库,然后我找到了 Slink。 Slink 使用 Facbook 的 Conceal 库将对象的整个映射保存为一个整体,使其成为最高效、最快速的 SharedPreferences 加密解决方案。它还使用常见的 Android 的 SharedPreferences 接口,这使得使用非常简单,几乎无缝。 免责声明:我是开发此库的开发团队的一员。

【讨论】:

【参考方案5】:

查看副本:Obfuscate/Encrypt SharedPreferences file possible?

您好,我使用 AES 创建了 SharedPreferences 实现 加密。该项目是一个Maven模块。如果你需要,拿一个 看。 https://github.com/kovmarci86/android-secure-preferences

【讨论】:

【参考方案6】:

尝试使用我们的https://github.com/BottleRocketStudios/Android-Vault Vault 组件。它将使用 Android 的 Keystore(在受支持的设备上)或混淆技术来加密 SharedPreference 文件中的值并实现 SharedPreference 接口,因此它在很大程度上是一个替代品。

【讨论】:

【参考方案7】:

facebook 推出的新加密 - 隐藏加密.. 易于使用

https://github.com/afiqiqmal/ConcealSharedPreference-Android

【讨论】:

【参考方案8】:

This article on codeproject 包含一个很好的共享首选项包装器。然而,类名SecurePreferences 具有误导性,类似ObfuscatedPreferences 会更合适。

【讨论】:

【参考方案9】:

有一个使用 Facebook Conceal 加密数据的 Android 库。

https://github.com/rtoshiro/SecureSharedPreferences

Maven 中心:

compile 'com.github.rtoshiro.securesharedpreferences:securesharedpreferences:1.0.+'

【讨论】:

【参考方案10】:

您可以对偏好设置中的数据进行加密,并将加密密钥保存在 AndroidKeystore 系统中。这样您的加密密钥也将是安全的。

您可以查看执行此操作的库 https://github.com/ophio/secure-preferences

【讨论】:

以上是关于加密 SharedPreferences 中的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何将 SharedPreferences 中的数据保存并显示为列表?

使用 SharedPreferences 中的令牌持有者编辑配置文件数据

Android 工具类 SharedPreferences 封装

Flutter——SharedPreferences

Flutter——SharedPreferences

如何在flutter中使用mysql数据库(或json)中的sharedpreferences键选择以列出最喜欢的记录?