LWN:让内核支持符合FIPS规范的随机数!

OS服务——加密——随机数生成 随机API子系统在加密和非加密安全实例中提供随机数生成API。使用哪种随机API是基于随机数的加密要求的。如果需要非加密值,非加密api将更快地返回随机值。 阅读详情

关注了就能看到更多这么棒的文章哦~

FIPS-compliant random numbers for the kernel

By Jake Edge
December 7, 2021
DeepL assisted translation
https://lwn.net/Articles/877607/

Linux 随机数生成器(RNG, random-number generator)引出了大量的关注(和工作),尽管它是(或者说应该是)内核中一个相当小的组件。原因的一部分是因为随机数以及其质量对一些安全保护措施是极为重要的,从生成不可预测的 IP 包序列号到加密密钥都需要它。Stephan Müller 最近发布的第 43 版 Linux 随机数生成器(LRNG)patch 跟之前的版本一样,肯定无法合入。但围绕这组 patch 的讨论可能会引出对一些发行版很必要的一个功能的支持。

LRNG 这组 patch set 的封面标题是 "/dev/random - a new approach",这是事实,但也肯定会引出很多感到疑惑的回应,也可能会导致 patch 完全被忽略。正如在讨论中所重申的那样,内核开发通常不会采用 "全盘替换(wholesale replacement) "的方式。相反,功能通常是慢慢地、一点一点地增加上来的。但是 LRNG 的目的是要成为现有内核 RNG 的替代品,同时又添加了一系列的新功能。其实其中一些功能如果能从中分离出来,可能会很受欢迎。

Müller 提供了一组 ppt 来对 LRNG 进行了很好的概述。多年来,内核 RNG 一直有一个困难,就是如何在启动时保证收集足够的熵来确保能满足加密强度需求的随机数,尤其是对于虚拟机或者那些没有多少来自磁盘中断等的熵的系统中(比如使用 SSD 的系统)。LRNG 在启动时利用 CPU execution-time jitter (执行时间的抖动)以及其他一些技术来更快地收集熵。正如他在 LRNG 论文中所述,这种熵收集的方式符合美国国家标准与技术研究所(NIST)的 SP 800-90B 标准。此外,LRNG 将熵的各个来源结合起来时采用的技术具有完整文档以及数学论证,而不是目前内核 RNG 中采用的不正式的机制(informal mechanism)。

第一个 patch 包括 LRNG framework 中对熵的收集和处理的部分。提供了一个符合 NIST SP 800-90A 的 determinitic RNG(DRNG),但它也允许在框架内使用其他的 DRNG 实现。但事实上它是作为了现有 RNG 的直接替代品,意味着它取代了所有这部分代码。现有的代码其实是可以正常工作的,也许确实有一些已知的限制,但是采用一个新的实现来 "重新开始" 的做法肯定会有一些危险性。

除此之外,讨论中的几个人对 NIST 标准(也称为 FIPS 标准)的价值也持有怀疑态度。Jason A. Donenfeld 说:

你又把这个改动重新发布出来了,然而我仍然认为这不是正确的设计,也不是正确的方向。这里专门把 extended configurability("flexibility")作为明确目标,或者专门要与 FIPS 兼容,我不认为这些做法代表了好的方向,我认为这引入了新的问题,而不是解决任何现有问题。虽然有一些方法可以(甚至应该)要改进目前的 RNG,哪怕是重写,但你现在的这种做法仍然不是正确的做法,无论你发布多少次都是一样。

但 Müller 指出,一些发行版正在自己背负一些 patch 从而能做到符合 FIPS 的要求,这导致了内核中的 cryptographic RNG 方案的碎片化。LRNG 背后的想法是希望无论选择哪种 DRNG,都能确保所产生的随机数是以一种安全的方式产生的。此外,他说他没有收到关于 LRNG 设计的抱怨,而他在这一过程中根据多位 Linux 开发者的建议纳入了很多改动。这组 patch 的 change log 可以追溯到 2016 年,其中能看到不少的这类改动。

Distributions and FIPS

Greg Kroah-Hartman 想知道发行版中背负的 FIPS 合规性 patch 的具体情况。具体来说他想知道:"为什么发行版没有向 upstream 提交他们的改动?" 在 RHEL crypto 团队的 Simo Sorce 回答说:"我们没有向 upstream 提交,是因为这些都是一些 hack 的做法,我们清楚这一点,而且我们知道它们不是一个长期的解决方案。" 他说,Red Hat 确实需要某种方式能使其产品符合 FIPS 标准。

但是 Kroah-Hartman 说。"今天能起作用的 hack 做法,就是迈向真正解决方案的一步。" 他重申,要想让能符合 FIPS 规范的代码进入内核,需要的是演化(evolution),而不是完全替代随机数生成子系统。"从那些已知的、有效的、能通过认证的 hack 做法中着手。先提交这些改动,让我们从那里开始。"

同样,John Haxby 也说甲骨文也有一个 patch,可以在启动时或每次写入 sysfs 文件的时候来选择启用符合 FIPS 标准的 RNG。在 FIPS 模式下,它总是修改 DRNG 的 seed 为 jitter 熵。他说,对甲骨文来说,自己背负这样的 patch 补丁是 "not healthy",但这是权宜之计。他更希望在 upstream 上能有大家都可以用的东西,但暂时先用这个 patch 来做为一个临时变通的办法:

我们自己打上这个 patch 只是因为认证的要求发生了变化,而这个 patch 是解决当前问题的最快速和最简单的方法。它不能解决未来的问题,下次我们或者其他人尝试 FIPS 认证时,都会需要一个不同的/dev/random 方案,因为无论是旧的方案还是我们的快速 hack 的解决方法,实际上都是不可接受的。

Kroah-Hartman 建议说,这个 patch 也是一个很好的起点:"现在,与'重写整个随机数发生器'相比,这是一个更小、更简单、更容易理解的改动"。他说,如果那些需要符合 FIPS 标准的人可以配合起来一起工作,从而让代码进入 mainline,这可能是一个更容易的途径:

但是,仅仅为此而再专门添加一个独立随机子系统就不是一个好主意了,这也是这组 patch set 一直被内核开发者们忽视的一个主要原因。

Sorce 也回复了 Donenfeld,指出 "FIPS 对我们来说是必不可少的,任何设计方案都包括一个可以通过 FIPS 认证的选项"。Müller 一直在与发行版和标准组织合作,来收集和实现这些要求。在 Sorce 的另一封邮件中,他描述了其中的一些工作:

这些 patch 并不是凭空生成的,Stephan 基本上是提炼了多个供应商以及监管机构之间的讨论(你可以看到他有来自 BSI 的 review,并且 NIST 的要求在这里也有充分体现)。

他解决了几个我可以列举出来的需求,但注意这些并不是一个完整清单:性能(尤其是在 NUMA 系统上),不会在启动时由于缺乏熵而被卡住,遵循 NIST/BSI 规范,非常灵活因此针对未来的监管要求可以很容易地被集成进来推到 upstream 之上。

More FIPS

Kroah-Hartman 还是宁愿看到这里能遵循正常的内核开发路径。"记住,内核开发的正确方式是进化(evolution),而不是 intelligent design :)"。但是,正如 Müller 所指出的,在 2020 年 9 月就有一个 patch set 发布出来给大家讨论,它就是将目前的 RNG 通过 evolution 的方式来改为符合要求的 RNG,而那个 patch set 从来没有什么真正进展。Kroah-Hartman 问道:"那可是一大堆 patch,其中一些看起来很合理,它们后来进展如何?" Müller 说,答案是:"完全没有讨论,完全没有一个被合入"。

Müller 还说,LRNG 实际上并没有取代内核中现有的 RNG,它只是提供了一种使用方案的方法:

补充说明一下:LRNG 的 patch set 并没有取代 random.c,而是提供了一个额外的实现,可以在编译时来选择切换。我的印象中在内核的其他领域如文件系统、内存分配器等等,这是一种很正常的做法。

Kroah-Hartman 说,虽然在某些领域可能确实有必要同时拥有多个 upstream 的实现方案,但内核 RNG 并不算是这种领域。除此之外,内核 RNG 还在内核的多个地方使用。"很可能,你真的不希望内核内的调用是来自'random-government-crippled-specification' (也就是来自某个政府机构随意定义出来的规范) 方式实现,对吗?" Sorce 并不同意这个说法:

当我们的客户被要求使用 FIPS 认证的加解密方式时,他们也希望将其用在内核里的加解密上,而且通常来说,他们也希望使用一个可以通过认证的随机数来源。

他很理解,由于历史上的 Dual EC DRBG 之类的问题,人们在信任政府机构方面总会很犹豫,但 NIST 的规范并没有强制要求使用某种特定的算法,它的要求都是为了能允许多种不同的实现方式。此外:

该规范定义得相当彻底,其中提供了合理的要求,以及 self-test 来确保代码编写错误不会导致返回一些非随机的数值。

Maintainer questions

但是,在遵循 evolution 方式来改变内核 RNG 方面还有一个问题,Sorce 说:

这里的主要问题是,如果随便某个设备的维护者完全不参与讨论、也不合入那些明显的 bug fix,而且根本不参与进来,那么我们怎么能达到这个目的?

你的计划需要一个积极的维护者来引导这些改动,并与提出这些改动的人进行交流,从而协商出最佳结果。但这并没有发生,所以目前这条道路似乎被堵死了。

Ted Ts'o 是内核 RNG 的维护者,但在这次以及其他一些关于该子系统的改动和 fix 的讨论中明显缺席了。Kroah-Hartman 似乎对上面这种 bug fix 没有被采纳的说法持怀疑态度,但 Eric Biggers 列举了几个最终被其他维护者(其中一个是 Kroah-Hartman)合入之前一直被搁置的 fix 和清理工作。Biggers 总结说:"因此,不幸的是,就我所知,Ted 不再维护 random.c 了。"

Donenfeld 说,他愿意 review 对内核 RNG 的 fix 和改进,但提醒说他担心 FIPS 的要求可能过于宽泛:

因此,我们希望实现最好的 RNG 的目标,似乎有可能与获得合规认证的目标是互相冲突的,因为那个认证有点越界了。

[我希望内核有一个优秀的 CSPRNG [加密安全伪随机数发生器,cryptographically-secure pseudorandom number generator],从密码学的角度,从性能的角度,从 API 的角度。我认为这些目标与内核的一般开发方式是一致的。我认为把外部合规性的目标放在所有目标的最前面,大大偏离了内核的开发方式,甚至会分散了内核的开发精力。

[具体来说,我认为如果你改变你的观点,从 "我们如何改变 RNG 的算法来符合 FIPS " 变为 "我们如何在 FIPS 的限制之内进行一些调整,使客户想要的东西对 RNG 实现的质量的影响能降到最低、避免引入不当的维护负担。" 这意味着:不要把 RNG 重构成一些大型的抽象层并支持可以插拔来使用多种不同的实现方案,不要在一个巨大的 patch set 中重写整个东西,不要增加不相干的一些内容。相反,先做一些非常、非常小的事情,这将大大减少争议。

Sorce 对这一方法表示赞同,Haxby 说他会发布 Oracle 的 patch,来作为一种可能的前进方向。我们所看到的是,至少在某种程度上,是一个新的维护者出现,自愿来帮助解决内核 RNG 的问题,Ts'o 也支持这个决定。如果能提出一个更加符合 evolution 方式的修改方法,而不仅仅是 "因为 FIPS 有要求" 来进行修改,那么内核 RNG 方案似乎可以在避免被全面替换从而带来动荡的情况下也能达到合规的(compliance)要求。Sandy Harris 提出了另一种可能性,就是 FIPS 的要求其实也可以用现有的 RNG 来满足,但这里有一些需要调整的地方:

[……]事实上,他们的 DRNG 的设计中需要依赖一个外部的随机比特源(external source of random bits)。然而,它要求这个来源必须要经过认证(be certified),这对我们来说是个问题。英特尔等公司可能会让他们的随机数指令能通过认证,而 crypto 供应商或 SOC 芯片的供应商可能也会让他们的随机数硬件来获取认证,但是内核社区并不负责做这个事情。

我认为内核的熵收集程序已经足够好了,它们原则上可以通过认证,但这将涉及一些工作量以及不少资金。

很明显,至少对于企业版来说,还是需要一些解决方案的。Müller 的 patch 提供了一个符合 FIPS 标准的机制,并且对性能的影响很小,甚至可能比现有的实现方式更好,同时还解决了一些其他问题。这里所使用的技术可以形成比较好的基础,后续就只要相对比较少的改动,这可能会使内核 RNG 的所有用户都受益。现在的 patch set 是无法落地的,但是,如果运气好,再加上一些毅力,那么我们也是可以通过遵循通常的内核开发策略来满足 FIPS 的要求的。只能等时间来告诉我们答案了。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

c32f8d55f18ec033e2f629be7f706cd0.png

Linux 常用命令 set 指令能设置所使用shell的执行方式 -a  标示已修改的变量,以供输出至环境变量。 -b  使被中止的后台程序立刻回报执行状态。 -C  转向所产生的文件无法覆盖已存在的文件。 -d  Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。使用-d参数可取消。 -e  若指令传回值不等于0,则立即退出shell。 -f   取消使用通配符。 -h  自动记录函数的所在位置。 -H ............ 阅读详情

相关推荐

RNG随机数标准FIPS140-2

RNG随机数标准,FIPS140-2,安全算法测试中经常会用到的尤其是对硬件和终端的要求。。

linux fips 模式,linux – FIPS Capable OpenSSL交叉编译:内容指纹问题

我在尝试使用在MIPS设备上编译为FIPS的OpenSSL共享库(libcrypto)时遇到问题.我以下面的方式交叉编译FIPS对象模块,然后是OpenSSL库(总结):export FIPS_SIG=/incore./config fips --with-fipsdir=/fips-2.0make dependmakemake install我做了所有必要的步骤,所以我能够编译和安装库.当我尝试...

weixin_36016076的博客 823

nginx全套linux环境搭建包( nginx-1.2.6+openssl-fips-2.0.5+pcre-8.32+zlib-1.2.7)

nginx全套linux环境搭建包: 1.nginx-1.2.6.tar.gz 2.openssl-fips-2.0.5.tar.gz 3.pcre-8.32.tar.gz 4.zlib-1.2.7.tar.gz 免去您一个个资源寻找的麻烦,本人已测,绝对能用,识货的来!

Linux系统之fipscheck详解

fipscheck 命令使用存储的文件校验和来执行 FIPS-140-2 验证

weixin_56303229的博客 428

『与善仁』Appium基础 — 19、元素定位工具之UI Automator Viewer

文章目录(一)uiautomatorviewer定位工具1、uiautomatorviewer介绍2、uiautomatorviewer工具打开方式3、uiautomatorviewer布局介绍4、uiautomatorviewer工具的使用 之前我们在做web页面自动化的时候就说过,元素定位是页面自动化的第一步。 同理App自动化测试的第一步,也是元素的定位。 在APP中定位元素的话,需要借助一些元素定位工具。 APP中的元素定位工具大致有三种: uiautomatorviewer Appium Ins

繁华似锦Fighting 1520

LEAP模型—低排放分析平台

LEAP 正在迅速成为进行综合资源规划、温室气体 (GHG) 缓解评估和低排放发展战略 (LEDS) 的国家的事实标准,尤其是在发展中国家,许多国家也选择使用 LEAP 作为其承诺的一部分向联合国气候变化框架公约(UNFCCC)报告。至少有 32 个国家使用 LEAP 来创建能源和排放情景,这些情景是其国家自主气候变化贡献计划 (INDC) 的基础:具有历史意义的巴黎气候协议的基础旨在表明各国开始经济脱碳的意图和投资于气候适应力。

weixin_54697010的博客 3280

确定Linux虚拟机需要安装哪个架构的应用:聊聊两大关键条件,轻松选应用!

嗨,你好呀,我是仨仨!今天我们要聊一个有趣的话题——在Linux虚拟机上怎么选装应用。选择应用其实也没那么难。主要有两个关键条件,一起来看看吧!

仨仨的博客 1040

华大HC32F460从零到200MHz:手把手教你配置时钟系统(附避坑指南)

本文详细解析了华大HC32F460 MCU的时钟系统配置,从启动过程、时钟树分析到实战配置200MHz系统时钟。文章手把手指导开发者如何正确配置外部晶振、MPLL锁相环及总线分频,并提供了硬件检查、代码解读及常见问题排查的避坑指南,帮助用户从零构建稳定可靠的高性能时钟环境。

net55的博客 296

硬盘分区

用FIPS为Linux分割   首先,FIPS是什么呢?其实您打开Linux光盘找一找,它就在光盘根目录的dos-stuff目录下或dos-stuff\fips目录下。好了,找到了吧?那么我们就具体谈谈它的使用吧!   FIPS(First Interactive Partition Splitter)程序是一个功能非常强大的MS-DOS工具程序,它可以在不删除硬盘上原有...

weixin_34102807的博客 182

ESP32 TWAI CAN库实战:从零构建CyberGear微电机控制框架

本文详细介绍了如何利用ESP32的TWAI控制器和Arduino环境,从零构建一个面向对象的CyberGear微电机控制框架。该框架将复杂的CAN通信协议封装为简洁的API,开发者无需深究底层细节,即可轻松实现电机的速度、位置和扭矩控制,大幅简化机器人关节、云台等项目的开发流程。

oil88的博客 499

MacOS Intel芯片实战:Docker Compose一键部署Dify全流程解析

本文详细解析了在搭载Intel芯片的MacOS系统上,使用Docker Compose一键部署开源LLM应用开发平台Dify的全流程。内容涵盖环境准备、Docker配置与镜像加速、代码拉取与配置初始化、服务启动与问题排查,以及访问验证与初步探索,旨在帮助开发者快速在本地搭建私有化AI应用开发环境。

ik678901234的博客 619

linux 检查openssl,linux – 如何检查OpenSSL中的FIPS 140-2支持?

How do I check whether OpenSSL has is providing FIPS validated cryptography or not?这取决于您想要检查的方式和时间.它还取决于应用程序.FIPS可以使用但不能使用.因此,应用程序必须通过FIPS_mode_set启用经过验证的加密,并且调用必须成功.如果要检查FIPS Capable Library(如OpenSSL...

weixin_34847632的博客 859

[QMT量化交易小白入门]-104、QMT平台运行深度学习模型,预测期货价格

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 484

LWN:统一Linux 随机数设备!

关注了就能看到更多这么棒的文章哦~Uniting the Linux random-number devicesBy Jake EdgeFebruary 16, 2022DeepL ass...

Linux News搬运工 1143

在SAP系统中,公司间关联交易(Intercompany Transactions)或内部往来主要有三种经典的实现模式。这些模式的选择取决于企业的业务复杂度、自动化需求以及对实时性的要求

SAP系统中公司间关联交易的三种实现模式分析:1)手工记账模式(FB60/FB70)适用于低频交易,灵活性高但易出错;2)SD/MM跨公司销售采购模式(VA01/VF01/ME21N)适用于真实业务流转,业务财务集成度高;3)自动清算模式(F.13/ICR)适合高频交易集团企业,支持实时自动对账。关键成功要素包括正确配置贸易伙伴字段、统驭科目及专用凭证类型。建议根据企业规模、业务复杂度及自动化需求选择合适模式,其中大型集团优先考虑自动对账方案以确保合并报表准确性。

金牌架构师 552

使用Simulink进行四足机器人的非线性动力学建模与仿真

四足机器人的运动包含多个自由度(DOF),包括腿部的摆动和支撑阶段的动力学特性。由于存在接触力、摩擦以及不同地形的影响,四足机器人的动力学行为呈现出高度的非线性特征。因此,构建准确的非线性动力学模型对于研究机器人的运动学和动力学特性至关重要。定义代表机器人状态的变量,如位置、速度、角度和角速度。matlab深色版本通过本指南,我们介绍了如何基于Simulink搭建一个四足机器人的非线性动力学模型,并进行了详细分析。

xiaoheshang_123的博客 311

让你了解操作系统基本概念

前言:本文是《操作系统教程(陈怀临注释)》的读书笔记,陈首席是在原书pdf 图片上注解,字体比较模糊,故我把注释中觉得比较重要的片段摘录下来。读完此文可以让非技术人员对操作系统有框架性的认识,也可以唤起技术人员记忆中某些概念片段,实际上很多概念我也理解得有点模糊,大家一起学习。:) 博客地址 1、OS其实是概念多于理论,技术多于算法。因此把握OS最重要的是把握概念,特别是概念的层次化。

perry_Fan 2万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

用FIPS为LINUX分区

用FIPS为LINUX分区 LINUX是目前最热门的东西,相信许多朋友都在准备着装一个。在各种媒介上也都有许多关于LINUX的文章,网上更是随处可见。但是奇怪的是都没有提到用FIPS这个分区工具?真是很奇怪啊!    那么FIPS是什么东西来的呢?其实你打开LINUX光盘找一

397

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

关于XP\win7系统中安装.net4.0 程序运行版本出错的原因之一

解决“This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms” 还是装那台服务器,装好了IIS和ASP.NET,但在运行aspx页面时出现了异常: 异常信息: This implementation is not part of the Windows P

chenhongshuai12的博客 3338

用FIPS为LINUX分区(转)

用FIPS为LINUX分区(转)[@more@]  LINUX是目前最热门的东西,相信许多朋友都在准备着装一个。在各种媒介上也都有许多关于LINUX的文章,网上更是随处可见。但是奇怪的是都没有提到用FIPS这个分区工具?真是很奇...

196

Linux升级openssh及问题总结

升级步骤: [root@db 1]# yum install pam-devel [root@db 1]# pwd /home/1 [root@db 1]# ls openssh-7.1p2  openssl-1.1.0-pre3  zlib-1.2.8 [root@db 1]# ssh -V OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar

lk的窝 6万+

远程计算机可能不支持所需要的FIPS安全级别

在本地计算机上依次打开“控制面板”-“管理工具”—“本地安全策略” 在本地安全策略中,打开“本地策略”下的“安全选项”; 在右边的策略中,找到“系统加密:将FIPS算法用于加密 、哈希和签名”点击右键属性; 将“本地安全设置”设置为“已禁用”,在单击“应用”,后”确定”,即可远程控制!...

yushuir的专栏 2293

OpenSSL FIPS安装

OpenSSL FIPS documentation:  http://www.openssl.org/docs/fips/ Download: http://www.openssl.org/source/ unpack and compile OpenSSL FIPS module: ./config make sudo make install unpack and comip

yuanhangq220的专栏 8494

Flink 学习日志 03:自定义一个SourceFunction,完成对Redis中数据的读取

本文介绍了在Flink中自定义SourceFunction读取Redis数据的完整流程:通过Jedis客户端连接WSL2中的Redis服务,编写RedisSource实现循环读取所有Key-value并逐条输出,结合Thread.sleep()实现每秒一条的流式效果。关键步骤包括环境准备、添加Jedis依赖、配置IDEA运行时加载provided依赖,并注意生产环境中应避免使用阻塞的keys *,改用scan命令。最终实现动态读取、实时打印,验证了Flink与Redis的数据集成能力。

木木的学习笔记 421
上一篇: LWN: 使用KCSAN检测出缺失的memory barrier!
下一篇: LWN:引用计数的调试机制!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值