Anonymous and Efficient Authentication Scheme for Privacy-Preserving Distributed Learning
可译为“一种保护隐私的分布式学习匿名高效认证方案

最近又看了一篇TISF2022上的文章,这篇文章思想比较简单,但是整体内容挺全的。主要是提出了在分布式学习(也可以看作是联邦学习)中,实现一种保护隐私的匿名高校验证方案。没有用到复杂的密码技术(如同态加密、安全多方计算)、差分隐私等。下面是自己提炼的一些笔记,作为后续回顾用,可能有错误。建议看原文,因为花不了一天就可以读完读懂。

  • 原文链接:Anonymous and Efficient Authentication Scheme for Privacy-Preserving Distributed Learning

文章目录预览

  • 一、背景介绍
    • 1.1 存在问题
    • 1.2 系统概况
      • 1.2.1 安全模型
      • 1.2.2 设计目标
  • 二、主要内容
    • 2.1 无证书签名方案(PCLS)
    • 2.2 批量验证的匿名高效认证协议(AAPBV)
  • 三、安全分析和性能评估
    • 3.1 安全分析
    • 3.2 性能评估

一、背景介绍

摘要:在分布式学习(Distributed Learning,DL)中,敌手能够通过分析中间参数(传输的模型)来推断出原始数据。目前的解决方案,主要依赖于差分隐私、加密技术(同态加密、安全多方计算)。但差分隐私会降低数据效用,而加密技术的操作是有限的,以及计算和通信成本很高。

本文提出了一种不降低数据效用的前提下,解决隐私问题和匿名认证问题。而且可以结合数据投毒攻击和搭便车攻击的检测方法,更适用于分布式场景。因此,设计了一个基于配对的无证书签名方案,进一步提出了支持动态批量验证的匿名高效认证协议

1.1 存在问题

  • 1)一旦原始数据被恢复,参与者的个人信息就会被公开。因此,有必要保护模型参数不受不可信云服务器的影响。在云服务器端,在不暴露原始参数的情况下实现安全的参与聚合是分布式学习中的挑战。
  • 2)采用同态加密、安全多方计算、秘密共享等加密技术设计安全的数据交换/聚合协议,这些方法不适用分布式学习中的所有ML算法,因为它可能只支持有限数的加法和乘法操作。此外,消耗了过多的通信和计算资源。
  • 3)差分隐私通过向原始数据或模型参数引入随机噪声来模糊信息。这种随机性降低了数据效用,给ML 模型带来了不必要的精度下降和更长的模型收敛延迟。

主要思想:若DL系统中参与者是匿名的,那么尽管恢复了原始数据,但敌手无法将数据链接到相应的真实身份,从而实现了隐私保护。

主要贡献

  • 1)可以不降低数据效用的情况下,利用匿名身份验证来解决DL中隐私问题,并可以检测数据中毒攻击和搭便车攻击。
  • 2)基于配对的密码学基础设计了一个新的无证书签名方案(PCLS)。基于这个签名方案,提出了一种支持批量验证的匿名高效认证协议( AAPBV)。
  • 3)设计了一种动态批量验证算法(DBV),可以在批验证过程中动态调整批大小。
  • 4)对所提的协议所实现的安全特性提供了形式化的证明和分析。
  • 5)进行了大量的模拟以评估协议的计算效率,批量验证耗时减少70%以上。

1.2 系统概况

本文中的参与者和云端服务器与联邦学习中类似,执行相同的功能。只是多了一个完全可信的TA,负责初始化、参与者注册、密钥生成和身份管理。当潜在的恶意参与者上传虚假数据破坏全局模型,TA能识别出参与者真实身份。

1.2.1 安全模型

  • 1)云服务器是半城实的:它按照聚合协议进行聚合,但对参与者的私有数据好奇。
  • 2)参与者可能是恶意的:合法参与者可以上传错误的模型参数,使遭受数据投毒攻击和搭便车攻击;非法参与者可以伪造签名签署虚假消息,从而使虚假消息通过云认证;参与者对云和另一个参与者之间的传输好奇。
  • 3)中间人攻击:攻击者停留云和参与者之间,可以改变云与参与者之间的 通信,使双方认为是直接通信。
  • 4)TA是完全可信的:在系统初始化、参与者注册和密钥生成过程中,始终提供可靠的服务。

1.2.2 设计目标

  • 1)机密性:保护攻击者不泄露参与者的敏感信息。
  • 2)匿名性:包括云在内的任何实体(除了TA)都无法推导出系统参与者的真实身份。
  • 3)相互认证:云和参与者之间可以相互验证对方的消息来源。
  • 4)不可链接性:任何两个消息传输都不应该链接相同的参与者。意味着攻击者无法验证两个消息是否来自同一参与者。(就是消息和身份之间找不到关联
  • 5)不可伪造性:系统中攻击者无法伪造有效地签名来签名消息。
  • 6)前向安全:若某个参与者私钥泄露,则该参与者与云之间先前的会话密钥仍是安全的。
  • 7)后向安全:若某个参与者私钥泄露,则该参与者与云未来的会话密钥无法泄露。
  • 8)不可否认性:当参与者向云更新模型参数时,一旦请求通过身份验证,参与者不能否认它对全局模型做出的贡献。

计算效率:认证协议必须具有计算效率。特别是当一个大规模的DL系统涉及大量参与者时,云可以很高的时间效率对参与者认证。

二、主要内容

本方案的基础是先设计了一个新的无证书签名方案(PCLS),然后再次基础上提出了支持批量验证的匿名高效认证协议(AAPBV),最后设计了动态批量验证算法(DBV)。

2.1 无证书签名方案(PCLS)

相较于典型的无证书签名方案,做了两处修改:1)没有将签名者的真实身份设置为部分公钥,而是使用真实身份的哈希作为部分公钥;2)对签名生成和消息验证进行了修改,以支持批量验证。

  • (1)Setup:TA随机选择整数XTA∈Zp∗X_{TA}\in\mathbb{Z}^*_pXTA​∈Zp∗​作为私钥,计算公钥YTA=XTAPY_{TA}=X_{TA}PYTA​=XTA​P,公开系统信息(l,p,P,e,G1,G2,H1,H2,YTA)(l,p,P,e,\mathbb{G}_1,\mathbb{G}_2,H_1,H_2,Y_{TA})(l,p,P,e,G1​,G2​,H1​,H2​,YTA​)。
  • (2)Key-Extract:签名者随机选择整数X′∈Zp∗X'\in\mathbb{Z}^*_pX′∈Zp∗​作为部分私钥,则部分公钥为Y′=X′PY'=X'PY′=X′P。签名者计算Y′′=H1(ID)Y''=H_1(ID)Y′′=H1​(ID),并发送给TA,其中ID为真实身份。然后,TA计算X′′=XTAY′′X''=X_{TA}Y''X′′=XTA​Y′′,并发给签名者。最终,签名者的完整私钥为(X′,X′′)(X',X'')(X′,X′′),完整公钥为(Y′,Y′′)(Y',Y'')(Y′,Y′′)。
  • (3)Sign:发送消息mmm前,签名者随机选择r∈Zp∗r\in\mathbb{Z}^*_pr∈Zp∗​,并签名消息
    k=H2(m∣∣Y′∣∣Y′′∣YTA,rP).U=X′YTA−X′′k.k=H_2(m||Y'||Y''|Y_{TA},rP).\\ U=X'Y_{TA}-X''k. k=H2​(m∣∣Y′∣∣Y′′∣YTA​,rP).U=X′YTA​−X′′k.
    则签名为σ=(k,U)\sigma=(k,U)σ=(k,U)。
  • (4)Verify:自从接收到消息mmm和签名σ\sigmaσ,验证
    e(Y′,YTA)=?e(U,P)e(Y′′,YTA)k.e(Y',Y_{TA})\overset{\text{?}}{=}e(U,P)e(Y'',Y_{TA})^k. e(Y′,YTA​)=?e(U,P)e(Y′′,YTA​)k.
    若验证通过,则该消息被接收。

2.2 批量验证的匿名高效认证协议(AAPBV)

AAPBV主要包括初始化注册认证批验证四个阶段。如下所示:

  • (1)初始化:初始一些双线性配对的信息,与签名方案的Setup一样,XTAX_{TA}XTA​作为TA的私钥,公钥为YTA=XTAPY_{TA}=X_{TA}PYTA​=XTA​P。公开系统参数(l,p,P,e,G1,G2,H1,H2,H3,YTA)(l,p,P,e,\mathbb{G}_1,\mathbb{G}_2,H_1,H_2,H_3,Y_{TA})(l,p,P,e,G1​,G2​,H1​,H2​,H3​,YTA​)。
  • (2)注册:参与者和云需要向TA提供真实身份注册。
    • 对于云,首先随机选择Xc′∈Zp∗X'_c\in\mathbb{Z}^*_pXc′​∈Zp∗​作为私钥,计算公钥Yc′=Xc′PY'_c=X'_cPYc′​=Xc′​P,然后它通过安全通道发送身份IDcID_cIDc​给TA,TA计算Yc′′=H1(IDc),Xc′′=XTAYc′′Y''_c=H_1(ID_c), X''_c=X_{TA}Y''_cYc′′​=H1​(IDc​),Xc′′​=XTA​Yc′′​,并返回密钥对(Xc′′,Yc′′)(X''_c,Y''_c)(Xc′′​,Yc′′​)给云。最后,云的公钥为(Yc′,Yc′′)(Y'_c,Y''_c)(Yc′​,Yc′′​),私钥为(Xc′,Xc′′)(X'_c,X''_c)(Xc′​,Xc′′​)。
    • 类似地,每个参与者UnU_nUn​的公钥为$(Yn′,Yn′′)(Y'_n,Y''_n)(Yn′​,Yn′′​),私钥为(Xn′,Xn′′)(X'_n,X''_n)(Xn′​,Xn′′​)。
  • (3)认证:每个参与者UnU_nUn​在更新模型参数WnW_nWn​到云之前,它先生成WnW_nWn​的签名σn\sigma_nσn​。然后,
    • 随机选择r,v∈Zp∗r,v\in\mathbb{Z}^*_pr,v∈Zp∗​;
    • 计算Dn=H2(Wn∣∣Yn′∣∣Yn′′∣∣Yc′)D_n=H_2(W_n||Y'_n||Y''_n||Y'_c)Dn​=H2​(Wn​∣∣Yn′​∣∣Yn′′​∣∣Yc′​);
    • 计算kn=H2(Wn∣∣Yn′∣∣Yn′′∣∣Yc′,rP)k_n=H_2(W_n||Y'_n||Y''_n||Y'_c,rP)kn​=H2​(Wn​∣∣Yn′​∣∣Yn′′​∣∣Yc′​,rP);
    • 计算Un=Xn′YTA−Xn′′knU_n=X'_nY_{TA}-X''_nk_nUn​=Xn′​YTA​−Xn′′​kn​;
    • 签名为σ=(kn,Un)\sigma=(k_n,U_n)σ=(kn​,Un​);
    • 计算Zn=vP,Zn′=vYc′Z_n=vP,Z'_n=vY'_cZn​=vP,Zn′​=vYc′​;
    • 计算Wn∗=Encs(Wn∣∣Yn′∣∣Yn′′∣∣Yc′,Zn)W_n^*=Enc_s(W_n||Y'_n||Y''_n||Y'_c,Z_n)Wn∗​=Encs​(Wn​∣∣Yn′​∣∣Yn′′​∣∣Yc′​,Zn​);(后面好像没交代用了什么对称加密)
    • 发送更新请求消息reqn=(Wn∗,σn,kn,Un,Dn,Zn′)req_n=(W^*_n,\sigma_n,k_n,U_n,D_n,Z'_n)reqn​=(Wn∗​,σn​,kn​,Un​,Dn​,Zn′​)给云。
      当云收到请求reqnreq_nreqn​后验证消息
    • 恢复ZN=Xc′−1Zn′Z_N=X'^{-1}_cZ'_nZN​=Xc′−1​Zn′​;
    • 计算Wn∣∣Yn′∣∣Yn′′∣∣Yc′=Decs(Wn∗,Zn)W_n||Y'_n||Y''_n||Y'_c=Dec_s(W^*_n,Z_n)Wn​∣∣Yn′​∣∣Yn′′​∣∣Yc′​=Decs​(Wn∗​,Zn​);
    • 检查Dn=?H2(Wn∣∣Yn′∣∣Yn′′∣∣Yc′)D_n\overset{\text{?}}{=}H_2(W_n||Y'_n||Y''_n||Y'_c)Dn​=?H2​(Wn​∣∣Yn′​∣∣Yn′′​∣∣Yc′​)。若等式成立,继续下一步,否则停止;
    • 根据PCLS中Verify步骤检查签名σn\sigma_nσn​的有效性。若有效继续下一步,否则拒绝;
    • 云为下一步建立会话密钥Sn1=H3(Dn∣∣Wn∣∣Zn)S^1_n=H_3(D_n||W_n||Z_n)Sn1​=H3​(Dn​∣∣Wn​∣∣Zn​),后续会话密钥计算为Snj+1=H3(Snj∣∣Zn),∀j≥1S^{j+1}_n=H_3(S^j_n||Z_n),\forall j\geq1Snj+1​=H3​(Snj​∣∣Zn​),∀j≥1。

注意,云可以结合现有的检查方案,检查出投毒攻击和搭便车攻击。

  • (4)批量验证:对于请求列表R={reqn=(Wn∗,σn,kn,Un,Dn,Zn′)}n=1N\mathcal{R}=\{req_n=(W^*_n,\sigma_n,k_n,U_n,D_n,Z'_n)\}^N_{n=1}R={reqn​=(Wn∗​,σn​,kn​,Un​,Dn​,Zn′​)}n=1N​,批量验证根据以下公式判断:
    e(∑n=1NYn′,YTA)=?e(∑n=1NUn,P)e(∑n=1NknYn′′,YTA).e(\sum^N_{n=1}Y'_n,Y_{TA})\overset{\text{?}}{=}e(\sum^N_{n=1}U_n,P)e(\sum^N_{n=1}k_nY''_n,Y_{TA}). e(n=1∑N​Yn′​,YTA​)=?e(n=1∑N​Un​,P)e(n=1∑N​kn​Yn′′​,YTA​).
    若上式成立,签名列表都有效。否则,云启动DBV算法去查找合适的批处理大小并重新进行批处理验证。如下算法所示:

算法的主要思想是:

  • 1)云选择一个验证率ϵ∈(0,1)\epsilon\in(0,1)ϵ∈(0,1),并从R\mathcal{R}R中随机选择M=ϵNM=\epsilon NM=ϵN个请求。这MMM个请求再通过上式批量验证;
  • 2)若还未通过,云则重复上述步骤,但最多不超过η\etaη次。
  • 3)若所有η\etaη次都失败了,云继续调小批量验证的大小M=ϵMM=\epsilon MM=ϵM,并重复算法1中的3-15行步骤,直到批量验证大小M<λN,λ∈(0,1)M<\lambda N,\lambda \in(0,1)M<λN,λ∈(0,1),其中λ\lambdaλ为批处理大小的阈值系数。

(其中ϵ\epsilonϵ就是查找假消息的“步长”)

三、安全分析和性能评估

正确性主要根据双线性映射的性质来证明。

3.1 安全分析

  • 1)不可伪造性:在CDHP假设下,所提出的PCLS对选择的消息是不可伪造性的;
  • 2)保密性:在DDHP假设下,提出的AAPBV对所选密文攻击是保密的。云可以揭示参与者的公钥(Yn′,Yn′′)(Y'_n,Y''_n)(Yn′​,Yn′′​),并检查Dn=?H2(Wn∣∣Yn′∣∣Yn′′∣∣Yc)D_n\overset{\text{?}}{=}H_2(W_n||Y'_n||Y''_n||Y_c)Dn​=?H2​(Wn​∣∣Yn′​∣∣Yn′′​∣∣Yc​)来判断消息是否被修改。因此,AAPBV实现了保密性和完整性。
  • 3)不可链接性:在DLP假设下,提出的AAPBV实现了不可链接性。系统中的恶意参与者无法将消息链接到特定的参与者。由于云可以恢复参与者的公钥,它可以基于其公钥将请求链接到参与者。然而,由于云的匿名性,它无法揭示自己的真实身份。因此,从恶意参与者的角度实现了不链接。
  • 4)匿名性:整个过程中,参与者的真实身份不涉及认证和传输。虽然参与者的部分公钥Yn′′Y''_nYn′′​是由真实身份生成,但由于哈希函数的单向性,云和其他参与者不能从Yn′′Y''_nYn′′​中揭示真实身份。
  • 5)相互认证:一方面,云能用它的私钥Xc′X'_cXc′​和参与者的公钥(Yn′,Yn′′)(Y'_n,Y''_n)(Yn′​,Yn′′​)进行身份验证。特别的,云用Xc′X'_cXc′​揭示ZnZ_nZn​,并从中获得(Yn′,Yn′′)(Y'_n,Y''_n)(Yn′​,Yn′′​)。另一方面,参与者可以对云进行认证。由于为下一次传输建立了会话密钥,因此参与者只要能够使用会话密钥解密消息,就可以验证消息来自云。从而实现了相互认证。
  • 6)防中间人攻击:若参与者向云发送reqnreq_nreqn​时,攻击者窃听并修改reqnreq_nreqn​中的Wn,v,rW_n,v,rWn​,v,r值,云可以验证该请求是否成功。然后,云根据修改后的WnW_nWn​计算会话密钥,用会话密钥加密消息,并发送回攻击者。攻击者转发消息给参与者,它的会话密钥在解密消息时无效,则判断消息不是来自云。
  • 7)前向安全:认证成功后,会话密钥建立为Snj+1=H3(Snj∣∣Zn)S^{j+1}_n=H_3(S^j_n||Z_n)Snj+1​=H3​(Snj​∣∣Zn​)。即使参与者的私钥被泄露,当前的会话密钥被泄露,由于哈希函数的单向属性,之前的会话密钥也无法恢复。
  • 8)后向安全:认证成功后,会话密钥建立为Snj+1=H3(Snj∣∣Zn)S^{j+1}_n=H_3(S^j_n||Z_n)Snj+1​=H3​(Snj​∣∣Zn​)。由于会话密钥是基于当前会话密钥和ZnZ_nZn​生成的,即使泄露了当前会话密钥SnjS^j_nSnj​,但由于ZnZ_nZn​的保密性,未来的会话密钥不会被泄露。
  • 9)不可抵赖性:参与者使用其签名对消息进行签名,且签名不可伪造。因此,一旦消息被验证,由于签名的不可伪造性,参与者不能否认它已经发送了消息。此外,当检测到合法参与者上传虚假数据时,云可以用它的公钥链接到参与者,并将公钥发送给TA。TA可以通过搜索不良行为参与者的记录来揭示其真实身份。从而达到了不可抵赖性的设计目标。

3.2 性能评估

使用安全级别为1024bit RSA,曲线y2=x3+xy^2=x^3+xy2=x3+x,嵌入度k=2k=2k=2。实验平台为PBC和GMP加密库,采用Inter® Core™ I7-4770 3.4GHz, 16GB内存,Linux系统搭建。通过在BCD数据集上实现支持向量机来评估AAPBV中的DBV。

在AAPBV中,求幂、乘法和配对主导了计算开销,值评估计算效率的三种操作。其中te=1.5mst_e=1.5 mste​=1.5ms为G2\mathbb{G}_2G2​中一次幂运算的时间消耗,tm=15.175mst_m=15.175mstm​=15.175ms为G1\mathbb{G}_1G1​一次乘法运算的时间消耗,tp=18.06mst_p=18.06mstp​=18.06ms为一次配对运算的时间消耗。下图显示了AAPBV不同阶段的性能与其他方案的对比。

总结:AAPBV在单次验证不具有优势,是因为为支持批量验证和要保证更多的安全特性。但在批验证中具有最佳的时间效率。

为了评估DBV的性能,考虑原始批处理大小为100,假设5条无效消息。在我们的协议中,丢弃消息的数量显著减少。由于批验证中丢弃的消息较少,全局模型收敛,迭代次数较少,如下图。

安全特性的对比,本方案可以满足大部分安全属性。

此外,利用所实现的安全特性,所提出的AAPBV可以与现有的防御方案[7]-[9]集成,检测数据中毒攻击和搭便车攻击。具体来说,在接收到请求reqnreq_nreqn​并揭示WnW_nWn​之后,云就可以部署检测算法,通过分析WnW_nWn​的明文。

一旦检测到一个参与者上传了有毒的ML模型,TA可以根据其公钥揭示其真实身份。因此,该集成方案在使云检测数据中毒攻击和搭便车攻击的同时,保护参与者的隐私方面具有很好的前景。(没有详细说如何结合,介绍的有点少。这篇文章重点是做验证效率实验,对于分布式学习(或联邦学习)的精度和收敛效果较少,以及攻击规模没有做分析)

最新论文笔记(+22):Anonymous and Efficient Authentication Scheme for Privacy-Preserving DL / TIFS2022相关推荐

  1. 最新论文笔记(+4):Blockchain-Based Solutions to Security and Privacy Issues in the Internet of Things

    Blockchain-Based Solutions to Security and Privacy Issues in the Internet of Things(基于区块链的物联网安全和隐私问题 ...

  2. 最新论文笔记(+14):精选12篇区块链与可搜索加密相结合论文进行汇总与概括

    精选12篇区块链与可搜索加密相结合的论文 本篇博文将汇总12篇区块链与可搜索加密相结合的论文,包括之前已经发布的几篇"最新论文笔记"和还未上传的几篇论文笔记(感觉大都差不多就不再详 ...

  3. 最新论文笔记(+13):Hardening Distributed and Encrypted Keyword Search via Blockchain / PAC2017

    Hardening Distributed and Encrypted Keyword Search via Blockchain(通过区块链进行分布式加密关键字搜索) 鉴于前面好几篇都是可搜索加密与 ...

  4. 最新论文笔记(+21):Privacy-Preserving Byzantine-Robust Federated Learning via Blockchain Systems/ TIFS2022

    Privacy-Preserving Byzantine-Robust Federated Learning via Blockchain Systems 可译为"利用区块链实现隐私保护的拜 ...

  5. 最新论文笔记(+20):Biscotti_ A Blockchain System for Private and Secure Federated Learning / TPDS21

    Biscotti: A Blockchain System for Private and Secure Federated Learning"译为"Biscotti:一个用于隐私 ...

  6. 论文笔记(SocialGCN: An Efficient Graph Convolutional Network based Model for Social Recommendation)

    一个有效的基于图卷积神经网络的社交推荐模型 原文链接:SocialGCN: An Efficient Graph Convolutional Network based Model for Socia ...

  7. 最新论文笔记(+16):K-Time Modifiable and Epoch-Based Redactable Blockchain / TIFS 2021

    K-Time Modifiable and Epoch-Based Redactable Blockchain(k次修改和基于epoch的可编辑区块链) 这篇文章是今年发表在TIFS上的一篇区块链相关 ...

  8. 最新论文笔记(+15):Redactable Blockchain Protocols with Instant Redaction /IACR Cryptol.ePrint Arch 2021

    Redactable Blockchain Protocols with Instant Redaction(具有即时编辑功能的可编辑区块链) 这篇文章是今年放在IACR Cryptol.ePrint ...

  9. 最新论文笔记(+19):TrustFed: A Framework for Fair and Trustworthy Cross-Device Federated Learning in IIoT

    TrustFed: A Framework for Fair and Trustworthy Cross-Device Federated Learning in IIoT "译为" ...

最新文章

  1. 【百度地图API】——如何用label制作简易的房产标签
  2. cat /proc/meminfo 各字段详解
  3. PHP中用于精确计算的bcmath扩展
  4. 如何解决for in 循环无法遍历symbol key的问题
  5. [Leetcode][第104题][JAVA][二叉树的最大深度][递归][BFS]
  6. 各平台安装Node.js
  7. 【TensorFlow】TensorFlow从浅入深系列之七 -- 教你使用验证数据集判断模型效果
  8. MySQL安装叫重启_MySQL重启命令和MySQL数据库安装目录的操作过程
  9. javascript jquery ajax动态提交多个参数 api测试
  10. oracle匿名代码块执行insert,MyBatis+Oracle在执行insert时空值报错之从源码寻找解决办法...
  11. 2017-10-湖南套题1
  12. java获取反射机制的三种方式
  13. 继承与data member之多重继承
  14. 最简单的又炫的快捷菜单....喜欢的拿起就跑
  15. TOPSIS优劣解距离法
  16. 【Unity】制作动画
  17. 1430. Crime and Punishment
  18. CVPR2022论文速递(2022.4.15)!共16篇!内含2篇Oral!
  19. AUTOSAR Network Wakeup(Can) Configuration
  20. 详解 git cherry-pick用法

热门文章

  1. 设计模式之略见一斑(组合模式Composite)
  2. python量化交易:基础知识_主流的比较流行的Python量化开源框架
  3. 如何在3dMax 中为模型赋予材质教程
  4. Openfire报账号或密码错误_c#版UC客户端登录
  5. ROS学习笔记-log日志以及输出工具(rqt_console)
  6. 常用数学公式KaTex输入方式一览
  7. C语言在VisualStudio2017下的一些注意事项和常见错误
  8. 美团商品各项数据(1.爬取)
  9. 关于python浮点数类型错误的是_关于Python语言的浮点数类型,以下选项中描述错误的是...
  10. 记录一次无加密门禁卡手机nfc复制过程