802.11-2020协议学习__$12-Security__$12.5.2-TKIP__2

  • 1. TKIP概述
  • 2. TKIP参数
    • 2.1 TKIP图示概览
    • 2.2 TKIP输入参数
    • 2.3 TKIP输出参数
  • 3. TKIP算法
    • 3.1 Micheal
      • 3.1.1 输入参数
      • 3.1.2 计算过程
      • 3.1.3 输出参数
    • 3.2 Phase 1 Key Mixing
      • 3.2.1 输入参数
      • 3.2.2 计算过程
      • 3.2.3 输出参数
    • 3.3 Phase 2 Key Mixing
      • 3.3.1 输入参数
      • 3.3.2 计算过程
      • 3.3.3 输出参数
  • 4. TKIP过程
    • 4.1 TKIP封装
    • 4.2 TKIP解封装
  • 5. TKIP对策
    • 5.1 概述
    • 5.2 认证者的TKIP对策
    • 5.3 请求者的TKIP对策
  • 6. TKIP重放保护

PREV: TBD
NEXT: TBD


1. TKIP概述

TKIP(Temporal key integrity protocol)是在RSNA之前的硬件上增强WEP的密码套件。TKIP相对WEP修改如下:

  • 发射机通过MSDU的SA、DA、MSDU Priority和MSDU plaintext data计算密钥加密消息完整性代码(MIC)。TKIP将计算出的MIC附加到MSDU数据中,然后再将其分片到MPDUs中。接收器在解密、ICV检查和将MPDU分片整理成MSDU后验证MIC,并丢弃任何接收到的具有无效MIC的MSDU。TKIP的MIC提供对伪造攻击的防御。
  • 由于TKIP MIC的设计限制,攻击者仍有可能破坏消息完整性;因此,TKIP也实施了对策。对策限制了成功伪造的可能性和攻击者可以了解的有关密钥的信息量。
  • TKIP使用按MPDU的TSC(TKIP Sequence Counter)对其发送的MPDU进行排序。接收器丢弃无序接收的MPDU,这提供了重放保护。TKIP将从发送方到接收方的TSC值编码为WEP IV和Extended IV。
  • TKIP使用Key Mixing功能将TK、TA和TSC组合到WEP Seed中。接收器从接收到的MPDU中恢复TSC,并利用Key Mixing计算正确解密MPDU所需的相同WEP Seed。Key Mixing功能旨在挫败针对WEP密钥的弱密钥攻击。

TKIP定义了额外的MIB属性;见协议附录C。


2. TKIP参数

2.1 TKIP图示概览

2.2 TKIP输入参数

  • TA (Transmitter Address)
    发送端MAC地址,长度48位。
  • TK (Temporal Key)
    临时密钥,长度应为128位。
  • TSC (TKIP Sequence Counter)
    低16位TSC0-TSC1构成IV序列号,并用于Phase 2 Key Mixing。
    高32位TSC2-TSC5构成Extended IV字段,并用于Phase 1 Key Mixing。
  • MSDU Params (MIC Processing Format)
    DA (Destination Address):目的地MAC地址。
    SA (Source Address):源MAC地址。
    Priority:MA-UNITDATA.request原语的优先级参数。
    Plaintext MSDU Data:MSDU的明文数据部分。
  • MIC Key
    MIC秘钥,长度64位。TKIP根据传输方向使用不同的MIC密钥,如12.8.1和12.8.2中所述。

2.3 TKIP输出参数

TKIP MPDU重用RSNA之前的WEP MPDU形式,区别在于:

  1. MPDU扩展了4个八位字节以适应WEP IV的扩展,即Extended IV字段;
  2. MSDU扩展了8个八位字节以适应新的MIC字段。

  • TSC1/WEPSeed[1]/TSC0
    TSC1和TSC0即TSC低16位。
    WEPSeed[1]不用于构建TSC,而是设置为(TSC1|0x20)&0x7f。
  • Rsvd
    保留。
  • ExtIV
    指示是否存在Extended IV:0不存在,1存在。
    对于TKIP,ExtIV=1,并且应提供Extended IV;对于WEP帧,ExtIV=0。
  • Key ID
    设置为MLME-SETKEYS.request原语提供的加密密钥索引。
  • Extended IV
    由TSC高32位TSC2-TSC5构成,当低16位TSC0-TSC1翻转时(0xFFFF→0x0000),高32位TSC2-TSC5加1。
  • MIC
    MIC由Micheal算法计算而来,并附加到MSDU末尾,成为新的MSDU(MSDU-with-MIC)。
    MIC是弱结构,所以需要加密传输,这使得伪造更加困难。
  • ICV
    MSDU-with-MIC可以划分为一个或多个MPDU,WEP ICV是在每个MPDU上计算的。
    MIC增加但不取代ICV,ICV有助于防止错误检测会导致调用对策的MIC故障。

3. TKIP算法

3.1 Micheal

3.1.1 输入参数

  • MIC Key: K0,K1
    MIC Key的8个八位字节序列k(0)…k(7),转换为两个32位字,K0和K1。
  • MSDU: M(0)…M(N-1)
    [1] Michael对每个MSDU进行计算,包括SA、DA、Priority和数据字段。
    [2] MSDU由八位字节m(0)…m(n-1)组成,其中n是MSDU八位字节的数量。末尾填充一个0x5a,后跟4-7个0八位字节,以便填充的MSDU的总长度是4的倍数(填充仅用于简化最后一个数据块的计算,不随MSDU一起传输)。
    [3] 填充的MSDU转换为32位字M(0)…M(N-1)的序列,其中N=(n+5)/4。

3.1.2 计算过程

MIC值由K0和K1开始迭代计算的,并为每个消息字应用块函数b。算法循环N次后,产生两个32位字l和r,进一步转换为MIC的8个八位字节的序列。协议附件J包含TKIP MIC的实现。

  • M0 = l & 0xff
  • M1 = (l/0x100) & 0xff
  • M2 = (l/0x10000) & 0xff
  • M3 = (l/0x1000000) & 0xff
  • M4 = r & 0xff
  • M5 = (r/0x100) & 0xff
  • M6 = (r/0x10000) & 0xff
  • M7 = (r/0x1000000) & 0xff

Michael块函数b是一种Feistel型结构,具有交替的加法和异或运算:

  • <<<表示左旋转运算符
  • >>>表示右旋转运算符
  • XSWAP表示交换两个最低有效八位字节位置的函数,它还使用两个最高有效八位字节的位置。

3.1.3 输出参数

输出MIC,8个八位字节的序列M0-M7。

  • MIC附加到MSDU末尾,成为新的MSDU(MSDU-with-MIC),MSDU-with-MIC可以分片为一个或多个MPDU,进行WEP加密传输。
  • 接收器重组MSDU,MAC在MSDU重组之后且传输给上层之前验证MIC,如果验证失败,则丢弃MSDU并调用反措施对策。

3.2 Phase 1 Key Mixing

3.2.1 输入参数

  • TK: TK(0)…TK(15)
    临时密钥,长度应为128位。
  • TA: TA(0)…TA(5)
    发送端MAC地址,长度48位。
  • TSC
    仅使用TSC的高32位TSC2-TSC5。

3.2.2 计算过程

  • STEP1从TSC和TA初始化TTAK。
  • STEP2使用S-box将TK迭代地混合到80位TTAK(PHASE1_LOOP_COUNT=8)。

    【注1】XOR运算、按位与(&)运算和加法(+)运算在Phase 1 Mixing中使用。
    【注2】Mk16(X,Y)=(256·X)+Y,从两个8位输入构造一个16位值。
    【注3】S-box用另一个16位值替换一个16位值,该功能可以实现为查表,Phase 1和Phase 2均使用。S-box是一种非线性替代。表查找被组织为具有65536个条目和16位索引(表的128K八位字节)的单个表或具有256个条目和8位索引(两个表的1024个八位字节)的两个表。当使用两个较小的表时,高位八位组用于从一张表中获取16位值,低位八位组用于从另一表中获取16位值,S-box输出为两个16位值的异或。第二个S-box表是第一个的八位字节交换副本。
    #define S(v16) (Sbox[0][Lo8(v16)] ^ Sbox[1][Hi8(v16)])

3.2.3 输出参数

输出TTAK:=Phase1(TK,TA,TSC),即混合发射机地址和密钥(TKIP-mixed transmitter address and key),长度80位,并由16位值的数组表示:TTAK(0) TTAK(1) TTAK(2) TTAK(3) TTAK(4)。

3.3 Phase 2 Key Mixing

3.3.1 输入参数

  • TTAK: TTAK(0)…TTAK(4)
    Phase 1的输出。
  • TK: TK(0)…TK(15)
    临时密钥,长度应为128位。
  • TSC
    仅使用TSC的低16位TSC0-TSC1。

3.3.2 计算过程

  • STEP1制作TTAK的副本并引入TSC。
  • STEP2是96位双射混合,采用S-box。
  • STEP3引入最后一个临时密钥TK位并分配24位WEP IV值。

    【注1】函数Lo8引用16位输入值的8个LSB。
    【注2】函数Hi8引用16位值的8个MSB。
    【注3】函数RotR1将其16位参数向右旋转1位。
    【注4】函数Mk16(X,Y)=(256·X)+Y定义,从两个8位输入构造一个16位输出。
    【注5】变量PPK,长度96位,表示为16位值的数组:PPK(0)…PPK(5)。
    【注6】XOR运算、加法(+)运算、AND(&)运算、OR(|)运算和右移(>>)运算用于Phase 2。

3.3.3 输出参数

输出WEP Seed,8位值的数组WEPSeed(0)…WEPSeed(15),它是pre-frame key,可以在使用前预先计算,且具有符合WEP规范的内部结构。

  • WEP Seed前24位作为WEP IV以明文形式传输,将TSC0-TSC1从发送器传送到接收器,TSC2-TSC5将在Extended IV字段中传送。
  • 接收者可以通过连接第三个(TSC0)和第一个(TSC1)八位字节,忽略第二个(WEPSeed1)八位字节来重建始发者使用的TSC的16个LSB,TSC的其余高32位TSC2-TSC5从Extended IV字段中获得。

协议附件J定义了TKIP混合函数的C语言参考实现,并为混合函数提供测试向量。


4. TKIP过程

4.1 TKIP封装

TKIP通过几个附加功能增强了WEP加密封装。

  • TKIP MIC的计算在DA、SA、Priority、Plaintext MSDU Data字段的有序串联上执行,在分片为MPDU之前将MIC附加到MSDU数据。
  • 如果需要,带有MIC的MSDU被分割成一个或多个MPDU。TKIP为每个MPDU分配一个单调递增的TSC值,从同一个MSDU生成的所有MPDU具有相同的Extened IV值,并在同一TK下加密。
  • 对于每个MPDU,TKIP使用Key Mixing算法来计算WEP Seed。可以缓存Phase 1输出的TTAK,以便与相同TK、TA相关联的后续MPDU重用。
  • TKIP将WEP Seed表示为WEP IV和ARC4密钥,并将它们与每个MPDU一起传递给WEP,以生成ICV,加密明文MPDU,包括全部或部分MIC。WEP使用WEP Seed作为WEP默认密钥,由与TK关联的密钥标识符标识。

【注】当TSC空间耗尽时,实现可用的选择是用新密钥替换临时密钥或结束通信。重用任何TSC值会危及已发送的流量。请注意,重传的MPDU会重用TSC,而不会影响安全性。然而,TSC足够大,TSC空间耗尽预计不会成为问题。

4.2 TKIP解封装

TKIP通过以下附加步骤增强了WEP解封装过程:

  • 在WEP解封装收到MPDU之前,TKIP从WEP IV和Extended IV中提取TSC和密钥标识符。TKIP丢弃收到的违反排序规则的MPDU,否则使用Key Mixing来构建WEP Seed。
  • TKIP将WEP Seed表示为WEP IV和ARC4密钥,并将这些与MPDU一起传递给WEP进行解封装。
  • 如果WEP指示ICV检查成功,则将MPDU重组为MSDU。如果MSDU碎片整理成功,则接收方验证TKIP MIC。如果MSDU碎片整理失败,则丢弃MSDU。
  • MIC验证步骤在MSDU的SA、DA、Priority和数据字段(不包括TKIP MIC字段)上重新计算MIC。然后将计算出的TKIP MIC结果与接收到的MIC按位进行比较。
  • 如果接收到的和本地计算的MIC值相同,则验证成功,TKIP应将MSDU传递给上层。如果两者不同,则验证失败,接收方应丢弃MSDU并采取适当的对策。


5. TKIP对策

5.1 概述

Michael仅针对主动攻击提供较弱的保护。当接收到的MSDU中的MIC验证失败时,表明可能存在主动攻击,TKIP应采取本节规定的对策。这些对策可实现以下目标:

  • MIC故障事件应作为与安全相关的事项进行记录。MIC故障几乎可以肯定是主动攻击的迹象,需要系统管理员进行跟进。
  • MIC故障率需要保持在每分钟2次以下。这意味着在60秒内检测到两个MIC故障事件的STA和AP需要在60秒内禁用所有使用TKIP的接收。这种放缓使得攻击者很难在短时间内进行大量的伪造尝试。
  • 作为附加的安全特性,PTK以及在身份验证器的情况下的GTK应该更改。

在验证MIC之前,接收器应检查所有相关MPDU的FCS、ICV和TSC。任何具有无效FCS、错误ICV或小于/等于TSC重放计数器的TSC值的MPDU在检查MIC之前都应被丢弃。这避免了不必要的MIC故障事件。

  • FCS和ICV检查足以检测噪声,但不足以检测主动攻击。FCS和ICV提供错误检测,但不提供完整性保护。
  • TSC检查会使基于对策的拒绝服务攻击更难执行。

应使用单个计数器或计时器来记录MIC故障事件。这些故障事件定义如下:

  • 在认证者中:
    [1] 在接收到的单独寻址帧上检测到MIC故障。
    [2] 收到Michael MIC Failure Report帧。
  • 在请求者中:
    [1] 在接收到的单独寻址或组寻址帧上检测到MIC故障。
    [2] 尝试发送Michael MIC Failure Report帧。

MIC失败的次数与特定的密钥上下文无关。任何单个MIC故障,无论是由请求方或认证方检测到的,还是由组MIC密钥故障或成对MIC密钥故障引起的,均应视为MIC故障事件的原因。

请求方使用单个Michael MIC Failure Report帧向认证方报告MIC故障事件。Michael MIC Failure Report是一个EAPOL-Key帧,其中以下Key Information字段位设置为1:MIC位、Error位、Request位、Secure位。请求方用当前的PTK保护这个消息;请求方使用PTK的KCK部分来计算IEEE 802.1X EAPOL MIC。

MLME-MICHAELMICFAILURE.indication原语由IEEE 802.11 MAC用来尝试向本地IEEE 802.1X请求方或认证方指示MIC故障。请求方使用MLME-EAPOL.request原语发送包含Michael MIC Failure report的EAPOL-Key帧。MLME-EAPOL.confirm原语向请求方指示EAPOL-Key帧何时被发送。

应记录第一个MIC故障,并启动计时器以启用对策。如果请求方检测到MIC故障事件,它也应通过发送Michael MIC Failure report帧向AP报告该事件。

如果随后的MIC故障发生在最近一次故障的60s内,则其IEEE 802.1X实体充当请求方的STA应取消认证(如11.3.4.4中定义),或取消认证所有具有安全关联STA(如果其 IEEE 802.1X 实体充当身份验证器)。在IBSS STA中,请求方和认证方都应采取行动。此外,设备不得接收或传输任何TKIP加密的数据帧,也不得在检测到802.1X消息之外的任何对等方接收或传输任何未加密的数据帧,至少60秒第二次失败。如果设备是AP,则在这60s期间,它应禁止使用TKIP的新关联;在60s周期结束时,AP将恢复正常操作并允许STA(重新)关联。如果该设备是一个IBSS STA,则在这60秒期间,它应禁止任何使用TKIP的新安全关联。如果设备是请求方,它应在撤销其PTKSA和取消身份验证之前首先发送Michael MIC Failure report帧。aMICFailTime属性应包含记录MIC故障时的sysUpTime值。
【注】PTKSA,pairwise transient key security association,成对瞬态密钥安全关联:由对等方和身份验证器之间成功的4次握手或成功的快速初始链路设置(FILS)身份验证产生的上下文。

5.2 认证者的TKIP对策

认证方使用的对策如图12-12所示,描述如下:

  • 在认证方的STA中,接收到一个MIC错误的帧,
    [1] 丢弃帧。
    [2] 增加MIC故障计数器dot11RSNAStatsTKIPLocalMICFailures。
    [3] 生成一个MLME-MICHAELMICFAILURE.indication原语。
  • 在收到MLME-MICHAELMICFAILURE.indication原语或Michael MIC Failure report帧的认证者中,
    [1] 如果是Michael MIC Failure report帧,则增加dot11RSNAStatsTKIP-RemoteMICFailures。
    [2] 如果这是过去60秒内的第一次MIC故障,则初始化对策计时器。
    [3] 如果自最近一次MIC故障以来已经过去了不到60秒,则认证器应取消认证并删除所有使用TKIP的STA的所有PTKSA。如果当前的GTKSA使用TKIP,则该GTKSA将被丢弃,并构建一个新的GTKSA,但在60秒内不使用。认证者应在60秒内拒绝使用TKIP作为一种或多种密码构建新的PTKSA。在此时间段结束时,MIC故障计数器和计时器将被重置,并照常接受PTKSA的创建。
    [4] 如果认证器正在使用IEEE 802.1X认证,认证器应将IEEE 802.1X认证器状态机的状态转换为INITIALIZE状态。这将重新启动IEEE 802.1X状态机。如果Authenticator使用PSK,则省略此步骤。

请注意,如果请求方的STA是ESS STA,它可能会使用MIC_FAILURE的原因代码取消身份验证。身份验证器不应将取消身份验证记录为MIC故障事件,以防止通过取消身份验证进行拒绝服务攻击。请求方的STA通过Michael MIC Failure report帧上报MIC故障事件,以便AP可以记录该事件。

如果使用TKIP作为组密码,则使用TKIP取消验证所有STA的要求包括使用其他成对密码的那些。

5.3 请求者的TKIP对策

请求方使用的对策如图12-13所示,描述如下:

  • 在收到一个MIC错误帧的请求者的STA中,
    [1] 增加MIC故障计数器dot11RSNAStatsTKIPLocalMICFailures。
    [2] 丢弃违规帧。
    [3] 生成一个MLME-MICHAELMICFAILURE.indication原语。
  • 在从其STA接收到MLME-MICHAELMICFAILURE.indication原语的请求方中,
    [1] 向AP发送Michael MIC Failure report帧。
    [2] 如果这是过去60秒内的第一次MIC故障,则初始化对策计时器。
    [3] 如果距离最近一次MIC故障的时间不到60s,则删除PTKSA和GTKSA。从AP取消身份验证并等待60秒,然后(重新)建立与同一AP的TKIP关联。TKIP关联是将TKIP用于其成对或组密码套件的任何IEEE 802.11关联。
  • 如果STA接收到原因码为MIC_FAILURE的解除认证帧,则无法验证该帧未被伪造,因为该帧不包含MIC。STA可以尝试与这个或另一个AP关联。如果该帧是真实的,那么尝试与请求使用TKIP的同一个AP关联的尝试很可能会失败,因为该AP正在采取对策。

6. TKIP重放保护

TKIP应使用TSC字段通过以下规则来防御重放攻击:

  • 每个MPDU应具有唯一的TKIP TSC值。
  • 发送器应为每个PTKSA和GTKSA维护一个单独的TSC(48位计数器)。
  • TSC应实现为48位严格递增计数器,当相应的TKIP临时密钥被初始化或刷新时初始化为1。
  • WEP IV格式携带48位TSC的16个LSB,TSC的其余部分在Extended IV字段中携带。
  • 接收器应为每个PTKSA和GTKSA维护一组单独的TKIP TSC重放计数器。
  • TKIP重放检测发生在MIC验证和ack处理所需的任何重新排序之后。因此,接收器应延迟推进TKIP TSC重放计数器,直到MSDU通过MIC检查,以防止攻击者注入具有有效ICV和TSC但无效MIC的MPDU。
    【注】这是有效的,因为如果攻击者修改了TSC,那么加密密钥就会被修改,因此ICV和MIC都将错误地解密,从而导致接收到的MPDU被丢弃。
  • 对于每个PTKSA和GTKSA,接收器应为每个帧优先级维护一个单独的重放计数器,并应使用接收帧中的TSC来检测重放帧,受支持的重放计数器数量的限制,在RSN Capabilities中指示,如9.4.2.24中所述。当接收到的帧中的TSC小于或等于帧优先级的当前重播计数器值时,就会发生重播帧。在不确保接收器支持所需数量的重放计数器的情况下,发送器不应重新排序具有不同优先级的TKIP保护帧。发送器不应在重放计数器内重新排序TKIP保护帧,但可以跨重放计数器重新排序TKIP保护帧。重新排序帧的一种可能原因是IEEE 802.11 MSDU优先级。
  • 接收方应丢弃任何无序接收的MPDU,并应为该密钥增加dot11RSNAStatsTKIPReplays。
  • 对于使用块确认功能发送的MSDU,在重放检测之前根据块确认接收器操作对接收到的MSDU进行重新排序。

802.11-2020协议学习__$12-Security__$12.5.2-TKIP__2相关推荐

  1. 802.11网络协议细节(五)

    3.5.3   省电程序 在RF系统中,放大器是最耗电的元件,由它负责将发送出的信号放大,以及将所收到的信号放大到可处理的水平.802.11工作站可以关闭无线电波收发器,并且定期进入休眠状态,以维持最 ...

  2. ESP8266开发之旅 进阶篇⑨ 深入了解 802.11 无线协议(非常重要)

    文章目录 1. 前言 2. WLAN拓扑结构 2.1 IBSS -- 无AP 2.2 BSS -- 有AP 2.3 ESS -- 有AP 和 DS 3. 802.11 协议 3.1 802.11 帧 ...

  3. 802.11无线权威指南读书笔记(12)直接序列物理层DSSS与HR/DSSS(802.11b)

    802.11的第二章物理层规范是直接序列扩频(direct sequence spread spectrum,简称DSSS) DS PHY采用差分相移键控(differential phase shi ...

  4. 蓝牙(Bluetooth) IEEE 802.15.1 协议学习

    catalogue 1. 蓝牙概念 2. 配对和连接 3. 机密安全性 4. 蓝牙协议分类 5. 蓝牙协议栈 1. 蓝牙概念 蓝牙(Bluetooth)是一种无线技术标准,可实现固定设备.移动设备和楼 ...

  5. 802.11协议精读9:初探节能模式(PS mode)与缓存机制

    https://zhuanlan.zhihu.com/p/21505178 序言 由于802.11的协议工作机制,如果其一直处于工作状态下,那么能耗还是比较大的,尤其移动设备的电量有限,所以在802. ...

  6. 802.11协议基础

    1. 802.11管理功能–用户接入过程 STA (工作站)启动初始化.开始正式使用.AP 传送数据幀之前,要经过三个阶段才能接入: (1) 扫描(SCAN)        (2) 认证(Authen ...

  7. 802.11协议标准介绍

    802.11协议标准介绍 802.11协议简介 802.11协议标准在802家族中的角色位置如图1所示,包含物理层和数据链路层. 图1 802.11协议标准在802家族中的角色位置 物理层 802.1 ...

  8. 关于 802.11 协议

    目录 一.802.11成帧封装实现    3 1.1控制帧    3 1.1.1 一般的帧控制位    3 1.1.2   RTS(请求发送)    4 1.1.3   CTS (允许发送)    5 ...

  9. 802.11协议之BA/BAR帧

    802.11n最主要的添加了Block Ack这个技术,但是在实际应用中对于BA还是知之甚少,转贴一个讲述BA基本原理的文章,但是我通过wireshark进行抓报并没有在BAR(Block Ack R ...

  10. 802.11 协议介绍

    802.11协议基础 前言-OSI七层网络 开放式系统互联模型(Open System Interconnection Model)是一种概念模型,由国际标准化组织提出,一个试图使各种计算机在世界范围 ...

最新文章

  1. 点到线段的距离计算方法
  2. UA MATH636 信息论6 微分熵
  3. python里graphics的使用_使用graphics.py实现2048小游戏
  4. openwrt多wan限上下行速脚本,基于qosv4,imq模块替换成ifb模块[ZT]
  5. JVM工作原理和特点
  6. php 使用PDO,防止sql注入 简单说明
  7. perl 远程 mysql_写的一个perl脚本,用于发送远程MySQL命令 -电脑资料
  8. jstl处理栏目与子栏目_深圳北易:网站SEO优化如何提高网站栏目页排名
  9. 基础知识学习-数据结构篇
  10. 我的第二个开源库SuperTextView——中文文档
  11. 简单应用定时器和监听器
  12. html加载富文本_富文本图片懒加载解决方案
  13. PuTTYgen使用教程
  14. java加按钮_剪辑大神都在用的加字幕神器,你知道嘛!
  15. Altas 200 DK环境配置
  16. 服务器信息未初始化失败怎么办,初始化服务器失败
  17. 中兴软创的外包-北京之行
  18. 面孔“暴露”在外 人脸识别风险谁来“买单”?
  19. Imagination在GDC 2022上推出下一代移动游戏解决方案
  20. Hive中的Distribute by 搭配sort by

热门文章

  1. Shifterator库 | 词移图分辨两文本用词风格差异
  2. es 中 mapping 简介
  3. Spring bean的生命周期
  4. 计算机网络2021题库
  5. 大三学生前端实习经验分享
  6. chimera添加氨基序列
  7. 微信投票小程序怎么弄(微信活动投票小程序制作方法)
  8. *Php消息队列实现
  9. 软件测试工程师思维逻辑题汇总
  10. conda安装requirement.txt指定的依赖包