下午好 我叫Dmitry,是Otus基础课程“ Android Developer”的老师。 今天,我决定分享这篇文章的翻译,我觉得这很有趣,我认为它对我们博客的许多读者有用。

在SharedPreferences中存储数据非常快捷方便。 对于网络罪犯来说,查看存储在SharedPreferences中的数据也很容易……因此请小心放置在其中,您可能必须考虑如何以加密格式存储数据。
对于无法证明使用数据库引擎(例如SqlCipher)的少量数据,我们的功能受到限制:
- 本机加密方法(如果您知道自己在做什么)
- 现成的解决方案,例如安全首选项,其他安全首选项,犰狳等。
- 在每个版本的Android中解决最奇怪的Keystore Android系统生命周期问题
这以前曾经奏效,但现在我们有了正确的
官方解决方案 。
尽管它仍然是Alpha版,但当我在项目中使用它时,它会运行一段时间。 对于
min-sdk 23+的所有用户,欢迎使用
EncryptedSharedPreferences (或可以使用它)。
让我们看一下如何使用它的示例:
EncryptedSharedPreferences示例
最低SDK
今日23(Android 6.0)
minSdkVersion 23
添加依赖项
implementation "androidx.security:security-crypto:1.0.0-alpha02"
初始化/打开
只需从Android密钥库创建或检索主密钥,然后使用它来初始化/打开一个EncryptedSharedPreferences实例:
保存记录
像往常一样使用SharedPreferences保存数据:
阅读笔记
像往常一样使用SharedPreferences读取数据:
设置真的加密了吗?
是的,而且确实加密得很好。
假设我将
akaita
值放入
SharedPreferences
。 这是文件的外观:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="DATA">akaita</string> </map>
如果将
akaita
值添加到
EncryptedSharedPreferences
,
akaita
得到完全不同的结果:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="AVz2qCVxm1KudCCJKYuxuoaAXoPeWKjG0w==">ASnO9uni11t3m9sNgDJbiYllL/tE+i99TYKfQ0h8XV6AUN0O3rBxBsMmcpw2DCY=</string> <string name="__androidx_security_crypto_encrypted_prefs_key_keyset__">12a901eb372af4775b09f5b51d20d49428931c5d8e0b17dd103d2169c1879b8b13958274d7e25d3cc052f301461495fd40b70806ae244f456726802460318bdf19dce444e7a60f20c903c5a57140ea8e90a19a1b48559961d145a50000d1c0e22ca918b02ea0cc34e433900f44c00e9c791ecb678f26d293c0226d6c2a9e25e610616ec34241b06410481427a850eeedf85ee4c725d5dbd715b5a8d0e017be9a568a9f960989271d14d2d0531a4408a5d0dae705123c0a30747970652e676f6f676c65617069732e636f6d2f676f6f676c652e63727970746f2e74696e6b2e4165735369764b6579100118a5d0dae7052001</string> <string name="__androidx_security_crypto_encrypted_prefs_value_keyset__">12880189e734bbbf9cfa3bc15b5e53ea8df03341269cf97112a60a1f6482732dd33248b3f821397fb04ef3372ff54336e9045a0b0c0fb7afdf475dbc98a1107d09de66afcc5ad063e5e5b59a7d616e14834e19769bc84de7e5c8716a811814a6cd7a6d72a1c64ce4317f2f482181c437b70f010219ca6407a98bac18f1101c02fd8e2c4a9009ad2a1ebbdc1a4408e9edbbce02123c0a30747970652e676f6f676c65617069732e636f6d2f676f6f676c652e63727970746f2e74696e6b2e41657347636d4b6579100118e9edbbce022001</string> </map>
”> 12a901eb372af4775b09f5b51d20d49428931c5d8e0b17dd103d2169c1879b8b13958274d7e25d3cc052f301461495fd40b70806ae244f456726802460318bdf19dce444e7a60f20c903c5a57140ea8e90a19a1b48559961d145a50000d1c0e22ca918b02ea0cc34e433900f44c00e9c791ecb678f26d293c0226d6c2a9e25e610616ec34241b06410481427a850eeedf85ee4c725d5dbd715b5a8d0e017be9a568a9f960989271d14d2d0531a4408a5d0dae705123c0a30747970652e676f6f676c65617069732e636f6d2f676f6f676c652e63727970746f2e74696e6b2e4165735369764b6579100118a5d0dae7052001 </字符串> <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="AVz2qCVxm1KudCCJKYuxuoaAXoPeWKjG0w==">ASnO9uni11t3m9sNgDJbiYllL/tE+i99TYKfQ0h8XV6AUN0O3rBxBsMmcpw2DCY=</string> <string name="__androidx_security_crypto_encrypted_prefs_key_keyset__">12a901eb372af4775b09f5b51d20d49428931c5d8e0b17dd103d2169c1879b8b13958274d7e25d3cc052f301461495fd40b70806ae244f456726802460318bdf19dce444e7a60f20c903c5a57140ea8e90a19a1b48559961d145a50000d1c0e22ca918b02ea0cc34e433900f44c00e9c791ecb678f26d293c0226d6c2a9e25e610616ec34241b06410481427a850eeedf85ee4c725d5dbd715b5a8d0e017be9a568a9f960989271d14d2d0531a4408a5d0dae705123c0a30747970652e676f6f676c65617069732e636f6d2f676f6f676c652e63727970746f2e74696e6b2e4165735369764b6579100118a5d0dae7052001</string> <string name="__androidx_security_crypto_encrypted_prefs_value_keyset__">12880189e734bbbf9cfa3bc15b5e53ea8df03341269cf97112a60a1f6482732dd33248b3f821397fb04ef3372ff54336e9045a0b0c0fb7afdf475dbc98a1107d09de66afcc5ad063e5e5b59a7d616e14834e19769bc84de7e5c8716a811814a6cd7a6d72a1c64ce4317f2f482181c437b70f010219ca6407a98bac18f1101c02fd8e2c4a9009ad2a1ebbdc1a4408e9edbbce02123c0a30747970652e676f6f676c65617069732e636f6d2f676f6f676c652e63727970746f2e74696e6b2e41657347636d4b6579100118e9edbbce022001</string> </map>
”> 12880189e734bbbf9cfa3bc15b5e53ea8df03341269cf97112a60a1f6482732dd33248b3f821397fb04ef3372ff54336e9045a0b0c0fb7afdf475dbc98a1107d09de66afcc5ad063e5e5b59a7d616e14834e19769bc84de7e5c8716a811814a6cd7a6d72a1c64ce4317f2f482181c437b70f010219ca6407a98bac18f1101c02fd8e2c4a9009ad2a1ebbdc1a4408e9edbbce02123c0a30747970652e676f6f676c65617069732e636f6d2f676f6f676c652e63727970746f2e74696e6b2e41657347636d4b6579100118e9edbbce022001 </字符串> <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="AVz2qCVxm1KudCCJKYuxuoaAXoPeWKjG0w==">ASnO9uni11t3m9sNgDJbiYllL/tE+i99TYKfQ0h8XV6AUN0O3rBxBsMmcpw2DCY=</string> <string name="__androidx_security_crypto_encrypted_prefs_key_keyset__">12a901eb372af4775b09f5b51d20d49428931c5d8e0b17dd103d2169c1879b8b13958274d7e25d3cc052f301461495fd40b70806ae244f456726802460318bdf19dce444e7a60f20c903c5a57140ea8e90a19a1b48559961d145a50000d1c0e22ca918b02ea0cc34e433900f44c00e9c791ecb678f26d293c0226d6c2a9e25e610616ec34241b06410481427a850eeedf85ee4c725d5dbd715b5a8d0e017be9a568a9f960989271d14d2d0531a4408a5d0dae705123c0a30747970652e676f6f676c65617069732e636f6d2f676f6f676c652e63727970746f2e74696e6b2e4165735369764b6579100118a5d0dae7052001</string> <string name="__androidx_security_crypto_encrypted_prefs_value_keyset__">12880189e734bbbf9cfa3bc15b5e53ea8df03341269cf97112a60a1f6482732dd33248b3f821397fb04ef3372ff54336e9045a0b0c0fb7afdf475dbc98a1107d09de66afcc5ad063e5e5b59a7d616e14834e19769bc84de7e5c8716a811814a6cd7a6d72a1c64ce4317f2f482181c437b70f010219ca6407a98bac18f1101c02fd8e2c4a9009ad2a1ebbdc1a4408e9edbbce02123c0a30747970652e676f6f676c65617069732e636f6d2f676f6f676c652e63727970746f2e74696e6b2e41657347636d4b6579100118e9edbbce022001</string> </map>
此外,每次保存时,加密文件都会更改,这使访问变得困难。
重要警告:性能
SharedPreferences和EncryptedSharedPreferences之间存在显着的性能差异。
您可以使用我的示例代码自己检查它,也可以从Play商店下载示例应用程序。 我本人在真实设备上进行了一些测试,得出以下结果:
EncryptedSharedPreferences与SharedPreferences
图形“ EncryptedSharedPreferences与SharedPreferences”结论
EncryptedSharedPreferences是适用于Android 6.0及更高版本的可靠且非常简单的解决方案。
它有两个优点:
- 我们不需要在我们的代码中进行任何编码。 他只是为我们使用Android Keystore,因此无需对其进行处理。
- 用户不需要设置锁定屏幕。 无需屏幕锁定,EncryptedSharedPreferences也可以正常工作
这几乎是SharedPreferences的完全替代。 只需确保初始化/打开EncryptedSharedPreferences不会对您的用户产生不利影响。
这个决定肯定会保留。 我会在任何合适的情况下使用它。 现在我只想说说来自Android的人将改善其性能,因此我们可以更少担心:)
应用实例
为了简化测试并确保所有内容都连接良好,我为您创建了一个应用程序。 下载或编译并尝试!
https://github.com/akaita/encryptedsharedpreferences-example如果您觉得这篇文章有用,请加一个加号,我将很乐意回答评论中的任何问题。