本文译自Encrypting Shared Preferences with the AndroidX Security Library,介绍了AndroidX安全库中EncryptedSharedPreferences的使用。备注:仅支持minSdkVersion 23及以上。

《离思五首·其四》

曾经沧海难为水,除却巫山不是云。

取次花丛懒回顾,半缘修道半缘君。

-唐代,元稹

Android框架给我们提供了SharedPreferences,它是一个用于存储小量键值数据很好的工具。当存储一些敏感数据,重要的是SharedPreferences存储的数据是明文的。我们应该加密敏感的数据不要让它被窥视。我们可以怎样做?

一种方法是我们使用Android密钥库自己写加密包装SharedPreferences。不幸的是这会相当复杂并且涉及大量配置。另一种方法是使用第三方库,这意味着我们需要花时间找到一个合适的。值得庆幸的是AndroidX安全库最近被添加,这让min-sdk为23+的应用存储加密SharedPreferences变得容易和方便。

详细使用

首先在module的build.gradle文件中添加依赖。

implementation "androidx.security:security-crypto:1.0.0-alpha02"

需要注意的是这个库当前是alpha阶段。这意味着虽然功能是稳定的,部分API在后续版本可能被修改或移除。

添加了依赖之后,下一步是在Android KeyStore创建一个加密master key和store。安全库提供了一个容易的方法处理这个。将下面的代码添加到你计划创建EncryptedSharedPreferences实例前面。

val keyGenParameterSpec = MasterKeys.AES256_GCM_SPEC

val masterKeyAlias = MasterKeys.getOrCreate(keyGenParameterSpec)

我们指定了一个默认的key,AES256_GCM_SPEC,用于创建master key。虽然推荐使用这个规范,如果你需要对如何生成密钥有更多的控制你也可以自定义KeyGenParameterSpec。

最后我们只需要一个EncryptedSharedPreferences实例,它对SharedPreferences进行了包装并且为我们处理所有的加密。不同于SharedPreferences,我们可以从Context#getSharedPreferences或Activity#getPreferences获取,我们需要创建自己的EncryptedSharedPreferences实例。

val sharedPreferences = EncryptedSharedPreferences.create(

"shared_preferences_filename",

masterKeyAlias,

context,

EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,

EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM

)

我们指定了shared preferences的文件名,之前创建的masterKeyAlias,和一个context。最后两个参数是key和value加密的scheme。它们是库提供的唯一的选项。

创建了EncryptedSharedPreferences实例后,可以使用它像SharedPreferences一样读取和存储值。总而言之,就像下面的代码一样:

val keyGenParameterSpec = MasterKeys.AES256_GCM_SPEC

val masterKeyAlias = MasterKeys.getOrCreate(keyGenParameterSpec)

val sharedPreferences = EncryptedSharedPreferences.create(

"shared_preferences_filename",

masterKeyAlias,

context,

EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,

EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM

)

// storing a value

sharedPreferences

.edit()

.putString("some_key", "some_data")

.apply()

// reading a value

sharedPreferences.getString("some_key", "some_default_value") // -> "some_data"

再次检查结果

我们怎样知道数据被加密了?让我们看下shared preferences文件中的内容。如果你想shared preferences文件中的内容,可以从StackOverflow找到答案。使用正常的SharedPreferences,文件内容如下:

some_data

正如我们看到的,key和value没有被加密。使用EncryptedSharedPreferences,文件内容就像这样:

AU+p3hwqCgvlDOtIaawFHWVDf4rFsqghM7ivFTEJesrRp19D+zk7tqsqlGZPLAbryHI=

12a901802f1a5d2fbc5cd3c9b545a89ca8ace8f125f8e601a8ac51929303ead8a2bbdf5428bd054360b97c1727ef93ef63b64f43ceac92156f3aee9402dd247009d9779571c6ceacfcd4e7123665cc9dd94c44c5c2c6241a8de070d365d94010f8affb6097d4b0fec1c628120a8f901c23caa03d32ecc6ce270e3cc3341e6455b87a80474b3818c3ad678faa4199a9a45078b218c89b8c5a8cbd1780a68b4f8196eb5153b6422df2bdfee6541a44089680d49f03123c0a30747970652e676f6f676c65617069732e636f6d2f676f6f676c652e63727970746f2e74696e6b2e4165735369764b65791001189680d49f032001

128801da6fdef289b2c6e2933c341b1b3df3b39330671d76df362ba8b0a1d807cdc9d2d4d7bc3062139377e4fa61428f3817c0e368c3196c95fdbcca3c37075e7132abae1fe0f128ceef7278a06a01e0cacf29edc1f3c1c1d37875c27c0cf5d86d0b2bb39efcac84828f664838b77aa4c406028af912e860cad8bff51aca6aaf45167d5ab5c8e57bf05db61a44089cbca7fd04123c0a30747970652e676f6f676c65617069732e636f6d2f676f6f676c652e63727970746f2e74696e6b2e41657347636d4b65791001189cbca7fd042001

可以看到key和value被加密了并且存储了两个keysets,一个是shared preference的keys另一个是values。Keysets包含加密和解密shared preference数据的key。之前创建的master key用于加密这些keysets,这样它们就可以和提供的数据一起存储在shared preference文件中。

结语

Android的SharedPreferences对于存储key-value数据是一个很有用的工具,对于敏感数据,这是一个很好的加密它的方法。最近的AndroidX安全库是一个受欢迎的新功能,它为我们提供了一个简单易用的加密方案。

android sharedpreferences加密,(译)使用AndroidX安全库加密SharedPreferences相关推荐

  1. Android Studio项目中使用 AndroidX支持库的相关配置说明

    1. 在项目的 gradle.properties 文件中配置如下: # 启用Androidx生成支持的标志 android.useAndroidX=true # 启用Maven库转换的标志 andr ...

  2. 实现Android APK加固:代码加密隐藏、资源加密隐藏、so库加密隐藏。兼容unity引擎。附加固工具链接。

    1.为什么做加固 因为不想辛辛苦苦做的东西,被别人拿去改成各种版,半路摘我的桃子. 所以需要将原包的一些核心东西进行加密影藏. 市面上比较好的解决方案就是进行加固,能提升apk安全性. 2.怎么加固 ...

  3. android.support已死,androidx当立——弃用support库指南

    前言 androidx 是对 android.support.xxx 包的整理后产物.由于之前的support包过于混乱,所以,google推出了 androidX. 自support v7:28.+ ...

  4. Android开发入门——SharedPreferences的使用,kotlin常用库

    通过SharedPreferences.Editor接口的commit方法保存key-value对,commit方法相当于数据库事务中的提交操作. 四    存储数据与获取数据的示例代码 存储数据 使 ...

  5. 使用python hashlib模块给明文字符串加密,以及如何撞库破解密码

    文章目录: 1 hashlib介绍 2 hashlib模块使用 2.1 查看hashlib中有哪些hash算法 2.2 对字符串进行加密 2.3 对于数据比较大,加密可以分块,结果一样 2.4 has ...

  6. 【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )

    文章目录 I . 动态库 与 静态库 II . 编译动态库 III. Android Studio 使用第三方动态库 IV . Android Studio 关键代码 V . 博客资源 I . 动态库 ...

  7. Android 在 NDK 层使用 OpenSSL 进行 RSA 加密

    前言 需求:需要在NDK层对一个Java层的字符串进行RSA加密,然后对加密的结果进行Base64返回到Java层 方案:选择使用OpenSSL来实现. 编译libssl.a和libcrypto.a静 ...

  8. Android集成腾讯X5浏览器内核库

    Android集成腾讯X5浏览器内核库 一.相关配置 1. 相关地址 2.引入SDK 3. AndroidManifest配置 二.Application中初始化内核 三.代码实现 1. 自定义带Pr ...

  9. Android APK 加固-支持DEX虚拟化及资源加密

    Android apk加密方案 使用Virbox Protector 加密工具对Android APK进行加密,支持多种保护方式. 功能介绍 反调试功能,可抵挡动态调试,可以避免通过IDA等逆向工具分 ...

最新文章

  1. C++ 对象的声明与引用
  2. java脚本_写一个在线Java脚本执行器
  3. c#如何通过ftp上传文件_ftp自动上传文件,如何设置ftp自动上传文件及环境配置...
  4. iOS手势操作简介(一)
  5. pandas打印全部列_python——pandas练习题1-5
  6. 8000种子用户创造指数级裂变,谁说当年校内网发家是靠鸡腿?
  7. 线性代数 —— 线性递推关系
  8. 解决ASP.NET MVC 下使用SQLite 报no such table的问题
  9. 【CCCC】L3-009 长城 (30分),计算几何+凸包,极角排序
  10. python经典编程100例(1)
  11. 软件设计师中级考试,软考
  12. java application.doevents_Application.DoEvents()笔记
  13. python列表字符全部改为大写_将包含字符串的Python列表转换为小写或大写
  14. word删除括号里内容
  15. Windows 7驱动自动安装设置及手动更新方法
  16. Android集成LeanCloud用户反馈SDK要注意点
  17. 介绍计算机硬件的英语作文,电脑各部分英文介绍
  18. 当语音遇到人工智能,走进《智能语音时代》
  19. 沭阳的计算机学校好吗,沭阳初中排名一览表—沭阳县哪个初中最好
  20. asp毕业设计——基于asp+access的中学网站设计与实现(毕业论文+程序源码)——中学网站

热门文章

  1. 6个P2P流媒体开源项目介绍
  2. 计算机网络概念初探-计算机网络实验教程-实验一
  3. Java+Selenium实现QQ邮箱自动登录、发邮件与退出
  4. 计算机辅助设计高级绘图员技能鉴定试题(电路类),计算机辅助设计高级绘图员技能鉴定试题(电路类)07-1...
  5. 关于wrf格式的课件的视频转换问题
  6. 9 个最佳的 Sublime Text 3主题
  7. php正则匹配sg-nc-wap_Pandas基础操作(上)
  8. 莆田第十一中学2021年高考成绩查询,2021莆田市地区高考成绩排名查询,莆田市高考各高中成绩喜报榜单...
  9. 迅雷7.9.8.4550 Ayu精简绿化版
  10. 和Stand-up再次相遇