【数据安全】3. Android 文件级加密(File-based Encryption)技术介绍

Android安全存储:加密文件与SharedPreferences最佳实践 在Android应用中实现安全存储需要综合考虑加密算法选择、密钥管理和数据生命周期。对于简单键值对,EncryptedSharedPreferences是最便捷的选择;对于文件或自定义数据结构,需要实现适当的加密方案。无论哪种方法,都应遵循最小权限原则,只保留必要的数据,并确保及时清除不再需要的敏感信息。通过合理应用这些技术,可以显著提升Android应用的数据安全性,保护用户隐私不受侵犯。 阅读详情
AI摘要

本文围绕Android文件级加密(FBE)技术展开,介绍其设计概览,包括对用户数据分区目录的安全等级划分、多用户支持等。阐述了FBE需解决的核心技术问题,如安全的密钥管理和高效的I/O。还介绍了FBE架构的两代发展,以及HLOS软件流程,包括Native和Framework软件流程。

1. 概览 

1.1 设计概览

采用文件级加密时:

  • 可以使用不同的密钥对不同的文件进行加密,也可以对加密文件单独解密
  • 可以有的放矢,没有安全要求的文件可以不加密
  • 支持多用户,不同用户使用不同的密钥

基于这些特性,Google 对 Android 用户数据分区的目录做了安全等级划分,一些非用户隐私数据可以在设备启动后直接可以访问,解决了 FDE(Full Disk Encryption)的弊端,在 【数据安全】1. Android 保护用户隐私数据的技术介绍_zs.w的博客-优快云博客 或者 direct-boot 已经做了介绍。

在 FBE 的设计中,根据文件内容的私密性,Google 把用户数据分区的存储位置划分安全等级,包括下几类:

①. 不加密的存储位置

  •  Unencrypted

②. 加密的存储位置 

  • 与用户无关的系统设备存储位置
    •  System Device Encrypted (DE) Storage :一般存储一些设备相关,Framework 相关等用户无关的数据。
  • 与用户相关的存储位置 :
    • Device Encrypted (DE) Storage :与用户相关的数据,安全性要求一般,在设备启动后以及用户解锁设备后都可以直接访问。
    • Credential Encrypted (CE) Storage :与用户相关的数据,安全性等级高,如果用户设置了锁屏密码,必须在用户解锁设备后这些存储位置的数据才可用。
Android 不同安全等级的存储位置
Unencrypted StorageSystem DE StorageUser.0 DE StorageUser.0 CE Storage
/data/lost+found
/data/unencrypted
/data/media
/data/system_ce
/data/system_de
/data/misc_ce
/data/misc_de
/data/user
/data/user_de
/data/vendor_ce
/data/vendor_de
/data/misc
/data/local
/data/vendor
/data/property
/data/tombstones
/data/dalvik-cache
/data/resource-cache
/data/backup
/data/system
/data/cache
/data/adb
/data/anr
/data/app
/data/app-asec
/data/app-ephemeral
/data/app-lib
/data/app-private
/data/bootchart
/data/dpm
/data/drm
/data/mediadrm
/data/nfc
/data/ota
/data/ota_package
/data/ss
/data/system_de/0
/data/misc_de/0
/data/vendor_de/0
/data/user_de/0
/data/system_ce/0
/data/misc_ce/0
/data/vendor_ce/0
/data/media/0
/data/data

需要注意的点:

①. 从 User.x DE/CE 以及对应文件夹的命名可知,FBE 天然支持多用户 :

  •  每个用户都拥有2个单独的加密密钥: DE Master Key 和 CE Master Key。

②. 当用户未设置锁屏密码时:

  • DE 密钥和 CE 密钥安全等级一致,即开机过程中,APP 就可以直接访问 Device Encrypted (DE) Storage 和 Credential Encrypted (CE) Storage。

③. 当用户设置锁屏密码时:

  • 只有校验用户密码成功后,用户的 CE 密钥才可用。即用户输入锁屏密码解锁设备后,APP 才可访问 Credential Encrypted (CE) Storage,同时访问到文件的明文数据。
  • 用户 0 由于是特殊用户,必须先登录设备(设备启动后会自动登录用户0);
  • 不同存储位置的加解密顺序存在依赖关系:
    • 解密 System DE Storage 所需的密钥信息被存储在未加密目录 /data/unencrypted;
    • 解密 User Device Encrypted (DE) Storage 和 User Credential Encrypted (CE) Storage 所需的密钥信息被存储在 System DE Storage 路径 /data/misc/vold/user_keys;

这里再次重复磁盘数据加密解决的问题,对于后面理解 FBE 的设计很重要。

解决设备被盗,丢失或者送修等机器不在用户手中的情况下,依然保护用户的隐私数据不被窃取。但是对于用户正常使用过程中,黑客通过提权等手段窃取数据的行为,这些技术基本无能为力,目前主要还是靠传统的 DAC(user、group、others) 和 MAC(selinux)。

FBE 至少要解决以下特殊场景,用户数据的安全性,做到无法解密:

  1. 直接把存储器从主板拆下后,换到另一台设备或者使用专业的工具直接读存储器;
  2. 设备主板的 CPU 或者存储器被更换;
  3. 软件回滚,软件或固件回滚到存在 bug 的版本;

按照上述的要求,FBE 必须要解决的核心技术问题至少包括:安全的密钥管理和高效的 I/O。


1.2 密钥管理

①.对不同安全等级的加密存储位置,至少涉及 3 个密钥,包括:

  • System DE key
  • User DE key for user 0
  • User CE key for user 0

②. 密钥的安全管理,包括:

  • 在安全的内核密钥环(kernel keyring)和 ARM TZ 环境中管理密钥
  • 密钥不允许出现在 HLOS
  • 每个文件及其名称都应使用不同且唯一的密钥进行加密
  • 根据 HLOS 请求,创建,更新和失效密钥等(支持远程擦除密钥)
  • ......

1.3 高效 I/O

在文件读写时,文件数据加解密对 APP 应该是透明的,高效的,那么需要需要回答这些问题:

①. 在 I/O statck 中,怎么根据文件的存储位置以使用不同的密钥加解密数据?

②. 根据 FDE 设计的经验,FBE 必须借助 ICE 才可能有效的减少对 I/O 性能的影响,这里衍生出一些子问题:

  • 在 I/O 过程中,对于不同的文件,怎么使用唯一的密钥加密文件名和内容?这些密钥存储在哪里?
  • 在 HLOS 端的 ICE 驱动怎么为不同的文件对应的I/O请求设置不同的密钥?
  • ......

密钥管理和高效的 I/O 是 FBE 核心,后面会专门详细介绍。


2. FBE 架构

截止 Android 11,FBE 已经经历了两代的发展,下文介绍 V1 和 V2 架构。升级 V2 的目的主要包括:

  • 上游不支持硬件加密 :
    • 在启动期间,存在繁琐工作;
    • 每个新内核的移植工作可以减少 3-4 周;
  • 更合理的 Linux 分层,包括:文件系统、通用块层以及设备驱动;
  • Fscrypt v1 → Fscrypt v2
  • 支持 wrapped keys
  • 适配 GKI

2.1 FBE V1 Architecture

​​
FBE V1 Architecture

2.2 FBE V2 Architecture

​​
FBE V2 Architecture

这里简单介绍以下 V2 版本中的几个组件:

①. KeySlot Manager

  VFS 层和存储层之间的密钥槽管理器 KSM 桥的作用如下:

  • KSM ops (由 UFS 驱动实现)
    • Keyslot program
    • Keyslot evict
    • Get raw secret
  • 向底层暴露 APIs
    • Keyslot manager create
    • Keyslot manager destroy
  • 向上层暴露 API APIs
    • Get slot for key
    • Evict key
    • Derive raw secret

keyslot 定义:

https://android.googlesource.com/kernel/common/+/refs/heads/android12-5.10/include/linux/keyslot-manager.hhttps://android.googlesource.com/kernel/common/+/refs/heads/android12-5.10/include/linux/keyslot-manager.hhttps://android.googlesource.com/kernel/common/+/refs/heads/android12-5.10/include/linux/keyslot-manager.h比如高通平台的实现:

// drivers/scsi/ufs/ufshcd-crypto-qti.c
static const struct blk_ksm_ll_ops ufshcd_ksm_ops = {
    .keyslot_program    = ufshcd_crypto_qti_keyslot_program,
    .keyslot_evict      = ufshcd_crypto_qti_keyslot_evict,
    .derive_raw_secret  = ufshcd_crypto_qti_derive_raw_secret,
};

②. UFS Crypto

供应商可以实现 UFS crypto 特定的 variant ops,不同的芯片厂商按照硬件的设计可以提供差异化的解决方案。

UFS crypto 支持的 variant ops 包括:

  • Setup keyslot manager
  • Destroy keyslot manager
  • Init crypto
  • Enable crypto
  • Disable crypto
  • Suspend
  • Resume

比如高通平台的实现:

// linux-next/drivers/scsi/ufs/ufshcd-crypto.c 
/*
 * struct ufs_hba_qcom_vops - UFS QCOM specific variant operations
 *
 * The variant operations configure the necessary controller and PHY
 * handshake during initialization.
 */
static const struct ufs_hba_variant_ops ufs_hba_qcom_vops = {
	.name                   = "qcom",
	.init                   = ufs_qcom_init,
	.exit                   = ufs_qcom_exit,
	.get_ufs_hci_version	= ufs_qcom_get_ufs_hci_version,
	.clk_scale_notify	    = ufs_qcom_clk_scale_notify,
	.setup_clocks           = ufs_qcom_setup_clocks,
	.hce_enable_notify      = ufs_qcom_hce_enable_notify,
	.link_startup_notify    = ufs_qcom_link_startup_notify,
	.pwr_change_notify	    = ufs_qcom_pwr_change_notify,
	.apply_dev_quirks	    = ufs_qcom_apply_dev_quirks,
	.suspend		        = ufs_qcom_suspend,
	.resume			        = ufs_qcom_resume,
	.dbg_register_dump	    = ufs_qcom_dump_dbg_regs,
	.device_reset		    = ufs_qcom_device_reset,
	.config_scaling_param   = ufs_qcom_config_scaling_param,
	.program_key		    = ufs_qcom_ice_program_key,
};

3. HLOS 软件流程

3.1 Native 软件流程

Android 在 init rc 中 触发 FBE 软件流程:

  • 在启动过程中,准备 FBE Master key,设置和校验各加密存储位置的加密策略(Encryption Policy)。
  • 真正数据加密和解密是发生在文件 I/O 时,而加密和解密所需的信息来源于文件的 Encryption Policy。Encryption Policy 包括:
    • 使用哪个 Master Key 加密;
    • 文件数据的加密算法;
    • 文件名的加密算法;

关于 Encryption Policy 后续在密钥管理章节详细介绍。

  

Native 软件流程

① installkey /data

软件流程进入 Vold 函数 fscrypt_initialize_systemwide_keys()。

设备第一次启动时:

  • 创建 System DE Master Key 和生成 System DE Encryption Policy;
  • 把 System DE Encryption Policy 保存到文件  /data/unencrypted/ref;

后续每次启动时:

  • 加载 System DE Master Key;

② mkdir <system de storage>

  • 如果 System DE Storage 不存在,创建并为文件夹设置 System DE Encryption Policy;
  • 如果 System DE Storage 已经存在,则校验 System DE  Encryption Policy;
    • 校验失败会强制设备启动到 recovery ,格式化 userdata 分区;

③ init_user0

软件流程进入 Vold 函数 fscrypt_init_user0()。

设备第一次启动时:

  • 创建 User 0 DE Master Key 和生成 User 0 DE Encryption Policy;
  • 创建 User 0 CE  Master Key 和生成 User 0 CE Encryption Policy;
  • 创建 User 0 DE Storage,并为这些文件夹设置 User 0 DE Encryption Policy

后续每次启动时:

  • 加载 User 0 DE Master Key;
  • 准备 User 0 DE Storage,并校验文件夹 Encryption Policy;
    • 校验失败,不会强制格式化 userdata ,但是用户数据将无法使用,可能无法开机。

3.2 Framework 软件流程

可以发现在 Native 软件流程中, init_user0 中关于 User 0 CE 的流程相比 User 0 DE 存在缺失,主要包括:

(1) 第一次启动时, User 0 CE Storage 是什么时候创建的呢?

设备继续启动,由框架 UserController 通过 binder 触发 Vold 创建 User 0 CE Storage 和为相关文件夹设置 User 0 CE Encryption Policy

(2) 后续每次启动时,加载 User 0 DE Master Key、准备 User 0 DE Storage 、校验 User 0 CE Encryption Policy 是什么时候发生?

① 用户未设置锁屏密码时,设备启动 completed 后,ActivityManagerService 层层触发 Vold 完成这些任务;

未设置锁屏密码软件流程

 ② 用户设置锁屏密码时,用户输入密码并校验通过后,LockSettingsService 层层触发 Vold 完成这些任务;

设置锁屏密码软件流程

从图中可以看到,无论是设置用户密码,软件流程又回到了 Vold:

  • fscrypt_unlock_user_key : 加载 User 0 CE Master Key
  • fscrypt_prepare_user_storage:准备 User 0 CE Storage,并校验文件夹 Encryption Policy;

软件流程就介绍到这里,FBE 的密钥管理贯穿在上面介绍的这些流程中,在后文 《【数据安全】4. Android 文件级加密(File-based Encryption)之密钥管理》详细介绍 FBE 的核心之一密钥管理
。

Android文件加密解密介绍 在Android开发中,对文件进行加密解密是保护敏感数据的重要手段。本文将系统介绍Android平台上的文件加密技术、系统提供的安全特性,并通过实际代码演示如何使用AES算法对文件进行加密与解密。  一、为什么要对文件加密? - 防止未授权访问:即使root或物理访问设备,加密文件也难以读取。 - 满足合规要求:如GDPR、HIPAA等要求保护用户隐私。 - 配合Android安全机制:如Keystore、指纹/生物识别解锁。 阅读详情

相关推荐

Android数据加密演进:从全盘加密到文件级加密与直接启动机制详解

数据加密是信息安全领域的核心基础技术,通过在存储或传输过程中对数据进行编码转换,确保只有授权方能够访问原始信息。其基本原理是利用加密算法和密钥,将明文转换为不可读的密文。在移动设备领域,数据加密技术对于保护用户隐私、防止数据泄露具有至关重要的价值。Android系统作为全球主流的移动操作系统,其数据加密机制经历了显著的演进。早期的全盘加密(FDE)将整个用户数据分区作为一个整体进行加密,虽然安全,但在用户体验上存在“启动即砖”的痛点。为了适应多用户、工作资料等复杂场景并提升设备可用性,Android从7.0

weixin_33700350的博客 369

linux的全盘加密与文件系统加密在android中的应用

FBE 与FDE学习总结 1、本文档简述 1.1、定义: Full-disk encryption (FDE)全盘加密android4.0引入 File-based encryption (FBE)文件级加密android7.0引入 1.2、学习目标: 1、熟悉android加密流程,挂载。 2、格式化加密userdata的部分数据。 3、是否能够dump userdata分区并解密挂载分析。如果不能,为什么?假如user版本设备刚进入system就死机/重启,无法dump关键数据和信...

鹅鹅鹅的博客 5901

Android 15存储子系统深度解析(三):FBE加密文件系统与存储性能优化实战

深入剖析Android 15的FBE加密机制、f2fs文件系统特性,以及系统级存储性能诊断与优化实战,掌握从内核到应用层的完整存储性能调优技巧

Cheson的专栏 1906

Android加密之文件级加密

Android加密之文件级加密.Android 的安全性问题一直备受关注,Google 在 Android 系统的安全方面也是一直没有停止过更新,努力做到更加安全的手机移动操作系统。文件级加密和全盘加密相比,有一些非常实用的优点,本文将论述文件级加密的过程,和加密后的结果。

FamilyYuan的博客 4万+

仿抖音应用数据安全实战:从加密存储到隐私合规的完整指南

数据加密与隐私保护是现代移动应用开发的基石技术,其核心原理在于通过密码学算法对敏感信息进行转换,确保数据在存储、传输与处理过程中的机密性与完整性。这项技术的工程价值在于构建用户信任、满足法规合规要求,并有效抵御数据泄露与恶意攻击,是金融、社交、电商等高敏感场景的必备能力。本文聚焦短视频类应用开发,深入解析如何为仿抖音项目系统性地实施客户端数据安全防护,涵盖Jetpack Security、Keychain等热门的本地加密方案,以及证书绑定、加盐哈希等关键实践,提供从架构设计到代码落地的完整解决方案。

weixin_30847865的博客 316

Android数据加密实战:AESCrypt-Android库的设计原理与最佳实践

在移动应用开发中,数据安全是保障用户隐私和业务合规的核心环节。对称加密算法AES作为行业标准,通过分组加密和密钥派生机制,为本地数据提供机密性保护。其技术价值在于平衡安全性与性能,使开发者无需深入密码学细节即可实现可靠加密。AESCrypt-Android库基于AES-256/CBC/PKCS5Padding组合,封装了密钥派生、IV生成等复杂流程,通过PBKDF2算法强化密钥安全性,并支持流式文件处理。该方案适用于Android本地敏感数据存储场景,如用户凭证加密、配置文件保护等,通过简洁API降低开发门

cigang4063的博客 628

【数据安全】4. Android 文件级加密(File-based Encryption)之密钥管理

1. FBE 密钥管理简介1. FBE 密钥管理简介在前文中介绍了在HLOS中 FBE 的软件流程,而密钥管理则贯穿于整个流程中。System DE Master key、User DE Master key 和 User CE Master key 以及使用这些 key 加解密文件的流程基本一致,它们的主要区别是针对不同安全等级的存储位置而已。但是当用户设置锁屏密码后,User CE Master key 的认证方式会改变,受用户密码的保护。

技术总结和分享 1万+

Android SQLCipher数据库加密:原理、集成与安全实践

在移动应用开发中,数据安全是保障用户隐私的基石。数据库作为存储核心数据的组件,其明文存储方式存在显著风险。SQLCipher通过页级加密技术,在保持与SQLite高度兼容的同时,对数据库文件进行透明加密,实现了性能与安全的平衡。其核心价值在于为本地敏感数据提供了一道坚固防线,广泛应用于金融、医疗、社交等涉及用户隐私的场景。本文聚焦Android平台,深入解析SQLCipher的集成方法、密钥管理策略以及与Room等流行框架的协同,并探讨了性能优化与安全加固的最佳实践,为开发者构建安全的数据存储层提供全面指导

weixin_34245082的博客 401

安卓文件加密 (File-Based Encryption, FBE) 概述

安卓文件加密 (File-Based Encryption, FBE) 概述

achirandliu的专栏 2140

AESCrypt-Android:移动端文件加密实践与跨平台安全传输指南

在数据安全领域,AES-256加密算法作为对称加密的黄金标准,以其强大的数学原理和极高的抗暴力破解能力,为敏感信息提供了可靠保护。其技术价值在于实现了端到端的离线加密,用户完全掌控密钥,无需依赖第三方服务。这一特性使其在移动办公、隐私保护等场景中尤为重要,尤其适合处理合同、设计稿等敏感文件。AESCrypt-Android正是基于此原理,通过本地化操作和跨平台兼容的.aes格式,为用户提供了一套可控、可验证的文件加密解决方案,有效应对手机维修、丢失或App权限过度带来的数据泄露风险。

weixin_34258838的博客 437

Android SQLCipher数据库加密:从原理到实战的完整指南

在移动应用开发中,数据安全是保障用户隐私和业务合规的基石。SQLite作为Android平台默认的轻量级数据库,其未加密存储的特性使得敏感数据面临泄露风险。通过引入加密层,可以对数据库文件进行整体加密,确保即使设备被非法访问,数据内容也无法被直接读取。SQLCipher作为SQLite的权威加密扩展,采用256位AES算法,为整个数据库文件(包括数据页、索引和日志)提供透明加密,有效解决了原生SQLite的明文存储安全隐患。这一技术对于金融、医疗、企业办公等涉及敏感数据的应用场景具有重要价值,能够帮助开发者

weixin_33946020的博客 358

安卓文件加密 (File-Based Encryption, FBE) 加密算法--AES-256-XTS

安卓文件加密 (File-Based Encryption, FBE) 加密算法--AES-256-XTS

achirandliu的专栏 2742

SQLCipher免费集成指南:跨平台数据库加密实战与安全解析

数据库安全是应用开发中的基础需求,尤其在移动端和桌面端,本地数据存储面临明文泄露风险。其核心原理在于对存储层进行透明加密,确保数据在静息状态下无法被直接读取。这项技术的核心价值在于以较低成本为应用数据提供“防弹衣”级别的保护,无需重构整个数据层即可实现全库级别的安全加固。在金融、医疗、企业通讯等对数据隐私要求严格的领域,数据库加密已成为标配能力。本文聚焦于SQLCipher这一成熟方案,针对其商业授权限制,详细梳理了Android、iOS、Python、Node.js等主流平台的免费集成路径,并通过实战代码

weixin_33690367的博客 333

FDE全盘加密为什么不够用?分层数据加密与密钥管理实践指南

数据安全建设中,静态数据加密是基石,但仅靠全盘加密(FDE)远不足以应对运行态攻击、共享基础设施和细粒度管控等复杂场景。作为一项基础技术,FDE在块设备层提供透明加密,解决物理失窃与合规要求,却无法区分数据敏感等级,也难以覆盖内存明文和云端快照。为此,工程实践需要引入文件级加密、应用层字段加密,并配合AES-GCM、信封加密及KMS密钥管理,构建分层防护体系。本文从FDE原理出发,比较FBE与字段级加密的边界,给出LUKS最小落地流程和应用层加密代码示例,帮助架构师与安全工程师理解加密选型与排错思路,将密钥

weixin_33795806的博客 339

Android FDE故障排查:从metadata分区到密钥槽的完整指南

在移动设备安全体系中,数据加密是保护用户隐私的关键技术,全盘加密(Full Disk Encryption, FDE)作为传统方案,仍在大量Android定制设备中运行。FDE通过加密整个用户数据分区来抵御数据泄露,但其运行依赖固定的metadata分区和有限的密钥槽,在长期使用中可能因密钥元数据堆积、OTA升级中断或密码策略频繁变更而出现“空间不足”或“无法解密”等故障。理解FDE与FBE的区别、dm-crypt与vold的协作机制,有助于工程师从分区容量、密钥生命周期和日志诊断入手快速定位问题。本文面向

weixin_30553777的博客 371

SQLCipher数据库透明加密:原理、集成实践与安全策略

数据库安全是移动应用和桌面软件开发的基础要求,尤其在处理用户敏感信息时,数据加密从可选项变为必选项。SQLCipher作为SQLite的透明加密扩展,通过在数据库引擎层面实现页级加密,为开发者提供了无缝的安全加固方案。其核心原理包括基于PBKDF2的密钥派生、AES-256加密算法和HMAC完整性校验,确保数据在存储时的机密性和防篡改性。在技术价值上,SQLCipher保持了与原生SQLite API的高度兼容,开发者无需重写业务逻辑即可获得企业级加密保护。应用场景广泛覆盖金融、社交、医疗等对数据隐私要求严

weixin_33802505的博客 421

Android14 init.rc的late-fs与post-fs-data阶段关键操作解析:从调试到数据安全

本文深入解析了Android14系统启动中late-fs与post-fs-data两个关键阶段的核心操作。late-fs阶段负责调试通道建立、核心硬件服务启动及系统完整性验证;post-fs-data阶段则专注于/data分区基础设施搭建、密钥库初始化及APEX模块激活,共同保障了系统启动的安全性与稳定性。

weixin_28309571的博客 431

《物联网技术》课程笔记——第二章 物联网技术架构

文章目录第二章:物联网技术架构1 物联网技术体系(C3SD)2 系统体系结构的基本概念3 物联网体系结构——信息传递视角3.1物联网感知层3.1.1 感知层要解决的问题3.1.2 感知层的形态3.1.3 节点的感知能力与控制能力3.1.4 感知层实例3.2 物联网网络层3.2.1 网络相关概念3.2.2 IPV6与IPV4相比互联网协议的升级3.2.3 计算机网络的逻辑层次3.2.4 传输网的拓扑结构3.2.4.1 举例:智能小区的三表采集系统3.2.4.2 接入层3.2.4.2 汇聚层3.2.4.2 核心

南京大学软件工程硕士在读 2503
上一篇: 【数据安全】2. Android 全盘加密(Full Disk Encryption)技术介绍
下一篇: 【数据安全】4. Android 文件级加密(File-based Encryption)之密钥管理
zs.w
博客等级 码龄4年 133粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zs.w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值