可信启动、安全启动:SGX、TrustZone、SecureEnclave

2023-11-06

最近在公众号上看到了一篇文章,算是又丰富了自己的安全方面的眼界。
最近看公众号取代了小视频、知乎这些东西。以前是真的不喜欢碎片化的东西,看什么学什么总是要找到书籍。但是这样的做法太过的极端,因为有时候有些事是两面性的。比如像安全这方面,本来有的东西和内容就很少,所以即使碎片化,也是前辈们花时间分享出来的东西,学起来还是很有价值的。

推荐一下我看的这篇文章的公众号:极术社区

原文的链接:https://mp.weixin.qq.com/s/WtF6EKUTDI01UjKv1H82Tw

下面一起来学习一下前辈的优秀blog

1、安全启动与可信启动

对于这两个概念你知道他们的区别吗?

1、安全启动

安全启动:启动过程中,前一个部件验证后一个部件的数字签名,验证通过后,运行后一个部件,否则就中止或复位系统。因此它是一个防恶意篡改的手段。

目前安全启动基本上是对安全要求比较高的场景下,芯片必备功能。

在这里插入图片描述

这里的关键词是前一个校验后一个,这里就有了一个信任链-CoT

2、可信启动

可信启动:启动过程中,前一个部件度量(计算HASH值)后一个部件(通常在后一个部件被签名校验过之后),然后把度量安全的保存下来,比如扩展到TPM的PCR中。后续接入平台后,部件的度量会上报到认证平台,认证平台会有配置一个可信白名单,如果某个部件的版本信息不在白名单里,则认为此设备是不受信任的,因为它可能使用了一个虽然有签名,但可能BUG的版本。因此它是一个可信版本的管理手段。

可信启动(Trusted Boot):也称为Measure boot,就是在启动过程中,前一个部件度量(计算HASH)后一个部件,然后把度量值安全保存下来,比如放到一个集中的部件(或云端),设备启动后的一致性(完整性)的校验由集中的部件负责完成。

在这里插入图片描述

要实现可信启动,首先需要 cpu 的支持其次还需要 TPM(Trusted Platform Module)芯片的支持,TPM 有两个作用,作用一:提供加解密算法的支持作用 二:存储对称密钥及私钥。可能部分嵌入式产品还需要 OTP(One Time Programmable)芯片。

3、小结

安全启动/可信启动 是确保系统级别的安全手段,适用于有可信诉求的整机系统,终端设备如手机、STB、路由器等,当然也适用于通用服务器设备。

可信计算组织(TCG)提出了“可信链”和“可信度量”的概念,并认为:如果信息系统由一个初始的“可信根”开始,在平台控制权每一次转换时,通过完整性度量将这种信任传递给下一个组件,则平台计算环境就始终是可信的。

TCG规范提倡采用一个单独的安全模块作为信任根,这是一个软/硬件相结合的子系统。该子系统被设计成能够度量、存储和报告系统可信赖属性的模块,是建立信任链的起始点。TCG规范旨在提供开放的、平台无关的标准,从而被应用到不同的平台设备中。TCG中的信任模型是以TPM硬件模块为基础的。TPM是一个可独立进行密钥生成、加/解密的装置,内部拥有独立的处理器和存储单元,可存储密钥和敏感数据,为各种计算平台提供完整性度量、数据安全保护和身份认证服务。但TCG只为系统引导阶段建立初始信任过程中参数的度量和报告制定了标准,但对于如何实施未作探讨。

两者的区别就在于安全启动的校验是在信任链,而可信启动是一个TPM统一校验,不过在我们实际的开发中,这两者都是交互的,可能某些过程的镜像是一个信任链,但是有的镜像或者说是模块,又负责校验了多个镜像。

以上安全启动和可信启动的概念,网上有许多专家在讨论,可以自行进一步理解。然而,如果仅从字面要求试图实施时,我们又会发现许多新的问题,举个例子:安全启动时,确实每一级都被签名校验了,但确定安全吗?某一级如操作系统1分钟前刚刚被校验过,1分钟后还是可信的吗?不见得,这个过程中,操作系统完全有可能已经被非法修改过了。

要做到相对更安全,要么能够做到Runtime的实时校验,即每次使用那一刻都要校验。 如果做不到Runtime校验,那就想办法将校验过的数据安全保存起来…相关实现方案和技术其实在有前提的情况下已具备,这是另一个课题。

这个前提是指系统需要是不开放的嵌入式系统,因为不开放,可定制,提供特定的功能/服务,因此整机系统的保护是可行的,并且方案都是很成熟的。 (但是像安卓这些其实都是很开放的系统。)

回归产品

2、现状-回归产品(我觉得这点很重要-为什么有了trustzone?)

下一次想想为什么需要安全?

对于通用计算设备比如服务器产品是个什么样的情况呢?基本上就是这么个事实:

1、系统“全局保护”越来越难以实现,且不切实际

原因是当前开源共享,并且是自由的大环境。操作系统开源,应用开源,用户自由地选择不同版本的操作系统和应用,一切都不在设备厂商的控制中。

2、“全局保护”不可行,那就将保护范围缩小到应用的部分片段

这就是Intel SGX或ARM TrustZone的由来

因此,Intel SGX或ARM TrustZone是传统的系统保护手段不可行,通用系统设备的保护方案无法借鉴嵌入式系统的方案后,安全技术工作者转变思路后的产物。

3、技术

1、Intel SGX

网上有相当多的材料,并且都有一个特点:短小精悍。于是我们就看到了非常经典的一个图,足以说明SGX应用的工作原理:

在这里插入图片描述

  • 应用在设计时,需要考虑所谓的trusted和untrusted两部分,trusted即为处理敏感数据的实现部分
  • 实现应用,对于trusted部分,需要使用Enclave定义语言(EDL)来实现需要的逻辑。通过EDL实现的内容,将被执行在安全区域(Enclave)
  • Enclave中的实现可被untrusted的代码调用,当被调用时,命令会通过底层驱动传递Enclave中;
  • Enclave中的数据对外部不可见,也禁止外界的访问(包括系统高权限的代码也不可访问)
  • 处理完之后,返回结果,但过程数据仍然在Enclave中;
  • 获得返回后,应用的untrusted部分按即定的过程继续执行。

安全执行环境(Secure Execution Environment)是宿主进程的一部分,这意味着:

  • 该应用程序包含其自己的代码,数据和安全区域;
  • Enclave也包含自己的代码和数据。
  • SGX保护飞地代码和数据的机密性和完整性;
  • Enclave进入点是在编译时预定义的;
  • 支持多线程(但实现起来并不容易);
  • 一个安全区可以访问其应用程序的内存,但不能相反

在这里插入图片描述
我们可以再看一下EDL的使用示例,这样可以了解应用开发的难易程度:

在这里插入图片描述

可以看到,EDL并不是要求用户掌握学习一门新的语言,它的代码仍然是类POSIX API,C/C++库构成的,它也可以快速的将已有的实现迁移到Enclave中。

小结
SGX Enclave完全使用了CPU的隔离能力,不可操作外设、中断等。EDL定义片段属于普通App的一部分,因此多核 、多线程都可以支持。EDL随时随地定义,部署非常灵活方便。但是EDL是定义在代码中的,通过版本的逆向工程,对于数据的处理逻辑,是有可能被窥探的。 (最安全的还是在硬件中保护)

2、ARM TrustZone

TrustZone是标准TEE实现的一种方案,GP的TEE架构和规范标准都是由ARM TrustZone 贡献。当我们讲TrustZone时,可以理解为是在讲GP TEE。则于标准规范,就导致了与SGX不一样的情况,TEE实现有大量的资料可以参考。以下是TEE应用实现的原理:

在这里插入图片描述

  • 基础设施:与SGX不同的,TEE的功能,依赖于安全OS,首先要确保设备上已经部署了安全OS,并且要确保其是可信的;

  • 设计应用,对于需要可信保护的处理过程,需要实现在单独的可应用中(TA);APP以及TA需要分别开发,物理上他们是两个程序;

    • APP执行到安全处理部分时,它通过TEE标准接口向TA发消息;
    • 调用需要进入内核态,通过驱动将消息送到TEE侧;
    • TA收到消息后,来执行即定的数据处理逻辑。
    • 最后将结果返回到APP,但过程数据仍然在TEE侧。

TrustZone 利用的是CPU时间片切换来模拟了安全世界,这两个世界可以将它理解成一个CPU上处理的两个进程,它们通过上下文切换来将CPU的时间片占满以利用CPU。从安全角度,仅仅分时复用或拟化,是不足以确保安全的,因此ARM另外定义了安全框架,从硬件级别两个世界,包括Timer、TRNG、TZPC、MMU、Cache等相关设备,不同的芯片厂商会有自己的考虑,这个设备可能是双份的,或者是动态切换以达到隔离目的。同时,安全侧也需要有一个可信操作系统执行应用。从原理上,REE侧和TEE侧是对等的,因此并不会性能的差异。应用程序的开发,除了使用TEE定义的标准接口,依赖的都POSIX API,使用标准的开发语言。

在部署应用时,SGX只需要在代码中定义即可,在TrustZone中侧需要单独开发部署TA。一般设置厂商都会提供给应用开发者自行部署TA的方法,与SGX相比稍有一点不同,但并不是不可接受(个人观点),这也确实是SGX很明显的一个优势,于是乎,ARM后面有了Newmore这样一个概念。

但也正因为TA与APP是分离的,并且TEE侧是不可查看的,因此数据的处理过程很难以被窥探。(我倒是认为这样的解耦其实是有点,同时TA需要签名,安全的特性会进一步的得到保证。)

最后,还有一点,网上还有一种声音,认为SGX和TrustZone“没有什么用”,观点的理由是:

“且不说传统的攻击,如SQL注入、溢出攻击,使得攻击者可以直接控制非安全应用,进而通过定义的接口取得数据,即使没有这些漏洞,恶意软件通过其他途径入侵到了OS里面,它是不是可以远程注入一段代码到APP,然后调用接口获取数据?”

这里必须要反驳一下,之所有这个观点,是他没有理解SGX或TrustZone的真正的使用场景。正确的处理方式其实上面的过程描述中我们已经提到了:

  • “处理完之后,返回结果,但过程数据仍然在Enclave中”
  • “最后将结果返回到APP,但过程数据仍然在TEE侧”

一个有价值的安全应用,并不会支持将敏感数据通过接口调用返回到非安全侧。

应用的安全与否,无论是SGX还是TrustZone应用,确实很大程度上是依赖开发者的意识。SGX或者TrustZone,**它们的价值在于是隐匿敏感数据本身,以及尽可能的隐藏处理敏感数据的处理过程。**只有以这个导向,在应用开发时才能有意识地向这个方向去努力。

我们拿媒体数据举例,一看就会明白应该如何正确使用SGX或TrustZone—

高价值的媒体内容在网络传输时,它通常是被DRM加密保护的,只有凭证的订户才可以解密播放。盗版者本身可能就是个订户,在没有SGX、TrustZone等保护时,通过拷贝内存等手段就很容易实现盗版。但有这些技术后,加密的媒体流并不会在非安全侧解密,而是送往安全侧。注意,在SGX、TrustZone解完密之后的媒体,也并不会返回到安全侧,而是使用底层安全驱动,直接送往解码播放了,媒体数据直接在安全侧消费了。 (这部分的解码是硬件实现的,将数据和秘钥直接放到硬件的槽位,硬件解密之后直接送到player显示。)

以上是从应用开发者角度来比较SGX与TrustZone的差异。但事实上,两者完全不是一个层面的东西,SGX更适合拿AMD的SEV来比较,因为这两种技术类似,都是基于所谓的realm技术(局部保护)来实现。ARM有最新的newmore方案,但目前还在验证的概念阶段,预计在2023年以后才可能产品化,这个世界变化太快,两年的时间实太是太久,暂不便讨论。

3、Apple Secure Enclave

在没有使用 Intel SGX 和 Arm Trustzone 技术的情况下, Apple另辟蹊径提出了自己的安全协处理器方式的 Secure Enclave 方案。

  • 密钥数据在Secure Enclave片上系统(SoC)中进行了加密,该系统包括一个随机数生成器。

  • 即使设备内核遭到破坏,Secure Enclave也会保持其加密操作的完整性。通过将安全区域与应用处理器之间的通信隔离到中断驱动的邮箱和共享内存数据缓冲区,可以对其进行严格控制。

在这里插入图片描述
Secure Enclave是一个安全协处理器,其中包括基于硬件的密钥管理器,该密钥管理器与主处理器隔离,以提供额外的安全性。Secure Enclave是某些版本的iPhone,iPad,Mac,Apple TV,Apple Watch和HomePod的硬件功能,即:

  • iPhone 5s(或更高版本)
  • iPad Air(或更高版本)
  • 包含T1芯片或Apple T2安全芯片的Mac计算机
  • Apple TV 4代(或更高版本)
  • Apple Watch Series 1(或更高版本)
  • HomePod

参考链接:
Intel SGX/ARM TrustZone/Apple SecureEnclave浅析:https://mp.weixin.qq.com/s/WtF6EKUTDI01UjKv1H82Tw
谈谈汽车芯片信息安全:http://www.360doc.com/content/20/1210/21/68188258_950683861.shtml

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可信启动、安全启动:SGX、TrustZone、SecureEnclave 的相关文章

  • clamav的病毒库文件的文件头的信息说明(clamav版本号等)

    Author Samson Date 01 04 2022 在开源病毒检测工具clamav中 是通过对病毒库中的病毒特征值来进行对比的 病毒库文件存放于 var lib clamav目录下 主要是三个cvd文件 如下 bytecode cv
  • SSH反向代理使用

    SSH反向代理 先说说什么是代理 源服务器由于各种原因无法访问目标服务器提供的服务 但是存在一个agent服务器 源服务器可以访问它 它可以访问目标服务器 那么源服务器的消息发给他 它在把请求转发给目标服务器 就间接的实现了源服务器访问目标
  • OP-TEE是如何使用RPMB来实现可信存储的

    1 目的 写这篇博客主要是为了记录这段时间的成果 方便自己和有需要的人理解可信存储 以及OP TEE是如何实现可信存储的 最近在重构公司的可信存储的实现 主要是想将Trust Storage的主要逻辑实现从user space挪到kerne
  • chinaUnix中的linux源代码学习

    原文地址 http bbs chinaunix net thread 1930079 1 1 html 大家好 内核源码版对本版块的精华帖进行了分类汇总 所有的精华帖分为十大类 各个分类的精华帖相关信息分布在该贴2 11楼 每个分类各占1楼
  • Intel SGX技术详细解释(非常棒)

    http www jos org cn html 2018 9 5594 htm b18 随着信息技术的迅速发展与广泛应用 人类社会已经进入了一个崭新的互联网时代 一方面 人们享受着互联网科技带来的便利 另一方面 由网络和信息系统构成的网络
  • main函数的前序执行过程简单介绍

    main函数的前序执行过程简单介绍 main函数其实是我们能控制的程序入口 但是程序编译之后进行执行却不是从main函数开始的 这里主要讲解下VC6 0 下编译的程序在执行main函数之前的流程 其实主要为在执行main函数之前做了环境变量
  • mimikatz

    https blog gentilkiwi com mimikatz https github com ParrotSec mimikatz
  • 网络抓包工具 wireshark 入门教程

    Wireshark 前称Ethereal 是一个网络数据包分析软件 网络数据包分析软件的功能是截取网络数据包 并尽可能显示出最为详细的网络数据包数据 Wireshark使用WinPCAP作为接口 直接与网卡进行数据报文交换 网络管理员使用W
  • ISAKMP - 解释域(DOI)和初始向量(IV)

    Domain of Interpretation 解释域 DOI定义了负载的格式 交换的类型 以及对安全相关信息的命名约定 比如对安全策略或者加密算法和模式的命名 DOI标识用来说明payload通过哪一个DOI来解释 常用的DOI有两个
  • ARM TrustZone,连接外设?

    我目前正在对 ARM 的 TrustZone 进行一些研究 例如这里 ARM信息中心 据我了解 通过 TrustZone 可以创建基于 AMBA AXI 总线的安全环境 On ARM网站它说 安全和非安全世界的概念超出了处理器范围 涵盖了
  • 如何在Android应用程序中与QSEE通信?

    我有兴趣使用以下方式开发可信应用程序TEE 我有一个Nexus 5具有安卓5 1 1 LMY48M 在上面 我想创建一个非常基本的 hello world 应用程序来理解在真实设备上运行的 TEE 逻辑 Nexus 5 支持QSEE 高通安
  • 什么可以防止任何恶意软件在 ARM TrustZone 中引发 SMC 异常?

    我正在阅读有关 ARM TrustZone 的内容 我读到 当普通世界想要来自安全世界的功能时 他们会引发 SMC 异常 从而将数据传输到安全世界 我不明白的是 是什么阻止了任何恶意代码引发 SMC 异常 如果任何未经授权的软件都可以导致转
  • ARM TrustZone 的安全/正常世界与操作系统的内核/用户模式或 x86 的 Ring0/1/2/3?

    我读了这样的文档TrustZone 安全白皮书 http infocenter arm com help topic com arm doc prd29 genc 009492c PRD29 GENC 009492C trustzone s
  • 使用 ARM TrustZone 防止从非安全世界访问内存区域

    Context 我想拥有一个有钱人GNU Linux操作系统运行在正常的世界和一个带有集成的小型操作系统Monitor运行在安全世界 要求 我们必须绝对避免 the 正常的世界访问安全世界内存区域 Question 具有哪些特征信任区我们需
  • ARM TrustZone 开发

    我想知道是否有人有关于可以使用 ARM TrustZone 的开发板的信息 我有 BeagleBoard XM 它使用 TI 的 OMAP3530 和支持信任区的 Cortex A8 处理器 但是 TI 确认他们已禁用板上的功能 因为它是通
  • 如何在 QEMU 中模拟 TrustZone?

    我正在尝试在 Qemu 中模拟 TrustZone 功能 我发现两个链接似乎解释了这个过程 第一个参考 http www linaro org blog core dump arm trustzone qemu 未附加支持 TrustZon
  • TrustZone 监控模式和 IFAR、IFSR、DFAR、DFSR

    The ARM TrustZone 监控模式 http infocenter arm com help index jsp topic com arm doc prd29 genc 009492c CACJBHJA html可以在监视模式下
  • 英特尔 SGX 开发者许可和开源软件

    是否可以获得许可的开发人员证书 用于在生产模式下签署经过安全审查 社区开发的开源 SGX 软件二进制文件 并将其发布到 apt 或 rpm 等开源存储库上 我刚刚询问了Intel SGX团队 他们说只有经过验证的供应商才能获得证书并在生产模
  • 将向量传递到 Intel SGX 中的 enclave

    我有一个vector
  • 上下文切换到安全模式(arm trustzone)的成本是多少

    我试图了解在arm中可信 安全 和非安全模式之间来回切换的成本 从非安全世界转移到安全世界时到底需要发生什么 我知道需要设置 ns 位 基于某些特殊指令 需要刷新和更新页表 刷新和更新处理器缓存 还有什么需要发生的吗 处理器缓存 它们是分段

随机推荐

  • 三、PowerShell-使用帮助系统

    三 PowerShell 使用帮助系统 文章目录 三 PowerShell 使用帮助系统 1 帮助系统使用场景 2 更新帮助系统 3 查看帮助 4 使用帮助系统查找命令 5 帮助详解 1 参数集和通用参数 2 可选和必选参数 3 位置参数
  • springboot集成logback配置文件,配置日志

    目录 logback简介 为什么使用logback 开始使用 1 导入依赖 2 在项目的resources目录下新建一个logback xml文件 3 填入配置 4 项目启动 logback简介 Logback是由log4j创始人设计的又一
  • 人生中第一次向开源项目提交PR记录

    git了解很久了 但是就是没有向大一点的项目提交过pr 都是自己瞎折腾 记录一下开源项目提交PR过程 省略的过程可以参考 https www runoob com git git tutorial html 这个里面包括安装 使用 介绍基本
  • Java常见面试题

    Java面试题 java基础 spring springMVC mybatis mybatisplus springboot springcloudAlibaba redis mongodb mysql rabbitmq kafka doc
  • Java循环依赖使用@Lazy(懒惰的)注解解决

    Lazy Autowired private TaskService taskService Lazy 懒加载注解的概念 SpringIoC容器会在启动的时候实例化所有单实例 bean 如果我们想要实现 Spring 在启动的时候延迟加载
  • vue2转vue3笔记

    定义 vue3中不再使用data函数 而是采用ref reactive来定义响应式的数据 ref用来存放基本数据 reactive用来存放复杂的数据 注意这两种参数的值都不能直接使用 而是使用xxx value才能对其进行复制 而且reac
  • yaml配置对象map

    yaml配置如下 objectConfig object map 1 name 对象一 desc 这是第一个对象 url https abc abc abc 2 name 对象二 desc 这是第二个对象 url https abc abc
  • 基于沙猫群优化算法的函数寻优算法

    文章目录 一 理论基础 1 沙猫群优化算法 1 初始化种群 2 搜索猎物 探索 3 攻击猎物 开发 4 探索和开发 2 SCSO算法伪代码 二 仿真实验与结果分析 三 参考文献 一 理论基础 1 沙猫群优化算法 文献 1 提出了一种新的元启
  • 【Apifox】国产测试工具雄起

    在开发过程中 我们总是避免不了进行接口的测试 而相比手动敲测试代码 使用测试工具进行测试更为便捷 高效 今天发现了一个非常好用的接口测试工具Apifox 相比于Postman 他还拥有一个非常nb的功能 在接口的测试完成后 它可以一键生成接
  • Scripting.FileSystemObject控件的用法

    文件系统对象FSO的英文全称是File System Object 这种对象模型提出了有别于传统的文件操作语句处理文件和文件夹的方法 通过采用object method这种在面向对象编程中广泛使用的语法 将一系列操作文件和文件夹的动作通过调
  • Cadence orcad 原理图导出带书签目录的办法

    Cadence orcad 导出pdf 方便软件工程师或者其他人员查看 但是Cadence自带的导出pdf的办法不能同时导出书签目录 不利于查看 这片文章就是介绍怎么使用Cadence orcad 原理图导出带书签目录的pdf 这里以cad
  • 使用umr读取AMDGPU VRAM

    使用umr读取AMDGPU VRAM 造case 使用UMR读取内存 使用devmem2验证读取 huge page 造case gdb args kfdtest GNU gdb Ubuntu 9 2 0ubuntu1 20 04 1 9
  • 自动发送邮件(第一次做勿喷)

    import smtplib from email message import EmailMessage email EmailMessage Creating a object for EmailMessage email from x
  • 考ACM需要的知识(转)

    转自 http www ithao123 com topic 10002 html 对ACM竞赛的算法大概分了一下类 分成了数学 数据结构和算法三大块 对ACM竞赛的算法大概分了一下类 分成了数学 数据结构和算法三大块 一 数学 Mathe
  • 在机器学习里,什么是凸样本集和非凸样本集?

    如果一个数据集D是凸的 那么对于其中任意的两点x y D R 0 1 则 x 1 y D表达式 x 1 y被称作点x y 的 凸性组合 convex combination 简单来说 数据集D中任意两点的连线上的点 也会在数据集D内 那么数
  • Linux性能监控命令_nmon 安装与使用

    目录 1 安装nmon 1 1 下载 nmon 监控工具 1 2 下载 nmon 分析工具 2 nmon监控 2 1 实时监控 监控CPU 监控内存 监控磁盘 监控网络 监控文件系统 2 2 后台监控 3 图形报表解读 3 1 SYS SU
  • 剑指offer 学习笔记 构建乘积数组

    面试题66 构建乘积数组 给定一个数组A n 请构建一个数组B n 其中B i A 0 xA 1 x xA i 1 xA i 1 x xA n 1 不能使用除法 如没有不能使用除法的限制 可以用A中所有元素的乘积除A i 来得到B i 此时
  • C#调用Java后端的restful接口(传递多参数)

    由于工作中的需要 在C 的winform窗口中调用html前端页面 是用webbrowser实现 此处不多做概述 但是前端请求的接口是用Java编写的 在webbrowser中使用C 来请求Java后端的restful接口 此处是C win
  • 掌上生活服务器维护中,招行掌上生活登录不上

    由于换了手机号 招行掌上生活一直登不上 打了不下10个客服电话后 终于得到一套非常复杂可能有效尚未尝试的解决方案 怕等下忘了 赶紧先记录一下 那么这个方案复杂到什么程度呢 复杂到客服妹妹已经无法理解 只能一字不落地读给我听然后寄希望于我的程
  • 可信启动、安全启动:SGX、TrustZone、SecureEnclave

    最近在公众号上看到了一篇文章 算是又丰富了自己的安全方面的眼界 最近看公众号取代了小视频 知乎这些东西 以前是真的不喜欢碎片化的东西 看什么学什么总是要找到书籍 但是这样的做法太过的极端 因为有时候有些事是两面性的 比如像安全这方面 本来有