android官方的加密库-security

简介: android官方的加密库-security

概览


Security 库提供了与读取和写入静态数据以及密钥创建和验证相关的安全最佳做法的实现。

该库使用构建器模式为以下安全等级提供安全的默认设置:

  • 在可靠加密和良好性能之间取得平衡的强安全性这种安全等级适用于银行应用和聊天应用等消费者应用,以及执行证书吊销检查的企业应用。
  • 最高安全性这种安全等级适用于需要由硬件支持的密钥库和需要用户介入以提供密钥访问权限的应用。


秘钥管理


  • Security库可以使用多个秘钥集,可以对文件和sp进行加密。秘钥集被存储在sp中
  • 主秘钥被存储在系统秘钥库中


Security加密操作


依赖

使用Security库需要导入以下依赖

implementation("androidx.security:security-crypto:1.0.0")
    implementation("androidx.security:security-identity-credential:1.0.0-alpha02")
    implementation("androidx.security:security-app-authenticator:1.0.0-alpha02")
    androidTestImplementation("androidx.security:security-app-authenticator:1.0.0-alpha01")
复制代码


存在的问题

Security库支持的最低api版本是24,我们有以下两种方式解决:

  • manifest中声明<uses-sdk tools:overrideLibrary="androidx.security.identity.credential,androidx.security" />
  • 提升最低api版本为24,不过这样就需要对高于api24和低于api24两种情况分别做适配了


使用Security进行文件加密操作

写入加密数据

无法重复写入

当要写入的文件已经存在时,重复写入数据的时候openFileOutput方法会抛出异常,原因就是无法重复写入,见注释:

image.png


写入数据:

  1. 代码
  • 本例代码中EncryptedFile.Builder的构建耗时最长,在我的手机上能达到300-600ms的水平,所以非敏感的文件尽量不要用到加密
  • 另外存储进文件的数据膨胀也很大,这意味着占用了更大的存储空间
val encrypt = EncryptedFile.Builder(
                    getFile("安安安安卓写入文件加密数据.txt").apply {
                        if (exists()) {//如果已存在就先删除文件
                            delete()
                        }
                    },
                    this@MainActivity,
                    "随便写个key",
                    EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
                ).build()
                startRecord()
                encrypt.openFileOutput().apply {
                    write("随便写入点字符串".toByteArray(charset = Charsets.UTF_8))
                    flush()
                    close()
                }
复制代码


  1. 效果

image.png


读取加密数据

val encrypt = EncryptedFile.Builder(
                    getFile(
                        "安安安安卓写入文件加密数据.txt"
                    ),
                    this@MainActivity,
                    "随便写个key",
                    EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
                ).build()
                startRecord()
                val bytes = BufferedInputStream(encrypt.openFileInput()).readBytes()
                val result = String(bytes, charset = Charsets.UTF_8)
复制代码


使用Security进行SharePreference进行加密操作

Security库提供了EncryptedSharedPreferences对存入sp的key-value进行加密

不过众所周知的sp是个坑爹的东西,所以仍然只应该把EncryptedSharedPreferences运用到敏感的数据存储上


写入数据到Shar

share = EncryptedSharedPreferences.create(
            "encryptdata",
            "key",
            this@MainActivity,
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
        )
 share.edit().let {
                    it.putString("key", "SharePreference数据")
                    it.apply()
                }
复制代码


从SharePreference读取数据

share = EncryptedSharedPreferences.create(
            "encryptdata",
            "key",
            this@MainActivity,
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
        )
val value = share.getString("key", "")



相关文章
|
2月前
|
存储 缓存 Android开发
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【远程url】音频,搭配Okhttp库进行下载和缓存,播放完随机播放下一首
这是一个Kotlin项目,使用Jetpack Compose和ExoPlayer框架开发Android应用,功能是播放远程URL音频列表。应用会检查本地缓存,如果文件存在且大小与远程文件一致则使用缓存,否则下载文件并播放。播放完成后或遇到异常,会随机播放下一首音频,并在播放前随机设置播放速度(0.9到1.2倍速)。代码包括ViewModel,负责音频管理和播放逻辑,以及UI层,包含播放和停止按钮。
180 0
|
17天前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
很多文章都介绍了FTPClient如何连接ftp服务器,但却很少有人说如何连接一台开了SSL认证的ftp服务器,现在代码来了。
42 2
|
23天前
|
存储 数据库 Android开发
🔥Android Jetpack全解析!拥抱Google官方库,让你的开发之旅更加顺畅无阻!🚀
【7月更文挑战第28天】在Android开发中追求高效稳定的路径?Android Jetpack作为Google官方库集合,是你的理想选择。它包含多个独立又协同工作的库,覆盖UI到安全性等多个领域,旨在减少样板代码,提高开发效率与应用质量。Jetpack核心组件如LiveData、ViewModel、Room等简化了数据绑定、状态保存及数据库操作。引入Jetpack只需在`build.gradle`中添加依赖。例如,使用Room进行数据库操作变得异常简单,从定义实体到实现CRUD操作,一切尽在掌握之中。拥抱Jetpack,提升开发效率,构建高质量应用!
41 4
|
1月前
|
Java API 开发工具
一个专为Android平台设计的高度可定制的日历库
Calendar库是Android开发的工具,支持RecyclerView和Compose,提供高度定制的日历组件。功能包括:单选/多选/范围日期选择、周/月模式、禁用特定日期、设置边界、自定义视图、每周起始日、滚动方式、热力图、标题和脚注、滑动导航及兼容低版本API。示例应用和源码可在GitHub找到,通过Gradle集成,有详细文档指导。
47 16
|
2月前
|
JavaScript 前端开发 安全
安全开发-JS应用&原生开发&JQuery库&Ajax技术&加密编码库&断点调试&逆向分析&元素属性操作
安全开发-JS应用&原生开发&JQuery库&Ajax技术&加密编码库&断点调试&逆向分析&元素属性操作
|
3月前
|
安全 Linux Android开发
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
该文介绍了如何在Linux服务器上交叉编译Android的FFmpeg库以支持HTTPS视频播放。首先,从GitHub下载openssl源码,解压后通过编译脚本`build_openssl.sh`生成64位静态库。接着,更新环境变量加载openssl,并编辑FFmpeg配置脚本`config_ffmpeg_openssl.sh`启用openssl支持。然后,编译安装FFmpeg。最后,将编译好的库文件导入App工程的相应目录,修改视频链接为HTTPS,App即可播放HTTPS在线视频。
73 3
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
|
2月前
|
存储 API 开发工具
kotlin安卓开发,如何获取设备的唯一id, 有哪些开源库
在Kotlin的Android开发中,获取设备唯一ID的方法包括不稳定的ANDROID_ID、需要权限的IMEI、使用UUID与SharedPreference结合,以及考虑隐私的Firebase Installations ID和Advertising ID。由于隐私问题和Google Play政策,IMEI和ANDROID_ID不推荐作为长期唯一标识。推荐使用UUID(首次安装时生成并存储),或在涉及广告时使用Advertising ID(需用户同意),而Firebase Installations ID则提供了一种合规的设备标识选项。在选择方法时,必须遵守隐私指南和政策。
238 0
|
2月前
|
Java API Android开发
安卓开发app 调用usb 摄像头 需要用到哪个库
在安卓开发中,调用USB摄像头常常使用libuvc库,这是一个跨平台处理USB视频设备的库。有多个基于libuvc的开源项目简化了在安卓上的使用,如UVCCamera和Android EasyCap UVC。例如,UVCCamera提供了一个更简单的接口来访问USB摄像头,并且可以在Jetpack Compose中显示预览。开发者可以参考官方文档、开源项目以及相关教程和资源来学习和实现这一功能。
226 0
|
3月前
|
监控 安全 API
orhanobut/logger - 强大的Android日志打印库
orhanobut/logger - 强大的Android日志打印库
115 1
|
3月前
|
JSON Android开发 数据格式
Android框架-Google官方Gson解析,android开发实验报告总结
Android框架-Google官方Gson解析,android开发实验报告总结