Linux进阶_加密和安全
本意内容
- 关于加密与安全
- 加密算法
- 对称加密算法
- 非对称加密算法
- 单向散列
- 密钥交换:
- DH
- gpg
- 实验:使用gpg工具实现公钥加密
- CA和证书
- 证书获取
- 实验:创建私有CA和颁发证书
- 查看证书
- 吊销证书
- SSL/TLS
- AIDE
- 实验:AIDE实例
- sudo
- sudoers
- sudoers示例:
- TCP_Wrappers介绍
- Openssl
- PAM认证机制
关于加密与安全
信息安全防护的目标
1. 保密性 Confidentiality
2. 完整性 Integrity
3. 可用性 Usability
4. 可控制性 Controlability
5. 不可否认性 Non-repudiation安全防护环节
1. 物理安全:各种设备/主机、机房环境
2. 系统安全:主机或设备的操作系统
3. 应用安全:各种网络服务、应用程序
4. 网络安全:对网络访问的控制、防火墙规则
5. 数据安全:信息的备份与恢复、加密解密
6. 管理安全:各种保障性的规范、流程、方法安全攻击: STRIDE
1. Spoofing 假冒
2. Tampering 篡改
3. Repudiation 否认
4. Information Disclosure 信息泄漏
5. Denial of Service 拒绝服务
6. Elevation of Privilege 提升权限安全设计基本原则
1. 使用成熟的安全系统
2. 以小人之心度输入数据
3. 外部系统是不安全的
4. 最小授权
5. 减少外部接口
6. 缺省使用安全模式
7. 安全不是似是而非
8. 从STRIDE思考
9. 在入口处检查
10. 从管理上保护好你的系统常用安全技术
1. 认证
2. 授权
3. 审计
4. 安全通信加密算法和协议
1. 对称加密
2. 公钥加密
3. 单向加密
4. 认证协议
加密算法
对称加密算法
- 对称加密类型:加密和解密使用同一个密钥
(1)DES:Data Encryption Standard,56bits
(2)3DES:Triple DES
(3)AES:Advanced (128, 192, 256bits)
(4)Blowfish,Twofish
(5)IDEA,RC6,CAST5 - 特性:
(1)加密、解密使用同一个密钥,效率高
(2)将原始数据分割成固定大小的块,逐个进行加密 - 缺陷:
(1)密钥过多
(2)密钥分发
(3)数据来源无法确认
非对称加密算法
公钥加密:密钥是成对出现
公钥:公开给所有人;public key
私钥:自己留存,必须保证其私密性;secret key特点:用公钥加密数据,只能使用与之配对的私钥解密;反之亦然
功能:
(1)数字签名:主要在于让接收方确认发送方身份
(2)对称密钥交换:发送方用对方的公钥加密一个对称密钥后发送给对方
(3)数据加密:适合加密较小数据缺点:密钥长,加密解密效率低下
算法:
RSA(加密,数字签名)
DSA(数字签名)
ELGamal非对称加密
RSA
RSA:公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的,RSA取名来自开发他们三者的名字,后成立RSA数据安全有限公司。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥
- DSA
DSA (Digital Signature Algorithm):1991年7月26日提交,并归属于David W. Kravitz前NSA员工,DSA是Schnorr和ElGamal签名算法的变种,被美国NIST作为SS(DigitalSignature Standard), DSA是基于整数有限域离散对数难题的,其安全性与RSA相比差不多。DSA只是一种算法,和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交换,只用于签名,它比RSA要快很多
单向散列
将任意数据缩小成固定大小的“指纹”
(1)任意长度输入
(2)固定长度输出
(3)若修改数据,指纹也会改变(“不会产生冲突”)
(4)无法从指纹中重新生成数据(“单向”)功能:数据完整性
常见算法
(1)md5: 128bits
(2)sha1: 160bits
(3)sha224 、sha256
(4)sha384、sha512常用工具
(1)md5sum | sha1sum [ --check ] file
(2)openssl、gpg
(3)rpm -V数字签名
常用组合(对称+非对称+数字签名)
A–>B
A: key(data+Sa[hash(data)])+Pb(key)应用程序RPM:文件完整性的两种实施方式
MD5单向散列:rpm --verify package_name (or -V)
发行的软件包文件:GPG公钥签名
1.rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat*
2.rpm --checksig pakage_file_name (or -K)
密钥交换:
IKE( Internet Key Exchange )
DH
DH (Deffie-Hellman):生成会话密钥,由惠特菲尔德·迪菲(Bailey Whitfield Diffie)和马丁·赫尔曼(Martin Edward Hellman)在1976年发表
参看:https://en.wikipedia.org/wiki/Diffie–Hellman_key_exchange
- DH原理:
1. A: g,p 协商生成公开的整数g, 大素数p
B: g,p
2. A:生成隐私数据:a ,计算得出 gamodpg^a\ mod\ pga mod p,发送给B
B:生成隐私数据:b,计算得出 gbmodpg^b\ mod\ pgb mod p,发送给A
3. A:计算得出:[(gbmodp)a]modp=gbamodp[(g^b\ mod\ p)^a]\ mod\ p = g^{ba}\ mod\ p[(gb mod p)a] mod p=gba mod p,生成为密钥
B:计算得出:[(gamodp)b]modp=gabmodp[(g^a\ mod\ p)^b]\ mod\ p = g^{ab}\ mod\ p[(ga mod p)b] mod p=gab mod p,生成为密钥
gpg
- 使用gpg实现对称加密
+ 对称加密file文件
gpg -c file
ls file.gpg
+ 在另一台主机上解密file
gpg -o file -d file.gpg
实验:使用gpg工具实现公钥加密
公钥和私钥是一对,公钥就好比是一把“锁”,私钥就是开锁的“钥匙”(也可以反过来,公钥是钥匙,私钥是锁)一锁对应一钥匙。钥匙是不能随便给别人的,只能自己保管。锁可以给需要加密数据给你的人。想要给你发数据,就得用你的锁所数据加密,然后用自己的钥匙解开。要给别人发数据,得用别人的锁加密,别人用他自己的钥匙解密。
实验:在hostB主机上用公钥加密,在hostA主机上解密。
hostA
- 安装rng-tools
yum install rng-tools
systemctl restart rngd
- 在hostA主机上生成公钥+私钥对
gpg --gen-key
- 在hostA主机上查看公钥
gpg --list-keys
- 在hostA主机上导出公钥到wang.pubkey
gpg -a --export -o wang.pubkey
- 从hostA主机上复制公钥文件到需加密的B主机上
scp wang.pubkey root@192.168.88.66:/root
hostB
- 同样安装rng-tools
yum install rng-tools
systemctl restart rngd
- 在需加密数据的hostB主机上生成公钥+私钥对
gpg --gen-key
- 在hostB主机上导入hostA的公钥
gpg --import wang.pubkey
gpg --list-keys
查看是否导入成功 - 用从hostA主机导入的公钥,加密hostB主机的文件file,生成file.gpg
gpg -e -r wangxiaochun file
(-r指定uid名)
file file.gpg
- 复制加密文件到hostA主机
scp fstab.gpg hostA:
hostA
- 在hostA主机解密文件
gpg -d file.gpg
或gpg -o file -d file.gpg
- 删除公钥和私钥
gpg --delete-keys wangxiaochun
gpg --delete-secret-keys wangxiaochun
这种加密方式存在风险:中间人攻击。
- 中间人攻击
CA和证书
这篇文章前部分讲解的CA证书挺通俗易懂的:
https://www.cnblogs.com/handsomeBoys/p/6556336.html
- 证书=公钥+申请者与颁发者信息+签名
- PKI:Public Key Infrastructure
1. 签证机构:CA(Certificate Authority)
2. 注册机构:RA
3. 证书吊销列表:CRL
4. 证书存取库:CAL - X.509:定义了证书的结构以及认证协议标准
版本号、序列号、签名算法、颁发者、有效期限、主体名称、主体公钥、CRL分发点、扩展信息、发行者签名
证书获取
- 证书类型:
1. 证书授权机构的证书
2. 服务器
3. 用户证书 - 获取证书两种方法:
1. 使用证书授权机构
(1) 生成证书请求(*.csr)
(2) 将证书请求csr发送给CA
(3) CA签名颁发证书
2. 自签名的证书:自已签发自己的公钥
实验:创建私有CA和颁发证书
(1)建立私有CA(OpenCA 或 openssl)
(2)申请证书
(3)颁发证书
证书申请及签署步骤:
1、生成申请请求
2、RA核验
3、CA签署
4、获取证书创建私有CA配置文件:
1. openssl的配置文件:/etc/pki/tls/openssl.cnf
2. 三种策略:match匹配
、optional可选
、supplied提供
match:要求申请填写的信息跟CA设置信息必须一致
optional:可有可无,跟CA设置信息可不一致
supplied:必须填写这项申请信息,
host A
- 生成私钥
(umask 066; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
- 生成自签名证书
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650 << EOF
CN
beijing
beijing
wang
devops
ca.wang.com
admin@wang.com
EOF#选项说明:
-new:生成新证书签署请求
-x509:专用于CA生成自签证书
-key:生成请求时用到的私钥文件
-days n:证书的有效期限
-out /PATH/TO/SOMECERTFILE: 证书的保存路径
openssl x509 -in cacert.pem -noout -text
可查看生成的证书- 也可以导出Windows来看看,更改后缀为cer即可。
- 创建所需要的文件
#生成证书索引数据库文件
touch /etc/pki/CA/index.txt
#当前证书序列号
echo 01 > /etc/pki/CA/serial
host B
- 申请者生成私钥
(umask 066;openssl genrsa -out /data/cert/web.key 2048)
- 申请者生成证书申请文件
openssl req -new -key /data/cert/web.key -out /data/cert/web.csr <<EOF
CN
beijing
bj
wang
web
web.wang.com
web@wang.comEOF
- 将证书请求文件传输给CA
scp /data/cert/web.csr root@192.168.88.77:/data/cert/
host A
- CA签署证书,并将证书颁发给请求者
openssl ca -in /data/cert/web.csr -out /etc/pki/CA/certs/web.crt -days 150
注意:默认要求 国家,省,公司名称三项必须和CA一致
查看证书
- 查看证书中的信息:
openssl x509 -in /PATH/FROM/CERT_FILE -noout -text|issuer|subject|serial|dates
- 查看指定编号的证书状态
openssl ca -status 编号
- 允许相同的申请者申请证书
[0]$ cat index.txt.attr
unique_subject = no
#yes表示不允许,更改为no
吊销证书
- 在客户端获取要吊销的证书的serial(查看颁发的证书)
openssl x509 -in /PATH/FROM/CERT_FILE -noout -serial -subject
- 吊销证书(在CA上,根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致):
openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
- 指定第一个吊销证书的编号,注意:第一次更新证书吊销列表前,才需要执行
echo 01 > /etc/pki/CA/crlnumber
- 更新证书吊销列表
openssl ca -gencrl -out /etc/pki/CA/crl.pem
- 查看crl文件:
openssl crl -in /etc/pki/CA/crl.pem -noout -text
SSL/TLS
SSL:Secure Socket Layer
SSL包含记录层(Record Layer)和传输层,记录层协议确定传输层数据的封装格式。传输层安全协议使用X.509认证,之后利用非对称加密演算来对通信方做身份认证,之后交换对称密钥作为会谈密钥(Session key)。这个会谈密钥是用来将通信两方交换的数据做加密,保证两个应用间通信的保密性和可靠性,使客户与服务器应用之间的通信不被攻击者窃听。
TLS: Transport Layer Security
1995:SSL 2.0 Netscape
1996:SSL 3.0
1999:TLS 1.0
2006:TLS 1.1 IETF(Internet工程任务组) RFC 4346
2008:TLS 1.2 当前使用
2015:TLS 1.3
功能:机密性,认证,完整性,重放保护
两阶段协议:分为握手阶段和应用阶段
1. 握手阶段(协商阶段):客户端和服务器端认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及主密钥。后续通信使用的所有密钥都是通过MasterSecret生成
2. 应用阶段:在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信SSL/TLS
SSL/TLS
1. Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换
2. ChangeCipherSpec 协议:一条消息表明握手协议已经完成
3. Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告
4. Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等
5. HTTPS 协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合。HTTP over SSL”或“HTTP over TLS”,对http协议的文本数据进行加密处理后,成为二进制形式传输HTTPS结构
HTTPS工作过程
生成的随机密钥是指对称加密密钥
AIDE
当一个入侵者进入了你的系统并且种植了木马,通常会想办法来隐蔽这个木马(除了木马自身的一些隐蔽特性外,他会尽量给你检查系统的过程设置障碍),通常入侵者会修改一些文件,比如管理员通常用ps -aux来查看系统进程,那么入侵者很可能用自己经过修改的ps程序来替换掉你系统上的ps程序,以使用ps命令查不到正在运行的木马程序。如果入侵者发现管理员正在运行crontab作业,也有可能替换掉crontab程序等等。所以由此可以看出对于系统文件或是关键文件的检查是很必要的。目前就系统完整性检查的工具用的比较多的有两款:Tripwire和AIDE,前者是一款商业软件,后者是一款免费的但功能也很强大的工具
AIDE(Advanced Intrusion Detection Environment高级入侵检测环境)是一个入侵检测工具,主要用途是检查文件的完整性,审计计算机上的那些文件被更改过了
- AIDE能够构造一个指定文件的数据库,它使用aide.conf作为其配置文件。AIDE数据库能够保存文件的各种属性,包括:权限(permission)、索引节点序号(inode number)、所属用户(user)、所属用户组(group)、文件大小、最后修改时间(mtime)、创建时间(ctime)、最后访问时间(atime)、增加的大小以及连接数。AIDE还能够使用下列算法:sha1、md5、rmd160、tiger,以密文形式建立每个文件的校验码或散列号
- 这个数据库不应该保存那些经常变动的文件信息,例如:日志文件、邮件、/proc文件系统、用户起始目录以及临时目录
- 安装AIDE
yum install aide
- 配置文件
/etc/aide.conf
- 初始化:
aide --init
- 检测:
aide --check
- 更新数据库:
aide --update
实验:AIDE实例
- 安装AIDE
yum install aide
- 在node1服务器上创建/data⽬录,在data中创建dir1⽂件夹和f1⽂件:
mkdir -p /data/dir1
echo hello > /data/f1
cd /data
- 然后在配置⽂件
/etc/aide.conf
最下⾯添加的配置信息,让其检测/data/⽬录下的内容,不检查dir1下的内容:
vim /etc/aide.conf
#最后一行添加:
/data/ CONTENT
!/data/dir1
- 初始化AIDE库:
aide --init
- 然后对f1⽂件进⾏修改, :
mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
echo "hello world" > /data/f1
- 执⾏检测,发现f1⽂件被篡改
aide --check
- 在dir1中创建⽂件, 更新aide数据信息:
echo fff > /data/dir1/ss
aide --update
#生成检查数据库(建议初始数据库存放到安全的地方)
cd /var/lib/aide
mv aide.db.new.gz aide.db.gz
aide --update
—生成—>aide.db.new.gz
—生成检查数据库—>aide.db.gz
- 然后修改dir1中的ss⽂件内容,进⾏检测,结果没有发现ss⽂件被修改过,因为在配置⽂件中定义了!/data/dir1:
echo sss >/data/dir1/ss
aide --check
sudo
•来自sudo包,man 5 sudoers
•sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系管理员
•sudo可以提供日志,记录每个用户使用sudo操作
•sudo为系统管理员提供配置文件,允许系统管理员集中地管理用户的使用权限和使用的主机
•sudo使用时间戳文件来完成类似“检票”的系统,默认存活期为5分钟的“入场券”
- su 切换身份:
su –l username –c 'command'
- sudo 切换身份
sudo –i –u wang
- sudo 命令
sudo [-u user] COMMAND
[选项] | 意义 |
---|---|
-V | 显示版本信息等配置信息 |
-u user | 默认为root |
-l | 列出用户在主机上可用的和被禁止的命令 |
-v | 再延长密码有效期限5分钟,更新时间戳 |
-k | 清除时间戳(1970-01-01),下次需要重新输密码 |
-K | 与-k类似,还要删除时间戳文件 |
-b | 在后台执行指令 |
-p | 改变询问密码的提示符号 |
示例:sudo -p "password on %h for user %p:"
sudoers
通过visudo命令编辑配置文件,具有语法检查功能
visudo -c
检查语法
visudo -f /etc/sudoers.d/test
指定编辑的sudoers配置文件配置文件:
/etc/sudoers
,/etc/sudoers.d/
时间戳文件:
/var/db/sudo
日志文件:
/var/log/secure
配置文件支持使用通配符glob
\x
转义
[[alpha]]
字母 示例: /bin/ls [[alpha]]*配置文件规则有两类
1、别名定义:不是必须的
2、授权规则:必须的示例:
root ALL=(ALL) ALL
wang 192.168.88.7=(root) /bin/mount /dev/sr0 /mnt
格式说明:
user host=(runas) command
Users
运行命令者的身份和runas
以哪个用户的身份:
username
、#uid
、%group_name
、%#gid
、user_alias|runas_alias
host
通过哪些主机:
ip或hostname
、network(/netmask)
、host_alias
command
运行哪些命令:
command name
、directory
、sudoedit
、Cmnd_Alias
别名定义:
AliasType NAME1 = item1, item2, item3 : NAME2 = item4, item5
AliasType别名有四种类型:
User_Alias
,Runas_Alias
,Host_Alias
,Cmnd_Alias
sudoers示例:
- 授权wang⽤户完成某个命令
[root]$ vim /etc/sudoers
wang ALL=(root) /usr/bin/cat /etc/shadow
- 授权某个⽤户组的⽤户具有特定权限
[root]$ vim /etc/sudoers
%wang ALL= ALL
#以root身份运行可以省略“=”后的ALL或者是(root)
%wheel ALL=(ALL) NOPASSWD: ALL
#NOPASSWD表示可以不输入密码执行sudo
- 在/etc/sudoers.d目录授权配置文件
[root]$ vim /etc/sudoers.d/wangfile
wang ALL= ALL
#除了可以用vi编辑,也可以用visudo,-c可以进行内容检查
#visudo -c -f /etc/sudoers.d/wangfile
- sudoers配置⽂件中的其他配置⽅式
#1001 ALL= ALL
%#1000 ALL= ALL
#符号"#",后面跟uid,也可以用"%#"后面跟gid
- 别名的使用
#别名只能使⽤⼤写字⺟和数字构成
[root]$ vim /etc/sudoers.d/wang
#别名定义
User_Alias SYSUSER=chen
Host_Alias SYSHOST=192.168.88.0/24
Runas_Alias SYSRUNAS=root
Cmnd_Alias SYSCMD=/bin/cat /etc/shadow
#策略
SYSUSER SYSHOST=(SYSRUNAS) SYSCMD
- 指定wang使用sudo时默认使用tom的权限
Defaults:wang runas_default=tom
wang ALL=(tom,jerry) ALL
- 排除某个命令
wang 192.168.1.6,192.168.1.8=(root) /usr/sbin/,!/usr/sbin/useradd
- 存在一个问题
wang ALL=(ALL) /bin/cat /var/log/messages*
- 这样的写法会导致用户可以这样执行来查看本来无法查看的文件
sudo cat /var/log/messages /etc/passwd
- 官方的man文档也有说到这样的内容
Wildcards in command line arguments should be used with care.Command line arguments are matched as a single, concatenated string.This mean a wildcard character such as ‘?’ or ‘*’ will match across wordboundaries, which may be unexpected. For example, while a sudoers entrylike:%operator ALL = /bin/cat /var/log/messages*will allow command like:$ sudo cat /var/log/messages.1It will also allow:$ sudo cat /var/log/messages /etc/shadow
- 解决方法 :思路就是不让用户执行cat多个文件,也就是参数不能有空格,那么可以这么写
[root]$ vim /etc/sudoers.d/chen
chen ALL=(root) /bin/cat /var/log/messages*,!/bin/cat /var/log/message* *
TCP_Wrappers介绍
链接跳转:Linux进阶_TCPWrappers介绍
Openssl
链接跳转:Linux进阶_OpenSSL详解
PAM认证机制
链接跳转:Linux进阶_PAM认证机制
Linux进阶_加密和安全相关推荐
- Linux进阶_时间同步服务
成功不易,加倍努力! 1 计时方式 1.1 古代计时方式 1.2 现代计时方式 2 时间同步服务 3 chrony 3.1 chrony介绍 3.2 chrony 文件组成 3.3 配置文件chron ...
- Linux 进阶笔记(一)
这几篇博文主要记录博主的Linux 学习之路,用作以后回顾和参考.大家可以选择略过也可以作参考. (一)Linux 初步笔记 (二)Linux 进阶笔记(一) (三)Linux 进阶笔记(二) (四) ...
- Linux进阶之路-Ubuntu版
Linux进阶之路 @[TOC](Linux进阶之路) Linux 简介 概述 Linux 与 Windows 比较 安装 Linux 操作系统 Linux 远程控制管理 概述 OpenSSH XSh ...
- Linux进阶篇--磁盘分区管理
Linux进阶篇–磁盘分区管理 11.1 磁盘基础介绍 设备文件 * I/O Ports:I/O设备地址 * 设备类型: 块设备:block,存取单位"块",来自于磁盘 字 ...
- Python 进阶_生成器 生成器表达式
目录 目录 相关知识点 生成器 生成器 fab 的执行过程 生成器和迭代器的区别 生成器的优势 加强的生成器特性 生成器表达式 生成器表达式样例 小结 相关知识点 Python 进阶_迭代器 & ...
- linux透明加密系统,基于Linux的透明加密系统的设计与实现
摘要: 随着互联网时代的到来,人们用于接触事物的方式不仅仅局限于简单的通讯工具了,如:口语交流,书信传递等等,现在已经越来越多地通过手机,电脑,平板等电子设备进行信息的交流和信息的存储.但是在我们享受 ...
- linux下的加密解密学习
linux下的加密解密学习 加密/解密: 加密协议:加密解密使用同一秘钥:3des,aes 公钥加密:公钥私钥对 数字签名,密钥交换 ...
- c++字符加密_linux安全Linux下RAR加密解密
网络拓扑:Linux下RAR加密解密主机用户名:root 密码:123456第一步.打开网络拓扑,进入H-xclient-rar--1虚拟机. 第二步.创建实验文件test.txt,文件内容&qu ...
- Linux 进阶笔记(二)
这几篇博文主要记录博主的Linux 学习之路,用作以后回顾和参考.大家可以选择略过也可以作参考. (一)Linux 初步笔记 (二)Linux 进阶笔记(一) (三)Linux 进阶笔记(二) (四) ...
- 一机一码加密软件_加密软件还有哪些功能?
加密软件是办公中常用的一种软件,大家对文件加密也有一定的熟知度,文件除了针对电脑文件防外泄,在日常生活中,我们对文件加密使用的频率较高,所以相对也比较了解,那么加密软件还有哪些功能呢? 一.权限管理 ...
最新文章
- 安装QT的时候出现PATH_MAX错误
- SAP ABAP SM50事务码和Hybris Commerce的线程管理器
- 最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现Eureka(Finchley版本)
- 安全验证框架使用笔记001---Shiro简介
- 【Arduino基础教程】PM2.5粉尘检测传感器
- 兼容性测试需要注意的测试点
- 深入理解Core Data
- 【HTTP请求】、详解
- JS String,Array
- 如何使用pytorch下载MNIST数据集
- froala editor导出html,Froala editor 使用
- PIXIJS学习笔记
- HTML制作一个介绍自己家乡的网站——贵阳,排版整洁,内容丰富,主题鲜明
- Chrome的启动参数
- YARN源码分析(一)-----ApplicationMaster
- 基于高斯塞德尔方法的超松弛迭代法MATLAB实现
- 关闭Hyper-V,解决ENSP中AR启动失败错误代码40
- A CHAIN OF SHORT STORIES ABOUT THEIR DISTANCE(秒速五厘米)
- 提高企业品控能力,探讨服装行业未来发展
- 别等了!下一代操作系统Windows 10X,彻底凉凉了