当前位置: 首页 > news >正文

物理真机上LUKS结合TPM的测试 —— 使用随机数密钥

1. 创建磁盘空间

命令如下:

dd if=/dev/zero of=enc.disk bs=1M count=50

实际命令及结果如下:

$ dd if=/dev/zero of=enc.disk bs=1M count=50
输入了 50+0 块记录
输出了 50+0 块记录
52428800 字节 (52 MB, 50 MiB) 已复制,0.0587495 s,892 MB/s$ ls
enc.disk

2. 创建密钥

命令如下:

dd if=/dev/urandom of=disk.key bs=1 count=32

实际命令及结果如下:

$ dd if=/dev/urandom of=disk.key bs=1 count=32
输入了 32+0 块记录输出了 32+0 块记录32 字节已复制,0.00108989 s,29.4 kB/s$ ls
disk.key  enc.disk

3. 将enc.disk虚拟成块设备

命令如下:

sudo losetup /dev/loop0 enc.disk

实际命令及结果如下:

$ sudo losetup /dev/loop0 enc.disk$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0         7:0    0    50M  0 loop 
nvme0n1     259:0    0 476.9G  0 disk 
├─……/usr/local/opt/home/data

4. 加密enc.disk

命令如下:

sudo cryptsetup --key-file=disk.key luksFormat /dev/loop0

实际命令及结果如下:

$ sudo cryptsetup --key-file=disk.key luksFormat /dev/loop0WARNING!
========
这将覆盖 /dev/loop0 上的数据,该动作不可取消。
Are you sure? (Type 'yes' in capital letters): YES

5. 映射磁盘

命令如下:

sudo cryptsetup --key-file=disk.key open /dev/loop0 enc_volume

实际命令及结果如下:

$ ls /dev/mapper/
control  enc_volume$ ls -l /dev/mapper/
总计 0
crw-rw---- 1 root root 10, 236  2月20日 11:14 control
lrwxrwxrwx 1 root root       7  2月24日 09:41 enc_volume -> ../dm-0

6. 格式化映射分区

命令如下:

sudo mkfs.ext4 -j /dev/mapper/enc_volume

实际命令及结果如下:

$ sudo mkfs.ext4 -j /dev/mapper/enc_volume
mke2fs 1.46.5 (30-Dec-2021)
创建含有 34816 个块(每块 1k)和 8720 个inode的文件系统文件系统UUID:884698f1-56e5-4f07-a2de-5d0174224280
超级块的备份存储于下列块: 8193, 24577正在分配组表: 完成                            
正在写入inode表: 完成                            
创建日志(4096 个块)完成写入超级块和文件系统账户统计信息: 已完成

7. 创建挂载点并挂载

命令如下:

mkdir mountpointsudo mount /dev/mapper/enc_volume mountpoint

实际命令及结果如下:

$ mkdir mountpoint
$ ls
disk.key  enc.disk  mountpoint
$ sudo mount /dev/mapper/enc_volume mountpoint$ df -h
文件系统                大小  已用  可用 已用% 挂载点/dev/nvme0n1p4           20G   13G  5.8G   69% /
devtmpfs                4.0M     0  4.0M    0% /dev
tmpfs                   7.7G  168M  7.5G    3% /dev/shm
tmpfs                   3.1G  206M  2.9G    7% /run
tmpfs                   7.7G   97M  7.6G    2% /tmp
……
tmpfs                   1.6G   48K  1.6G    1% /run/user/1000
/dev/mapper/enc_volume   28M   14K   25M    1% /home/penghao/TApp/experiment3/mountpoint

8. 准备明文文件

命令如下:

sudo sh -c 'echo "This is my plain text" > mountpoint/plain.txt'

实际命令及结果如下:

$ sudo sh -c 'echo "This is my plain text" > mountpoint/plain.txt'$ cat mountpoint/plain.txt 
This is my plain text

9. 卸载

命令如下:

sudo umount mountpoint

实际命令及结果如下:

$ sudo umount mountpoint
$ 

10. 关闭加密分区

命令如下:

sudo cryptsetup remove enc_volume

实际命令及结果如下:

$ sudo cryptsetup remove enc_volume$ ls /dev/mapper/
control

11. 卸除回环设备

命令如下:

sudo losetup -d /dev/loop0

实际命令及结果如下:

$ sudo losetup -d /dev/loop0
$ 

12. 创建主对象

命令如下:

tpm2_createprimary -Q --hierarchy=o --key-context=prim.ctx

命令及实际结果如下:

$ sudo /usr/local/bin/tpm2_createprimary --hierarchy=o --key-context=prim.ctx
name-alg:value: sha256raw: 0xb
attributes:value: fixedtpm|fixedparent|sensitivedataorigin|userwithauth|restricted|decryptraw: 0x30072
type:value: rsaraw: 0x1
exponent: 65537
bits: 2048
scheme:value: nullraw: 0x10
scheme-halg:value: (null)raw: 0x0
sym-alg:value: aesraw: 0x6
sym-mode:value: cfbraw: 0x43
sym-keybits: 128
rsa: b45cd070a8b71ba21a5dce69f93035671e4a32bc3758490629f21458171884171a94d1d6446aceb61b6a1d0df65a7f0c0a1cfa4fdbd221c12c69204b0cb8ab146014b9dc439c90b0ed7f538c2a9e0b8f1d16598d572f26f7ca1bcd76d2b1a4a56ee492f1bee45fc255096fb3972c3844a1191245bc2d3e8adcf694223f976a2af739ef6d6223eab4f71593b10233ead81d0d861912c600dfe97f37108fa53ec32f8307f1061689da224af65feccf510758aa8331402e341bfaea38f9203d74c21b54d9aa388351a13852613be8453f47caf6dae5c4a0af73175c40acb6df4e6e2b71b622eb6df4d084b411f4be8ba9c0240f614816e191ff4412839917d8afbb$ ls
disk.key  enc.disk  mountpoint  prim.ctx

13. 创建对象

命令如下:

dd if=/dev/urandom bs=1 count=32 status=none | tpm2_create --hash-algorithm=sha256 --public=seal.pub --private=seal.priv --sealing-input=- --parent-context=prim.ctx

实际命令及结果如下:

$ dd if=/dev/urandom bs=1 count=32 status=none | sudo /usr/local/bin/tpm2_create --hash-algorithm=sha256 --public=seal.pub --private=seal.priv --sealing-input=- --parent-context=prim.ctx
name-alg:value: sha256raw: 0xb
attributes:value: fixedtpm|fixedparent|userwithauthraw: 0x52
type:value: keyedhashraw: 0x8
algorithm: value: nullraw: 0x10
keyedhash: b7b1416f740ffc19b9ae2da9bc4ae968612796c3849f8e0ce754a407e380e6bb$ ls
disk.key  enc.disk  mountpoint  prim.ctx  seal.priv  seal.pub

14. 加载对象到TPM

命令如下:

tpm2_load  -Q --parent-context=prim.ctx --public=seal.pub --private=seal.priv --name=seal.name --key-context=seal.ctx

实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_load --parent-context=prim.ctx --public=seal.pub --private=seal.priv --name=seal.name --key-context=seal.ctx$ ls
disk.key  enc.disk  mountpoint  prim.ctx  seal.ctx  seal.name  seal.priv  seal.pub

15. 将对象从易失性空间移存到非易失性空间中

命令如下:

tpm2_evictcontrol --hierarchy=o --object-context=seal.ctx 0x81010002

实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_evictcontrol --hierarchy=o --object-context=seal.ctx 0x81010002
persistent-handle: 0x81010002
action: persisted

16. 用新的密钥替换旧的密钥

命令如下:

tpm2_unseal -Q --object-context=0x81010002 | sudo cryptsetup --key-file=disk.key luksChangeKey enc.disk 

实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_unseal --object-context=0x81010002 | sudo cryptsetup --key-file=disk.key luksChangeKey enc.disk 

测试中发现此语句并不稳定,有时可以,有时会出现以下错误:

$ sudo /usr/local/bin/tpm2_unseal --object-context=0x81010002 | sudo cryptsetup --key-file=disk.key luksChangeKey enc.disk 
此口令无可用的密钥。

17. 彻底清除旧密钥

命令如下:

shred disk.key
rm -f disk.key

实际命令及结果如下:

$ shred disk.key
$ ls
disk.key  enc.disk  mountpoint  prim.ctx  seal.ctx  seal.name  seal.priv  seal.pub$ rm -f disk.key
$ ls
enc.disk  mountpoint  prim.ctx  seal.ctx  seal.name  seal.priv  seal.pub

18. 再次将enc.disk虚拟成块设备

命令如下:

sudo losetup /dev/loop0 enc.disk

实际命令及结果如下:

$ sudo losetup /dev/loop0 enc.disk$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0         7:0    0    50M  0 loop 
nvme0n1     259:0    0 476.9G  0 disk 
……/usr/local/opt/home/data

19. 使用保存于TPM中的密钥映射磁盘

命令如下:

tpm2_unseal -Q --object-context=0x81010002 | sudo cryptsetup --key-file=- luksOpen /dev/loop0 enc_volume

实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_unseal --object-context=0x81010002 | sudo cryptsetup --key-file=- luksOpen /dev/loop0 enc_volume$ ls -l /dev/mapper/
总计 0
crw-rw---- 1 root root 10, 236  2月20日 11:14 control
lrwxrwxrwx 1 root root       7  2月24日 10:36 enc_volume -> ../dm-0

20. 再次挂载

命令如下:

sudo mount /dev/mapper/enc_volume mountpoint

实际命令及结果如下:

$ sudo mount /dev/mapper/enc_volume mountpoint$ df -h
文件系统                大小  已用  可用 已用% 挂载点/dev/nvme0n1p4           20G   13G  5.8G   69% /
devtmpfs                4.0M     0  4.0M    0% /dev
tmpfs                   7.7G  176M  7.5G    3% /dev/shm
tmpfs                   3.1G  229M  2.9G    8% /run
tmpfs                   7.7G   98M  7.6G    2% /tmp
……
tmpfs                   1.6G   48K  1.6G    1% /run/user/1000
/dev/mapper/enc_volume   28M   15K   25M    1% /home/penghao/TApp/experiment3/mountpoint

21. 查看挂载点中的内容

命令如下:

ls mountpoint

实际命令及结果如下:

$ ls mountpoint/
lost+found  plain.txt$ cat mountpoint/plain.txt 
This is my plain text

说明挂载分区已经被新的密钥解密并且其中内容可以被正确读取了。

22. 卸载

命令如下:

sudo umount mountpoint

实际命令及结果如下:

$ sudo umount mountpoint$ df -h
文件系统        大小  已用  可用 已用% 挂载点/dev/nvme0n1p4   20G   13G  5.8G   69% /
devtmpfs        4.0M     0  4.0M    0% /dev
tmpfs           7.7G  168M  7.5G    3% /dev/shm
tmpfs           3.1G  229M  2.9G    8% /run
tmpfs           7.7G   98M  7.6G    2% /tmp
……
tmpfs           1.6G   48K  1.6G    1% /run/user/1000

23. 关闭加密分区

命令如下:

sudo cryptsetup remove enc_volume

实际命令及结果如下:

$ sudo cryptsetup remove enc_volume$ ls /dev/mapper/
control

24. 卸除回环设备

命令如下:

sudo losetup -d /dev/loop0

实际命令及结果如下:

$ sudo losetup -d /dev/loop0$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
nvme0n1     259:0    0 476.9G  0 disk 
……/usr/local/opt/home/data

25. 将对象从非易失性空间中移除

命令如下:

tpm2_evictcontrol --hierarchy=o --object-context=0x81010002

实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_evictcontrol --hierarchy=o --object-context=0x81010002
persistent-handle: 0x81010002
action: evicted

完整命令集合:

dd if=/dev/zero of=enc.disk bs=1M count=50dd if=/dev/urandom of=disk.key bs=1 count=32sudo losetup /dev/loop0 enc.disksudo cryptsetup --key-file=disk.key luksFormat /dev/loop0sudo cryptsetup --key-file=disk.key open /dev/loop0 enc_volumesudo mkfs.ext4 -j /dev/mapper/enc_volumemkdir mountpointsudo mount /dev/mapper/enc_volume mountpointsudo sh -c 'echo "This is my plain text" > mountpoint/plain.txt'sudo umount mountpointsudo cryptsetup remove enc_volumesudo losetup -d /dev/loop0
sudo /usr/local/bin/tpm2_createprimary --hierarchy=o --key-context=prim.ctxdd if=/dev/urandom bs=1 count=32 status=none | sudo /usr/local/bin/tpm2_create --hash-algorithm=sha256 --public=seal.pub --private=seal.priv --sealing-input=- --parent-context=prim.ctxsudo /usr/local/bin/tpm2_load --parent-context=prim.ctx --public=seal.pub --private=seal.priv --name=seal.name --key-context=seal.ctxsudo /usr/local/bin/tpm2_evictcontrol --hierarchy=o --object-context=seal.ctx 0x81010002sudo /usr/local/bin/tpm2_unseal --object-context=0x81010002 | sudo cryptsetup --key-file=disk.key luksChangeKey enc.disk shred disk.key
rm -f disk.keysudo losetup /dev/loop0 enc.disksudo /usr/local/bin/tpm2_unseal --object-context=0x81010002 | sudo cryptsetup --key-file=- luksOpen /dev/loop0 enc_volumesudo mount /dev/mapper/enc_volume mountpointls mountpointsudo umount mountpointsudo cryptsetup remove enc_volumesudo losetup -d /dev/loop0tpm2_evictcontrol --hierarchy=o --object-context=0x81010002

相关文章:

物理真机上LUKS结合TPM的测试 —— 使用随机数密钥

1. 创建磁盘空间 命令如下: dd if/dev/zero ofenc.disk bs1M count50 实际命令及结果如下: $ dd if/dev/zero ofenc.disk bs1M count50 输入了 500 块记录 输出了 500 块记录 52428800 字节 (52 MB, 50 MiB) 已复制,0.0587495 s&#xff…...

Linux USB 开发指南

文章目录Linux USB 开发指南1 前言1.1 文档简介1.2 目标读者1.3 适用范围2 模块介绍2.1 模块功能介绍2.2 相关术语介绍2.3 模块配置介绍2.3.1 Device Tree 配置说明2.3.2 board.dts 配置说明2.3.3 kernel menuconfig 配置说明2.4 源码结构介绍2.5 驱动框架介绍2.6 Gadget 配置2…...

FreeRTOS入门(03):队列、信号量、互斥量

文章目录目的队列(queue)信号量(semaphore)互斥量(mutex)互斥量递归互斥量总结目的 FreeRTOS提供给用户最核心的功能是任务(Task),实际项目中通常会有多个任务&#xff…...

Biome-BGC在模拟过程中,如何使用Linux、Python等,完成前处理和后处理工作???

在Biome-BGC模型中,对于碳的生物量积累,采用光合酶促反应机理模型计算出每天的初级生产力(GPP),将生长呼吸和维持呼吸减去后的产物分配给叶、枝条、干和根。生物体的碳每天都按一定比例以凋落方式进入凋落物碳库;对于水份输运过程…...

【unittest学习】unittest框架主要功能

1.认识unittest在 Python 中有诸多单元测试框架,如 doctest、unittest、pytest、nose 等,Python 2.1 及其以后的版本已经将 unittest 作为一个标准模块放入 Python 开发包中。2.认识单元测试不用单元测试框架能写单元测试吗?答案是肯定的。单…...

京东测开岗3+1面经+经验分享,拿到offer,月薪34k....

现在,招聘黄金时间已经来临,在网上看了很多大佬的面经,也加了很多交流群,受到了很多朋友的提点,今天终于轮到我来分享面经啦,之前面试了几家公司,最后拿到了京东测试岗的 offer,这里…...

后端接收格式为x-www-form-urlencoded的数据

1.x-www-form-urlencoded是什么? x-www-form-urlencoded纸面翻译即所谓url格式的编码,是post的默认Content-Type,其实就是一种编码格式,类似json也是一种编码传输格式。form表单中使用 form的enctype属性为编码方式&#xff0…...

LeetCode 707. 设计链表

LeetCode 707. 设计链表 难度:middle\color{orange}{middle}middle 题目描述 设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:valvalval 和 nextnextnext。valvalval 是当前节点的值,nextnextnext 是指向下…...

HTTP的主要作用是什么

1、客户与服务器建立连接; 2、客户向服务器提出请求; 3、服务器接受请求,并根据请求返回相应的文件作为应答; 4、客户与服务器关闭连接。 HTTP的性质: 1、HTTP是一种无状态协议,即服务器不保留与客户交…...

SpringBoot系列-- @Enable 模块驱动

Enable 模块驱动 Enable 模块驱动是以 Enable 为前缀的注解驱动编程模型。所谓 “模块” 是指具备相同领域的功能组件集合,组合所形成一个独立的单元。比如 WebMVC 模块、AspectJ 代理模块、Caching (缓存)模块、JMX (Java 管理扩…...

PHP程序员适合创业吗?

创业是一件自然而然的事,不需要人为选择。 只要你是一个努力能干主动的人,当你在一个行业深耕5年之后,就会发现人生发展的下一步就是创业。当然如果行业合适的话。 什么叫行业合适呢? 就是创业的成本并不那么高,不需…...

2023年CDGA考试-第12章-元数据(含答案)

2023年CDGA考试-第12章-元数据(含答案) 单选题 1.元数据架构的类型主要有四种下列哪项不属于分布式元数据架构的优点? A.减少了批处理 B.元数据的质量完全取决于源系统 C.最大程度的减少了实施和维护所需的工作量 D.元数据总是尽可能保持最新且有效 答案 B 2.元数据管理是…...

数据结构之顺序表篇

一、顺序表概念 二、顺序表各类接口实现 *顺序表初始化 **顺序表销毁 ***顺序表插入操作 ****顺序表删除操作 *****顺序表查找操作 ******顺序表实现打印操作 三、顺序表整体实现源码 *SeqList.h **SeqList.c ***test.c 一、顺序表概念 讲顺序表之前先引入线性表概念&#xff…...

ZBC通证月内已翻倍,Nautilus Chain 上线前夕的“开门红”

近日,Zebec Protocol生态通证ZBC迎来了大涨,据悉该通证月内最高涨幅接近了100%,为一众投资者、社区用户、Zepoch节点等带来了可观的回报,并为生态发展注入了十足的信心。我们看到,Zebec Protocol生态在近期宣布了“销毁…...

人工智能练习题:激活函数需要满足的条件、提高CNN的泛化能力、CNN输出特征图大小计算

文章目录1.激活函数需要满足的条件2.提高CNN泛化能力的方法3.CNN输出特征图大小计算第一次用ChatGPT,不得不说在处理大学生作业上,ChatGPT比国内的作业软件好用多了(感叹)。 1.激活函数需要满足的条件 通常情况下,激活…...

KingbaseES Json 系列三:Json数据操作函数一

KingbaseES Json 系列三--Json数据操作函数一(JSONB_EACH,JSONB_EACH_TEXT,JSONB_OBJECT_KEYS,JSONB_EXTRACT_PATH,JSONB_EXTRACT_PATH_TEXT,JSON_EACH,JSON_EACH_TEXT,JSON_OBJECT_KEYS,JSON_EXTRACT_PATH,JSON_EXTRACT_PATH_TEXT) JSON 数据类型是用来存储 JSON(JavaScript O…...

《设计模式》单例模式

《设计模式》单例模式 单例模式是一种常用的设计模式,其主要优点有: 提供了对唯一实例的全局访问。单例模式保证了整个系统中只有一个实例,这样就可以方便地对该实例进行访问和操作,避免了多个实例之间的冲突和不一致。避免了重…...

C/C++每日一练(20230224)

目录 1. 字符串排序 2. Excel表列名称 3. 颠倒二进制位 附录&#xff1a; 位移运算符 左移运算符<< 1.无符号 2.有符号 右移运算符>> 1.无符号 2.有符号 程序测试 1. 字符串排序 编写程序&#xff0c;输入若干个字符串。 要求: &#xff08;1&#x…...

基于YOLO的酸枣病虫害检测识别实践

在我前面的博文中对于农作物病虫害的检测识别已经做过了&#xff0c;不过那个主要是针对水稻的&#xff0c;文章如下&#xff1a;《基于yolov5的轻量级水稻虫害目标检测项目实践》感兴趣的话可以自行移步阅读。这里主要是针对酸枣常见的几种病虫害检测检测识别&#xff0c;首先…...

WAF:ModSecurity on Nginx(15)

预备知识 Nginx概述 Nginx ("engine x") 是一个高性能的HTTP和 反向代理 服务器&#xff0c;也是一个 IMAP/POP3/SMTP服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的&#xff0c;第一个公开版本0.1.0发布于2004年10月4日。其将源代…...

Qt 第3课、Qt 中的字符串类

1、C 标准库 STL STL 是意义上需要与C 一同发布的标准库STL 是一套以模板技术完成的 C类库STL 中包含了常用的算法和数据结构STL 包含了字符串类 2、Qt 和 STL STL 的具体实现依赖于编译器生产厂商STL 的 “标准” 只是其接口是标准的 — 相同的全局函数 — 相同的算法类和数…...

Vulnhub靶场----6、DC-6

文章目录一、环境搭建二、渗透流程三、思路总结一、环境搭建 DC-6下载地址&#xff1a;https://download.vulnhub.com/dc/DC-6.zip kali&#xff1a;192.168.144.148 DC-6&#xff1a;192.168.144.154 靶机描述&#xff1a;选择带k01的密码后面会用到 访问192.168.144.154&…...

华为OD机试真题Python实现【去重求和】真题+解题思路+代码(20222023)

去重求和 给定一个数组,编写一个函数, 计算他的最大N个数和最小N个数的和, 需要对数组进行去重。 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇总 输入 第一行输入M,M表示数组大小 第二行输入M个数,表示数组内容 第三行输入N表示需要…...

lammps教程:Ovito选择特定晶粒的方法

大家好&#xff0c;我是小马老师。 本文介绍如何使用ovito提取特定的晶粒。 在多晶的lammps模拟中&#xff0c;可能会对某一个特定晶粒的变形情况进行分析&#xff0c;此时&#xff0c;需要找到这个晶粒&#xff0c;并进行单独分析。 ovito有专用的晶粒识别命令&#xff0c;…...

DevEco Studio 3.1 Beta1版本发布——新增六大关键特性,开发更高效

智能代码编辑、端云一体化开发、低代码开发个性化…… 六大新增关键特性&#xff0c;开发更高效&#xff0c;体验更觉妙&#xff01; 立即点击链接下载&#xff0c;做DevEco Studio 3.1 Beta1版本尝鲜者&#xff01; 下载链接&#xff1a;HUAWEI DevEco Studio和SDK下载和升级 …...

【蓝桥杯每日一题】二分算法

&#x1f34e; 博客主页&#xff1a;&#x1f319;披星戴月的贾维斯 &#x1f34e; 欢迎关注&#xff1a;&#x1f44d;点赞&#x1f343;收藏&#x1f525;留言 &#x1f347;系列专栏&#xff1a;&#x1f319; 蓝桥杯 &#x1f319;我与杀戮之中绽放&#xff0c;亦如黎明的花…...

Spring Batch 高级篇-并行步骤

目录 引言 概念 案例 转视频版 引言 接着上篇&#xff1a;Spring Batch 高级篇-多线程步骤&#xff0c;了解Spring Batch多线程步骤后&#xff0c;接下来一起学习一下Spring Batch 高级功能-并行步骤 概念 并行步骤&#xff0c;指的是某2个或者多个步骤同时执行。比如下…...

对spring的@Cacheable缓存理解

1 什么是缓存第一个问题&#xff0c;首先要搞明白什么是缓存&#xff0c;缓存的意义是什么。对于普通业务&#xff0c;如果要查询一个数据&#xff0c;一般直接select数据库进行查找。但是在高流量的情况下&#xff0c;直接查找数据库就会成为性能的瓶颈。因为数据库查找的流程…...

力扣-市场分析

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;1158. 市场分析二、解题1.错误示范①提交SQL运行结果2.正确示范①提交SQL运行结果3.错误示范②提交SQL运行结果4.正确示范②提交SQL运行结果5.其他总结前…...

【2357. 使数组中所有元素都等于零】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个非负整数数组 nums 。在一步操作中&#xff0c;你必须&#xff1a; 选出一个正整数 x &#xff0c;x 需要小于或等于 nums 中 最小 的 非零 元素。nums 中的每个正整数都减去 x。 返回使 n…...