加密 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中使用mysql数据库(或json)中的sharedpreferences键选择以列出最喜欢的记录?