首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

14、HDFS 透明加密KMSHadoop系列文章目录一、介绍二、部署及使用

  • 23-09-04 16:01
  • 2550
  • 5956
blog.csdn.net

Hadoop系列文章目录

1、hadoop3.1.4简单介绍及部署、简单验证
2、HDFS操作 - shell客户端
3、HDFS的使用(读写、上传、下载、遍历、查找文件、整个目录拷贝、只拷贝文件、列出文件夹下文件、删除文件及目录、获取文件及文件夹属性等)-java
4、HDFS-java操作类HDFSUtil及junit测试(HDFS的常见操作以及HA环境的配置)
5、HDFS API的RESTful风格–WebHDFS
6、HDFS的HttpFS-代理服务
7、大数据中常见的文件存储格式以及hadoop中支持的压缩算法
8、HDFS内存存储策略支持和“冷热温”存储
9、hadoop高可用HA集群部署及三种方式验证
10、HDFS小文件解决方案–Archive
11、hadoop环境下的Sequence File的读写与合并
12、HDFS Trash垃圾桶回收介绍与示例
13、HDFS Snapshot快照
14、HDFS 透明加密KMS
15、MapReduce介绍及wordcount
16、MapReduce的基本用法示例-自定义序列化、排序、分区、分组和topN
17、MapReduce的分区Partition介绍
18、MapReduce的计数器与通过MapReduce读取/写入数据库示例
19、Join操作map side join 和 reduce side join
20、MapReduce 工作流介绍
21、MapReduce读写SequenceFile、MapFile、ORCFile和ParquetFile文件
22、MapReduce使用Gzip压缩、Snappy压缩和Lzo压缩算法写文件和读取相应的文件
23、hadoop集群中yarn运行mapreduce的内存、CPU分配调度计算与优化


文章目录

  • Hadoop系列文章目录
  • 一、介绍
    • 1、HDFS明文存储弊端
    • 2、HDFS透明加密
      • 1)、介绍
      • 2)、特点
    • 3、HDFS透明加密关键概念
      • 1)、加密区域
      • 2)、密钥
      • 3)、密钥库(keystore)
      • 4)、KMS(密钥管理服务)
      • 5)、写入加密文件过程
      • 6)、读取解密文件过程
  • 二、部署及使用
    • 1、关闭HDFS集群
    • 2、keystore密钥库
    • 3、配置kms-site.xml
    • 4、kms-env.sh
    • 5、修改core|hdfs-site.xml
    • 6、kms服务及集群启动
    • 7、透明加密使用
      • 1)、创建key
      • 2)、创建加密区
      • 3)、测试加密效果


本文旨在简单介绍hdfs的透明加密作用及其使用。
前提依赖:hadoop环境部署好且可用。部署文章可参考本专栏相关文章。
本文分为2部分,即介绍和部署及使用。

一、介绍

1、HDFS明文存储弊端

HDFS中的数据会以block的形式保存在各台数据节点的本地磁盘中,但这些block都是明文的。
通过Web UI页面找到Block的ID和副本位于的机器信息
如果在操作系统中直接访问block所在的目录,通过Linux的cat命令是可以直接查看里面的内容的,且是明文。
在这里插入图片描述

在datanode找到其文件为:
/usr/local/bigdata/hdfsdata/dfs/data/current/BP-285668707-192.168.10.41-1662533817886/current/finalized/subdir0/subdir0/blk_1073741834
[alanchan@server2 subdir0]$ pwd
/usr/local/bigdata/hdfsdata/dfs/data/current/BP-285668707-192.168.10.41-1662533817886/current/finalized/subdir0/subdir0
[alanchan@server2 subdir0]$ cat blk_1073741834
11
[alanchan@server2 subdir0]$ 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2、HDFS透明加密

1)、介绍

HDFS透明加密(Transparent Encryption)支持端到端的透明加密,启用以后,对于一些需要加密的HDFS目录里的文件可以实现透明的加密和解密,而不需要修改用户的业务代码。端到端是指加密和解密只能通过客户端。
对于加密区域里的文件,HDFS保存的即是加密后的文件,文件加密的秘钥也是加密的。让非法用户即使从操作系统层面拷走文件,也是密文

2)、特点

  • HDFS集群管理和密钥的管理是互相独立的职责,由不同的用户角色(HDFS管理员,密钥管理员)承担
  • 只有HDFS客户端可以加密或解密数据,密钥管理在HDFS外部,HDFS无法访问未加密的数据或加密密钥
  • block在操作系统是以加密的形式存储的,从而减轻了操作系统和文件系统级别的安全威胁
  • HDFS使用AES-CTR(支持128位加密密钥(默认))加密算法

3、HDFS透明加密关键概念

1)、加密区域

  • HDFS的透明加密有一个新的概念,加密区域(the encryption zone)
  • 加密区域就是HDFS上的一个目录
  • 加密区域里写入文件的时候会被透明加密,读取文件的时候又会被透明解密

2)、密钥

  • 当加密区域被创建时,都会有一个加密区域密钥(EZ密钥,encryption zone key)与之对应,EZ密钥存储在HDFS外部的密钥库中
  • 加密区域里的每个文件都有其自己加密密钥,叫做数据加密密钥(DEK,data encryption key)
  • DEK会使用其各自的加密区域的EZ密钥进行加密,以形成加密数据加密密钥(EDEK)
    在这里插入图片描述

3)、密钥库(keystore)

存储密钥(key)的叫做密钥库(keystore),将HDFS与外部企业级密钥库(keystore)集成是部署透明加密的第一步。这是因为密钥(key)管理员和HDFS管理员之间的职责分离是此功能的非常重要的。但是,大多数密钥库都不是为Hadoop工作负载所见的加密/解密请求速率而设计的。

4)、KMS(密钥管理服务)

Hadoop密钥管理服务(Key Management Server,简写KMS),用作HDFS客户端与密钥库之间的代理。KMS主要有以下几个职责:

  • 访问加密区域秘钥(EZ key)
  • 生成EDEK,EDEK存储在NameNode上
  • 为HDFS客户端解密EDEK

5)、写入加密文件过程

提前:创建加密区,设置加密区密钥
1、Client向NameNode请求在HDFS某个加密区新建文件
2、NameNode从缓存中取出一个新的EDEK(后台不断从KMS拉取新的EDEK到缓存中)
3、获取到EDEK会被NameNode保存到文件的元数据中
4、然后NameNode将EDEK发送给Client
5、Client发送EDEK给KMS,KMS用对应的EZ key将EDEK解密出DEK发送给Client
6、Client用DEK加密文件内容发送给datanode进行存储

DEK是加解密一个文件的密钥,而KMS里存储的EZ key是用来加解密所有文件的密匙(DEK)的密匙。
所以,EZ Key是更为重要的数据,只在KMS内部使用(DEK的加解密只在KMS内存进行),不会被传递到外面使用;而HDFS服务端只能接触到EDEK。
在这里插入图片描述

6)、读取解密文件过程

  • 读流程与写流程类型,区别就是NameNode直接读取加密文件元数据里的EDEK返回给客户端,客户端一样把EDEK发送给KMS获取DEK。再对加密内容解密读取。
  • EDEK的加密和解密完全在KMS上进行。请求创建或解密EDEK的客户端永远不会处理EZ密钥。仅KMS可以根据要求使用EZ密钥创建和解密EDEK。

二、部署及使用

1、关闭HDFS集群

在server1上执行stop-dfs.sh

2、keystore密钥库

  • 存储密钥(key)的地方叫做密钥库(keystore)。
  • HDFS与keystore是互相独立的,两者之间通过KMS进行沟通。
  • KMS可以选择任何KeyProvider(密钥供应者)实现作为keystore 。
    此处的示例使用JavaKeyStoreProvider来作为keystore。
# https://hadoop.apache.org/docs/r3.1.4/hadoop-project-dist/hadoop-common/CredentialProviderAPI.html#Keystore_Passwords

keytool -genkey  -alias 'hdfs_keystore'
#密钥库的名字叫做hdfs,访问密钥库的密码是:123456
[alanchan@server1 ~]$ keytool -genkey  -alias 'hdfs_keystore'
输入密钥库口令:  
再次输入新口令: 
您的名字与姓氏是什么?
  [Unknown]:  
您的组织单位名称是什么?
  [Unknown]:  
您的组织名称是什么?
  [Unknown]:  
您所在的城市或区域名称是什么?
  [Unknown]:  
您所在的省/市/自治区名称是什么?
  [Unknown]:  
该单位的双字母国家/地区代码是什么?
  [Unknown]:  
CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown是否正确?
  [否]:  y

输入 <hdfs_keystore> 的密钥口令
        (如果和密钥库口令相同, 按回车):  
[alanchan@server1 ~]$ ll -a
...
-rw-r--r--  1 alanchan root  1303 9月  13 13:39 .keystore
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

3、配置kms-site.xml

hadoop.kms.key.provider.uri 设置密钥库的提供者 这里设置jceks,表示就是java密钥库

<configuration>
	<property>
		<name>hadoop.kms.key.provider.uri</name>
		<value>jceks://file@/${user.home}/kms.jks</value>
	</property>
	<property>
		<name>hadoop.security.keystore.java-keystore-provider.password-file</name>
		<value>kms.keystore.password</value>
	</property>
	<property>
		 <name>dfs.encryption.key.provider.uri</name>
		 <value>kms://http@server1:16000/kms</value>
	</property>
	<property>
		<name>hadoop.kms.authentication.type</name>
		<value>simple</value>
	</property>
</configuration>

#KMS访问java密钥库的密码文件kms.keystore.password需配置在Hadoop的配置目录下。不知道此步骤的具体作用
[alanchan@server1 hadoop]$ pwd
/usr/local/bigdata/hadoop-3.1.4/etc/hadoop
[alanchan@server1 hadoop]$ cat kms.keystore.password 
123456
[alanchan@server1 hadoop]$ 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

4、kms-env.sh

export KMS_HOME=/usr/local/bigdata/hadoop-3.1.4
export KMS_LOG=${KMS_HOME}/logs/kms
export KMS_HTTP_PORT=16000
export KMS_ADMIN_PORT=16001
  • 1
  • 2
  • 3
  • 4

5、修改core|hdfs-site.xml

#在core|hdfs-site.xml增加下面jms配置
 <property>
		<name>hadoop.security.key.provider.path</name>
		<value>kms://http@server1:16000/kms</value>
</property>
#在server1上讲下面四个配置文件复制到server2、server3、server4

scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml server2:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml
scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml server3:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml
scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml server4:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml

scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml server2:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml
scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml server3:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml
scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml server4:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml

scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml server2:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml
scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml server3:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml
scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml server4:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml

scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh server2:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh
scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh server3:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh
scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh server4:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh

[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml server2:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml
hdfs-site.xml                                                                                                                                                                                                                                       100% 4120     4.0KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml server3:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml
hdfs-site.xml                                                                                                                                                                                                                                       100% 4120     4.0KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml server4:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml
hdfs-site.xml                                                                                                                                                                                                                                       100% 4120     4.0KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml server2:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml
core-site.xml                                                                                                                                                                                                                                       100% 2314     2.3KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml server3:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml
core-site.xml                                                                                                                                                                                                                                       100% 2314     2.3KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml server4:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml
core-site.xml                                                                                                                                                                                                                                       100% 2314     2.3KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml server2:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml
kms-site.xml                                                                                                                                                                                                                                        100% 1157     1.1KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml server3:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml
kms-site.xml                                                                                                                                                                                                                                        100% 1157     1.1KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml server4:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml
kms-site.xml                                                                                                                                                                                                                                        100% 1157     1.1KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh server2:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh
kms-env.sh                                                                                                                                                                                                                                          100% 1491     1.5KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh server3:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh
kms-env.sh                                                                                                                                                                                                                                          100% 1491     1.5KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh server4:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh
kms-env.sh                                                                                                                                                                                                                                          100% 1491     1.5KB/s   00:00    
[alanchan@server1 ~]$ 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

6、kms服务及集群启动

#关闭dfs
stop-dfs.sh
#启动dfs
start-dfs.sh

[alanchan@server1 ~]$ hadoop --daemon start kms
WARNING: KMS_LOG has been replaced by HADOOP_LOG_DIR. Using value of KMS_LOG.
WARNING: /usr/local/bigdata/hadoop-3.1.4/temp does not exist. Creating.
WARNING: /usr/local/bigdata/hadoop-3.1.4/logs/kms does not exist. Creating.
[alanchan@server1 ~]$ jps
13008 DFSZKFailoverController
15953 Jps
15154 QuorumPeerMain
15687 KMSWebServer
12189 NameNode
28893 ResourceManager
[alanchan@server1 ~]$ 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

7、透明加密使用

1)、创建key

hadoop key create ezk
hadoop key list -metadata

[alanchan@server1 ~]$ hadoop key list -metadata
Listing keys for KeyProvider: org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider@1ebd319f
[alanchan@server1 ~]$ hadoop key create test_ezk
test_ezk has been successfully created with options Options{cipher='AES/CTR/NoPadding', bitLength=128, description='null', attributes=null}.
org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider@55b53d44 has been updated.
[alanchan@server1 ~]$ hadoop key list -metadata
Listing keys for KeyProvider: org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider@1ebd319f
test_ezk : cipher: AES/CTR/NoPadding, length: 128, description: null, created: Tue Sep 13 14:10:45 CST 2022, version: 1, attributes: [key.acl.name=test_ezk] 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2)、创建加密区

首先创建一个目录,然后把该目录设置为加密区(在HDFS集群中任何一台机器上执行都可以)

[alanchan@server4 ~]$ hadoop fs -ls /
Found 9 items
drwxr-xr-x   - alanchan supergroup          0 2022-09-09 02:24 /dest
drwxr-xr-x   - alanchan supergroup          0 2022-09-13 01:25 /test
drwxr-xr-x   - alanchan supergroup          0 2022-09-13 03:07 /testacl

[alanchan@server4 ~]$ hadoop fs -mkdir /zone
[alanchan@server4 ~]$ hadoop fs -ls /
Found 10 items
drwxr-xr-x   - alanchan supergroup          0 2022-09-09 02:24 /dest
drwxr-xr-x   - alanchan supergroup          0 2022-09-13 01:25 /test
drwxr-xr-x   - alanchan supergroup          0 2022-09-13 03:07 /testacl
drwxr-xr-x   - alanchan supergroup          0 2022-09-13 06:16 /zone
[alanchan@server4 ~]$ hdfs crypto -createZone -keyName test_ezk -path /zone
Added encryption zone /zone
[alanchan@server4 ~]$ 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

3)、测试加密效果

上传文件到加密区,然后读取文件内容

[alanchan@server1 hadoop-3.1.4]$ hadoop fs -put 1.txt /zone
[alanchan@server1 hadoop-3.1.4]$ hadoop fs -ls /zone
Found 2 items
drwxrwxrwt   - alanchan supergroup          0 2022-09-13 14:18 /zone/.Trash
-rw-r--r--   3 alanchan supergroup          6 2022-09-13 14:21 /zone/1.txt
[alanchan@server1 hadoop-3.1.4]$ hadoop fs -cat /zone/1.txt
12345
[alanchan@server1 hadoop-3.1.4]$
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

获取文件加密信息

hdfs crypto -getFileEncryptionInfo -path /zone/1.txt

[alanchan@server1 hadoop-3.1.4]$ hdfs crypto -getFileEncryptionInfo -path /zone/1.txt
{cipherSuite: {name: AES/CTR/NoPadding, algorithmBlockSize: 16}, cryptoProtocolVersion: CryptoProtocolVersion{description='Encryption zones', version=2, unknownValue=null}, edek: 42b1e5b3176501141b4ed7da03fdd394, iv: b0d129f9bedc1e6e95dd3f6a0f5d4226, keyName: test_ezk, ezKeyVersionName: test_ezk@0}
[alanchan@server1 hadoop-3.1.4]$ 
  • 1
  • 2
  • 3
  • 4
  • 5

切换不同用户进行文件读取操作只要具备read权限都可以读取文件的内容

[root@server1 hadoop-3.1.4]# hadoop fs -cat /zone/1.txt
12345
  • 1
  • 2

也就是对客户端来说是透明的,感觉不到文件被加密。
如果直接从DataNode的机器的本地文件系统读取Block信息。发现是无法读取数据的。
因为在存储数据的时候被加密了

[alanchan@server2 subdir0]$ pwd
/usr/local/bigdata/hdfsdata/dfs/data/current/BP-285668707-192.168.10.41-1662533817886/current/finalized/subdir0/subdir0
[alanchan@server2 subdir0]$ cat blk_1073741896
�D�R�I
[alanchan@server2 subdir0]$ 
  • 1
  • 2
  • 3
  • 4
  • 5

下载到本地打开文件,已经加密了
在这里插入图片描述

文章知识点与官方知识档案匹配,可进一步学习相关知识
云原生入门技能树首页概览14749 人正在系统学习中
注:本文转载自blog.csdn.net的一瓢一瓢的饮 alanchan的文章"https://blog.csdn.net/chenwewi520feng/article/details/130429278"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top