DataStore存储数据+加上加密

Android DataStore 使用详解 Jetpack DataStore 是一种数据存储解决方案,允许您使用协议缓冲区存储键值对或类型化对象。DataStore 使用 Kotlin 协程和 Flow 以异步、一致的事务方式存储数据。 阅读详情

如果没有使用SP来存储数据,而是用datastore的话

但是datastore存储是个文件,所以我们需要再加密。

先展示没有加密的存储方式,然后再结合上一节的加密,再将存储的数据进行加密

使用datastore存储数据

添加依赖库

implementation "androidx.datastore:datastore-preferences:1.0.0"
implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2'

定义数据类型

定义data class,添加 @Serializable 标签

@Serializable
data class UserSettings(
    val username: String? = null,
    val password: String? = null
)

定义Serializer

这里先展示没有加密的的序列化

存储的时候,将实例值转换成json string,再转换成bytearray写出到输出流,就可以保存到datastore的文件上了

读取的时候,从输入流中读取转成json string, 再通过json解析成 UserSetting实例

//继承datastore的Serializer,类型是我们定义的UserSettings
@RequiresApi(Build.VERSION_CODES.M)
class UserSettingsSerializer() : Serializer<UserSettings> {

    override val defaultValue: UserSettings
        get() = UserSettings()

    override suspend fun readFrom(input: InputStream): UserSettings {
        //将输入端的内容先转换成string
        //再将string通过json的解析再转换成UserSettings
        return try {
            Json.decodeFromString(
                deserializer = UserSettings.serializer(),
                string = inputStreamToByteArray(input).decodeToString()//decryptedBytes.decodeToString()
            )
        } catch(e: SerializationException) {
            e.printStackTrace()
            defaultValue
        }
    }

    private fun inputStreamToByteArray(inputStream: InputStream): ByteArray {
        val dataInputStream = DataInputStream(inputStream)
        val byteArrayOutputStream = ByteArrayOutputStream()

        val buffer = ByteArray(1024)
        var length: Int
        while ((dataInputStream.read(buffer).also { length = it }) != -1) {
            byteArrayOutputStream.write(buffer, 0, length)
        }

        return byteArrayOutputStream.toByteArray()
    }

    override suspend fun writeTo(t: UserSettings, output: OutputStream) {
        //把值为t的UserSettings,通过序列化转换成json string,再写出到输出流
        val bytes =Json.encodeToString(serializer=UserSettings.serializer(), value = t)
            .encodeToByteArray()
        output.write(bytes)

    }
}

初始化datastroe

datastore的文件名,传入我们前面定义的普通的序列化器UserSettingsSerializer,

定义的是Context.dataStore,这在Context中都可以访问到datastore。例如activity中就可以直接使用datastore

 private val Context.dataStore by dataStore(
        fileName = "user-settings.json",
        serializer = UserSettingsSerializer()
    )

跟新数据到datastore

                                dataStore.updateData {
                                    UserSettings(
                                        username = username,
                                        password = password
                                    )
                                }

读取数据

settings = dataStore.data.first()

直接就可以读取到 UserSetting类型的数据

查看文件

从data-data-packagename下可以看到文件

直接可以看到JSON格式的内容,这样就不是很安全,所以,存储到datastore中的内容需要加密

这个就连接上一篇中的AES加密

https://blog.youkuaiyun.com/github_35581409/article/details/142894715

只要对UserSettingsSerializer进行改造,在写入的时候,把JSON string进行加密

在读取的时候,先对string解密,然后再JSON解析

加密改造

添加加密管理

class UserSettingsSerializer(
    private val cryptoManager: CryptoManager //添加加密管理
) : Serializer<UserSettings>

写入

写入的时候,将实例值通过json编码,然后转换成byte。然后再通过cryptoManager进行加密,再写入输出流,输出流会把加密后的数据存储到datastore的文件中

    override suspend fun writeTo(t: UserSettings, output: OutputStream) {
        cryptoManager.encrypt(
            bytes = Json.encodeToString(
                serializer = UserSettings.serializer(),
                value = t
            ).encodeToByteArray(),
            outputStream = output
        )
//        val bytes =Json.encodeToString(serializer=UserSettings.serializer(), value = t)
//            .encodeToByteArray()
//        output.write(bytes)

    }

读取

把输入流中的内容,先进行解码,解码后的byte,在通过json组装成实例

    override suspend fun readFrom(input: InputStream): UserSettings {
        val decryptedBytes = cryptoManager.decrypt(input) //将输入流进行加密,生成加密后的bytes
        return try {
            Json.decodeFromString(
                deserializer = UserSettings.serializer(),
//                string = inputStreamToByteArray(input).decodeToString()
                decryptedBytes.decodeToString()
            )
        } catch(e: SerializationException) {
            e.printStackTrace()
            defaultValue
        }
    }

在datastore初始化的时候,补上加密管理器

   private val Context.dataStore by dataStore(
        fileName = "user-settings.json",
        serializer =UserSettingsSerializer(CryptoManager())
    )

再运行看看,加解密显示没有问题,

文件内容也变成了加密的了

Android Jetpack组件 DataStore的使用和简单封装,安卓面试 下面我们再写一个取数据的方法。: “新冠” }.first()你会发现和存数据又有不同,这里的first()就是取值,这个方法换个方式来看就清晰一些。然后我们在取数据按钮的点击事件中调用。下面我们运行一下:第一次我先取数据,显示的是默认值,然后我存数据再取数据。效果就是这样,但你会觉得使用起来很麻烦,不如SP好用,这个我们后面再去封装,先了解一些它的功能特性。三、数据查看和清除在进行定义dataStore时,会在手机中生成一个pb文件,这里我们用虚拟机来看,然后通过你的程序包名去找。 阅读详情

相关推荐

Android DataStore:安全存储和轻松管理数据

关于作者:优快云内容合伙人、技术专家, 从零开始做日活千万级APP。专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。

2301_82000445的博客 1466

DataStore详解

项目中使用SharedPreference时还是要注意。不能用来替代SharedPreference。整个对象都将被序列化并持久化到磁盘。一致的事务方式存储数据。事务方式处理更新数据。

听海的博客 3991

Kotlin Multiplatform与DataStore的跨平台数据存储实践

跨平台数据存储是现代移动开发中的关键技术挑战,Kotlin Multiplatform(KMP)通过共享代码库实现多平台逻辑统一。DataStore作为SharedPreferences的现代化替代方案,采用协程异步操作和类型安全设计,解决了传统存储方案的线程安全和数据一致性问题。在KMP架构中,Preferences DataStore通过expect/actual机制实现平台特定逻辑,支持Android/iOS/Web三端数据同步。典型应用场景包括用户配置存储、应用状态持久化和轻量级缓存管理,其中批量写

weixin_34268579的博客 323

DataStore的基础用法

0. 简介 Google在推出JetPack组件以来,一直推荐我们使用DataStore组件替代到我们第一天学android就知道的SharedPreferences组件,原因很简单,因为当年的SharedPreferences存在居多的问题,DataStore就是为了解决这些问题而来的。 1. SP的缺点 至于 SP到底存在哪些问题,我们可以直接查看 DataStore源码上的注释: Synchronous API encourages StrictMode violations apply() an

成长的烧年 7863

Android安全存储:从SharedPreferences迁移到DataStore与Keystore

在移动应用开发中,数据存储安全是核心问题之一。传统SharedPreferences以明文存储数据,存在严重安全隐患。现代解决方案结合DataStore的异步存储机制和Android Keystore的硬件级加密,可构建更安全的数据存储体系。DataStore作为Jetpack组件,提供协程支持的事务性操作,而Keystore则确保密钥不出现在应用内存中。这种组合特别适合金融、医疗等敏感领域,能有效防御root环境下的数据窃取。通过AES-256加密和密钥轮换策略,开发者可以实现企业级的数据保护方案。

weixin_29194817的博客 301

Android安全存储:DataStore与Keystore加密实践

在移动应用开发中,数据安全存储是保障用户隐私的核心环节。传统SharedPreferences存在明文存储和线程阻塞等缺陷,而现代解决方案如Jetpack DataStore结合Android Keystore提供了更安全的替代方案。DataStore通过协程实现异步IO,支持Protocol Buffers强类型序列化,而Keystore则利用硬件安全模块(HSM)保护密钥安全。这种组合特别适合金融级应用场景,能有效防御root设备数据泄露和中间人攻击。实现时需注意密钥生命周期管理和安全审计,采用分层密钥

dgqvhtlwq472235338的博客 383

Android数据存储安全:从SharedPreferences到加密DataStore

在移动应用开发中,数据存储安全是保障用户隐私的关键环节。传统SharedPreferences由于明文存储和同步阻塞等问题,已无法满足现代安全需求。DataStore作为新一代解决方案,结合协议缓冲区和Kotlin协程,提供了类型安全和异步操作的优势。更进一步,通过与Android Keystore的硬件级加密结合,可实现TEE(可信执行环境)保护,确保密钥永不离开安全芯片。这种组合特别适合金融、政务等高安全要求的应用场景,能有效防御内存dump等攻击手段。实践中需注意版本兼容性和性能优化,例如使用Flow

weixin_33724659的博客 415

树莓派IgH EtherCAT主站部署与实时内核调优实战

本文详细介绍了在树莓派上部署开源IgH EtherCAT主站并进行实时内核调优的完整实战流程。通过编译实时内核(RT-Preempt)、交叉编译IgH主站、系统集成配置及性能优化,实现了低成本、高定制的工业控制解决方案,有效满足了EtherCAT通信对微秒级实时性的严苛要求。

weixin_29166013的博客 299

Android几种数据存储的对比(MMKV、DataStore、SharedPreference)

Jetpack DataStore 是一种改进的新数据存储解决方案,允许使用协议缓冲区存储键值对或类型化对象。DataStore 以异步、一致的事务方式存储数据,克服了 SharedPreferences(以下统称为SP)的一些缺点。DataStore基于Kotlin协程和Flow实现,并且可以对SP数据进行迁移,旨在取代SP。MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。

张雨的博客 3027

逆向工程视角:MFI芯片通信协议在Linux环境下的行为分析

本文从逆向工程角度深入分析了MFI芯片在Linux环境下的通信协议行为,重点探讨了树莓派与MFI芯片通过I2C接口交互的技术细节。文章详细介绍了信号捕获、协议栈逆向、动态调试技巧以及安全机制分析,为开发者提供了在Linux驱动层面实现MFI认证的实用方法。

time3的博客 178

stata 代码实现熵值法计算 含常见问题解答

2.标准化①正向指标②负向指标。

m0_74825360的博客 1218

【亲测免费】 使用 Encrypted DataStore 安全地存储数据

使用 Encrypted DataStore 安全地存储数据 在移动应用开发中,数据安全是至关重要的。现在有一个强大的开源解决方案——Encrypted DataStore,它可以让你在Android平台上轻松实现加密的数据持久化存储。这个库将Google的DataStore扩展到了一个更安全的层次,确保你的敏感数据在被存储时始终得到保护。 项目介绍 Encrypted DataStore 是一个...

gitblog_00070的博客 654

以太网传输硬件设计大全

1.网线的介绍RJ45由插头和插做组成,也就是我们常说的网口和网线。RJ45 网线插头又称水晶头,共有八芯做成。RJ45网络传输线分为直通线、交叉线和全反线。直通线用于异种网络设备之间的互连,例如,计算机与交换机。交叉线用于同种网络设备之间的互连,例如,计算机与计算机。全反线用于超级终端与网络设备的控制物理接口之间的连接。下面将介绍一下各线的作用和区别。1.直通线:又叫正线或标准线,两端采用568B做线标准,注意两端都是同样的线序且一一对应。直通线是应用最广泛,现在最常用的线。

weixin_45365488的博客 6751

Android数据存储安全升级:DataStore与Keystore实践

在移动应用开发中,数据持久化存储是基础但关键的技术环节。传统SharedPreferences采用XML明文存储,存在严重安全隐患且性能受限。现代Android开发推荐使用Jetpack DataStore替代,它基于Kotlin协程实现异步IO,支持事务操作,性能较SharedPreferences提升3倍以上。结合Android Keystore系统提供的硬件级密钥保护,可构建端到端加密方案:Keystore管理AES密钥,DataStore存储加密数据,即使设备root也无法破解。这种组合特别适合金融

weixin_29195615的博客 267

别再手动填序号了!用Python脚本在Arcgis属性表里实现分组自动编号(附完整代码)

本文详细介绍了如何利用Python脚本在Arcgis属性表中实现分组自动编号,告别低效的手工操作。通过核心代码解析和实战教程,帮助GIS工程师快速掌握自动化编号技术,提升工作效率并降低错误率。特别适合城市规划、国土调查等需要处理大量分组数据的场景。

weixin_42532473的博客 309

openclaw本地模型对接

使用是官方推荐的一种集成方式,它可以简化配置过程。但由于您的系统环境和之前复杂的配置历史,我为您梳理了一个核心流程,并增加了关键的“事后检查”步骤,以确保能从根本上解决问题。

suny8的专栏 2463

SharedPreferences弃用后:DataStore + Android Keystore 打造硬件级安全存储全攻略

Android加密存储最佳实践:Google建议弃用EncryptedSharedPreferences,改用DataStore+AndroidKeystore组合方案。通过定义密钥别名、加密算法(AES/GCM/NoPadding)和密钥规格(256位),在硬件安全模块中生成和存储密钥。实现包含加密/解密流程:加密时自动生成IV并写入输出流,解密时先读取IV再验证数据完整性。配合Kotlin序列化,构建安全可靠的用户数据存储方案,异常时返回默认值保证稳定性。该方案相比传统方法具有更高安全性和现代化架构优势

2302_79460122的博客 1148

LangChain面试内容整理-知识点27:LangChain性能调优

LLM应用可能面临响应慢、成本高等性能问题。LangChain提供了一些优化方法和经验来提升性能和效率。

不务正业的猿 328

Android经典实战之存储方案对比:SharedPreferences vs MMKV vs DataStore

适合简单、少量的数据存储,使用方便,但在性能和并发上有缺陷。MMKV性能卓越,支持多进程,API 类似 SharedPreferences,便于迁移和使用,非常适合需要高性能和多进程支持的应用场景。DataStore是 Google 提供的现代化库,具有良好的异步和响应式编程体验,以及类型安全的存储,比较适合新的项目开发。根据项目的需求选择合适的键值对存储方案,可以显著提升应用的性能和用户体验。欢迎关注我的公众号AntDream查看更多精彩文章!

AntDream的程序世界 1629

vue3(微信公众号H5网页):调用wx.config报错config:fail,invalid signature,在vue3 h5项目开发微信内置浏览器JS-SDK/JS-API提示签名失效/错误

微信公众号网页,vue3 H5网页,uniapp h5,wx.config 报错:config:fail,invalid signature?无效签名,微信JSSDK分享接口中wx.config 出现invalid signature问题的解决办法,微信公众号签名失效,wx.config中出现invalid signature的解决方法,H5页面调起微信的拍照与分享功能,导致的config:invalid signature这个错误的解决办法,微信网页调用分享功能出现config:fail,invalid

✅ 精选推荐文章 5054

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【Android Jetpack】使用DataStore替换SharedPreferences实现数据持久化

DataStore DataStore是Jetpack近期新推出的组件,可以以下处理两种类型的数据持久化: DataStore Type Description Preferences DataStore 像SharedPreferences一样,以键值对的形式进行基本类型的数据存储。DataStore 基于 Flow 实现异步存储,避免因为阻塞主线程带来的ANR问题 Proto DataStore 基于Protobuf实现任意自定义类型的数据存储,需要定义Protobuf的IDL,.

移动端开发干货分享 3841

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android 本地存储方案深度解析:SharedPreferences、DataStore、MMKV 全面对比

在 Android 开发中,键值对存储是最常见的持久化需求之一。无论是保存登录 Token、主题模式、还是缓存用户偏好,我们常见的方案有三种:👉👉DataStore(官方推荐替代)👉MMKV(腾讯出品高性能方案)那么,三者到底有什么区别?该如何选择?本篇将从原理、性能、使用方式、优缺点到最佳实践,带你一文搞懂。操作DataStoreMMKV单次写入~1–2 ms~3–5 ms<0.1 ms单次读取~1 ms~2 ms<0.1 ms并发安全⚠️ 较差✅ 安全✅ 安全。

qq_41821190的博客 1035

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

告别SharedPreferences!DataStore+Android Keystore构建安全存储新防线

DataStore 是 Android 官方力荐的轻量级数据持久化方案,它基于 Kotlin Coroutines 和 Flow 构建,具有诸多卓越特性。DataStore 具备线程安全的特性,这使得它在多线程环境下能够稳定运行,不会出现数据不一致或损坏的情况。它支持原子写入,确保数据的完整性,即使在写入过程中出现异常,也不会导致数据丢失或损坏。DataStore 还提供了数据变化监听功能,通过 Kotlin Flow,我们可以实时监听数据的变化,及时做出相应的处理,为应用的开发带来了极大的便利。

qq_32890771的博客 407

移动端登录态安全设计(4):DataStore、MMKV、SharedPreferences:Token 到底应该存哪里?

本文讨论了Android应用中Token存储的安全性问题,强调存储方式(DataStore/MMKV/SharedPreferences)并非关键,核心在于加密保护。主要内容包括: 核心观点:Token必须加密存储(推荐AES-GCM),AES密钥由Android Keystore保护,存储容器只是载体。 三种存储方案对比: SharedPreferences:老项目常见但方案陈旧,建议逐步迁移 MMKV:性能优异,已有项目可继续使用 DataStore:新项目首选,支持协程/Flow 实现建议: 分层架构

Mark Wu 的博客 543

SP弃用后:DataStore+Android Keystore硬件级加密实践

本地键值存储是Android应用中最常用的数据持久化方式,但数据安全和性能问题始终是工程实践中的关键挑战。随着官方弃用SharedPreferences,DataStore凭借协程与Flow模型成为新一代异步、事务性的存储方案。然而,纯DataStore仅解决读写性能与数据观察问题,仍需配合Android Keystore才能真正实现硬件级的安全加密。Android Keystore通过TEE/SE安全硬件将密钥与明文隔离,即使设备Root或数据被导出,也无法还原密文;结合AES/GCM认证加密,可有效抵御

weixin_29170327的博客 280

弃用 SharedPreferences:DataStore + Android Keystore 打造硬件级安全存储全攻略

fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;是否是否需存储的数据是否敏感?Token/密码/身份证使用 SecurePreferencesStorage+ Keystore 硬件加密是否需类型安全/复杂结构?生产环境必备:• 审计日志 • 异常监控 • 密钥轮换策略。

qq_32890771的博客 556
上一篇: Android上的AES加密
下一篇: datastore读取方式
lynn8570_blog
博客等级 码龄10年 254粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值