首页 / 资讯中心 / 文章详情

可信计算与TPM:信任链、PCR、远程证明及vTPM回滚

可信计算与TPM:信任链、PCR、远程证明及vTPM回滚 ★ FEATURED ARTICLE
简介这份华中科技大学可信计算线上测试题目及答案面向网络安全与可信计算课程复习备考人群围绕理论模型、TPM与TSS、Hash算法、对称与非对称加密、PKI、PCR及平台状态报告等考点整理题目与参考答案便于核对概念、查漏补缺和考前自测。压缩包共1个docx文件约558KB内容以问答形式组织逐题给出结论、原因与对比要点覆盖可信计算担忧、技术发展、MD5/SHA-1、DES/AES、RSA/ECC以及证书与公私钥关系等模块适合按题复习和课堂对照。已有333人学习下载。读者可获得较完整的答案框架、术语解释和答题思路尤其适合梳理TPM密钥、远程与本地报告、PCR状态度量等易混点也能借题目回顾算法特点与应用场景提升复习效率适合课程复习、自测与查缺使用。1. 到底什么是可信计算一个如实汇报的比方电脑出了安全问题很多人的第一反应是装个杀毒软件把坏人揪出来。可信计算走的是另一条路它不承诺帮你抓住谁只承诺一件事——我知道我现在是什么状态而且这个状态你验得了。通俗地说可信计算是一套以主板上的安全芯片为锚点、从开机第一行代码开始逐级度量的机制每一段代码在把控制权交出去之前先被算一次哈希、记进一个只进不出的寄存器里最后外部的人拿着这份记录就能反推出这台机器到底跑的是什么。它更像飞机上的黑匣子加登机安检而不是贴身保镖。这个领域在网络安全大家常说的网安里属于底层基础设施那一层不显眼但很多上层信任都建在它上面。麻烦出在名字上。可信两个字太像安全于是不少人以为装上它电脑就刀枪不入了。其实它解决的是证明问题不是消灭问题。把这一点掰清楚后面 TPM、PCR、信任链这一串名词才不会越看越糊涂。2. 信任链是怎么跑起来的从第一行代码到 PCR 的一路接力2.1 先度量再交棒按下电源键处理器从固定地址取第一条指令。这条指令来自一块固化、刷不掉的存储区规范里叫它核心可信度量根CRTM。它干的第一件事不是加载系统而是把下一段将要执行的代码拿去做一次哈希把结果记下来然后才把控制权交出去。下一段代码又对再下一段重复这个动作一路接力到操作系统启动完毕。这个先度量、再执行的接力过程就是信任链。打个比方它像接力赛交接棒每一棒在把棒递出去之前先给接棒的人拍张照存档也像入职时的层层背调——我信你是因为我信推荐你的人而推荐你的人是我验证过的。链条尽头有一个必须无条件相信的起点CRTM 本身没有被任何人度量过只能假设它干净。这正是规范要求这段代码必须固化、不可修改的原因。整个信任体系的地基只有这一块砖砖一松上面全塌。假如攻击者能改掉这段源头代码他就可以自己构造一条完整的信任链往 PCR 里写任意值远程证明想怎么过就怎么过所谓证明就彻底成了自说自话。所以根这个字在这里不是修辞是字面意思。2.2 PCR机器状态的摘要存在哪每一级的度量结果不能随手丢在内存里因为内存随时会被改写。它被扩展进芯片内部的 PCR 寄存器公式很朴素PCR[i] SHA-1(PCR[i] || newMeasurement)注意是拼接之后再哈希不是覆盖写入。这个设计带来两层性质一是单向从新值倒推不出旧值攻击者没法得知最初状态再往后伪造二是累积任何一次度量都会永久改变后续所有结果想抹掉某一步的痕迹就得让后面每一步跟着改而这条链只进不出。用一段代码把这个过程跑一遍会更直观import hashlib def pcr_extend(old: bytes, measurement: bytes) - bytes: # PCR 扩展把旧值与新度量值拼接后再做 SHA-1而非直接覆盖 return hashlib.sha1(old measurement).digest() # TPM 1.2 新增的动态 PCR 初值为全 1 pcr b\xff * 20 for stage in [bcrtm, bbios, bbootloader, bkernel]: pcr pcr_extend(pcr, stage) print(stage.decode(), pcr.hex())这段代码里old是寄存器当前值measurement是这一级代码的度量结果pcr_extend返回扩展后的新值。校验方拿到度量日志之后用完全相同的顺序重放一遍最后得到的结果如果能和机器报上来的 PCR 值对上就说明这台机器跑的确实是日志里记的那套东西。顺序不能乱——调换bios和bootloader的位置结果会完全不一样这本身就是一种防篡改的约束。数量上早期规范要求至少 16 个 PCR1.2 版又额外加了 8 个专门用于动态可信度量。谁能改它们也有讲究PCR 的重置操作只在机器重启或断电时发生扩展操作则任何有管理员权限的人在系统运行过程中都能执行。前者是硬约束后者是软约束两者的安全含义完全不同。2.3 静态可信根的四个绕不过去的难题从 CRTM 一路量到操作系统的这套做法通常叫静态可信度量根。它逻辑上很干净落地时却撞上四堵墙。第一堵是易用性。PCR 是启动时填进去的想向远端证明一次我现在是干净的机器就得重启一次。用户可以接受开机慢几秒但很难接受每次要证明都得关机重来。第二堵是可扩展性。链越长越脆。机器换块 BIOS、给系统打个补丁链上对应的度量值就变了整条链的可信认定得推倒重来。第三堵是包容性。要让第三方信服理论上得把可信计算基的所有组件都度量一遍可很多通用操作系统的可信计算基边界划得有问题结果几乎所有可执行部件都得进链链胖到没人愿意去逐条确认。第四堵最要命——度量时机。静态根只保证装载那一刻的状态。系统启动完、被判定为可信之后攻击者完全可以利用缓冲区溢出替换掉某个可执行文件。装载时的保证换不来运行时的保证。再叠加早期版本暴露的三个具体缺陷某些可信引导方案装载不完整、把加载内核和度量扩展 PCR 拆成两步做、硬盘损坏或光盘启动时干脆不往 PCR 里扩展BIOS 本身可刷写而启动时又不度量它还有不重启整机、单独对总线动手脚让 TPM 重启的攻击方式。前两个缺陷的根源都在链条太长、起点太低。2.4 把起点抬高动态可信度量根补了哪几个洞动态可信度量根换了个起点不从 BIOS 开始从处理器的一条安全指令开始。信任链把 BIOS 及其配置、可选 ROM 及其配置、带缺陷的引导程序统统绕开前面说的第一、第二个缺陷自然就不成立了。第三个缺陷靠初值来堵。新增的那 8 个 PCR初始值是全 1。总线层面的攻击最多让它们保持全 1却没法伪造出处理器指令的效果只有从处理器发出的那条安全启动指令才能把它们清成 0。初值不同攻击者想凑出一样的哈希结果几乎不可能。配套的还有位置概念——规范里叫 Locality一共 5 级用来鉴别一条请求是谁发出的。4 级代表可信硬件也就是动态可信度量根的所在地3 级是辅助组件属于可选项有的处理器厂商用、有的不用2 级是可信操作系统运行时的位置1 级是操作系统提供给应用的执行环境0 级则用于向下兼容早期版本。级别不同能碰的 PCR 也不同这相当于给不同身份的人发了不同颜色的门禁卡。两家处理器厂商的具体做法略有差异。一家用一条安全指令重新初始化处理器、建立隔离的执行环境来跑安全加载器虚拟机管理器或可信系统的加载器被封进一个安全引导块跳转之前先度量结果写进 17 号 PCR动态信任根就此形成再逐级往下扩展。另一家的流程分成四段经过度量的启动、度量代理的初始化、代理运转、代理销毁先把度量代理和目标环境装进内存发出认证启动指令处理器验证代理的签名——代理自带公钥而处理器内部存着这个公钥的哈希等于先认公钥再用公钥认代理——验证通过后由代理去度量目标环境结果送进 TPM最后才真正启动。整套流程还能通过一种启动策略机制再做一次校验。3. TPM 到底在管什么一颗芯片、三把钥匙和两种证明3.1 它不是处理器的附属品很多人把 TPM 想成处理器里的一个模块其实它通常是主板上独立的一颗芯片常见封装是 TSSOP28也可以被集成进主板上更大的安全芯片里和指纹扫描、智能读卡器做在一起。它和处理器是并列关系不是从属关系。上层怎么跟它说话固件和操作系统访问的是一组内存映射寄存器芯片组把这些交互翻译成总线命令。由于 TPM 的命令集本身相当繁琐规范组织专门定义了一套软件栈TSS来降低门槛应用程序链接到这套库库里把高级接口调用翻译成等价的 TPM 命令交给设备驱动驱动再把命令送到芯片。这层翻译的存在让写业务代码的人不必去背几十条底层指令的字节格式。顺带一个常被问到的点给 TPM 增加对称加密算法的支持会不会让整机更安全答案基本是否定的。系统本身安全的时候软件层面做对称加密就够了芯片里再塞一份并不会提升安全性系统本身不安全的时候攻击者感兴趣的是明文而不是密钥加密做在哪都没用。这个判断很能说明 TPM 的定位——它是信任的锚点不是万能的加密加速器。3.2 三把钥匙EK、AIK、SRKTPM 里最容易被绕晕的是密钥体系。先记三个主角。背书密钥EK是一对 2048 位的非对称密钥在平台生产过程中生成每个平台唯一代表这台机器的真实身份。它从不用来做数据加密也不用做普通签名主要职责是两件生成身份证明密钥以及确立平台所有者——确立过程中用它解密所有者的授权数据。它不可迁移。身份证明密钥AIK专门给 TPM 产生的数据签名比如 PCR 的值。凡是经过它签名的东西就表明这是经过 TPM 处理过的。它用来证明平台身份和环境配置同样不可迁移。一个用户可以拥有多个 AIK每个的生成都需要可信第三方的支持。存储根密钥SRK是存储密钥里的特例一个 TPM 只有一个每个用户创建时生成用来保护这个用户名下的所有其他数据也就是存储可信根。所有其他密钥都活在它的保护之下。这里有个精巧的推理EK 只签名不加密所以没有任何密钥可以用来加密 SRK而 SRK 又必须被保护结论是它只能待在 TPM 内部明文密文都不许出去。密钥参数上一共分三类通用信息密钥类型、算法、授权秘密、特殊信息密钥长度、密钥数据、密钥属性可迁移属性、绑定的 PCR 值。按类型算常见的有 7 种。想用一把子密钥得先拿到父密钥的授权使用之前必须先加载加载时可以选择绑定 PCR 或者绑定口令——绑定 PCR 的意思是只有机器处于某个状态时这把钥匙才使得上。加载过程是一条链不能跳步。假设要把一把签名密钥加载进去用于签名路径是先用 SRK 的私钥解开第一层存储密钥的私钥再用它解开第二层存储密钥的私钥再用第二层解开签名密钥的私钥最后签名密钥才可用。像俄罗斯套娃也像保险柜里放保险柜最外面那把钥匙永远不出芯片。3.3 可迁移与不可迁移密钥也有户口可迁移密钥不绑定某个特定平台由平台用户掌控可以在平台之间搬家。不可迁移密钥则永久绑定某一台指定平台生在哪就死在哪。安全性上不可迁移的明显更高。原因有两条一是它的全部生命周期都在 TPM 内部从产生到销毁私钥部分一次都没离开过芯片除非被主动转成可迁移二是它可以被 TPM 签名从而向外界证明自己确实具备不可迁移这个属性。第二条常被忽略但它才是可验证性的来源——光说自己安全没用得能证明。两者能不能互相转换只能单向不可迁移可以转成可迁移反过来不行。因为安全等级不一样把高等级的转成低等级是降级反过来等于凭空造安全性。这套属性落到具体用途上就分出几种功能密钥。密封密钥把数据和特定硬件或软件条件绑在一起创建时 TPM 会记下当时的配置值和文件哈希快照只有当当前系统状态与快照匹配时才允许解封——它保护的是秘密信息本身。绑定密钥则用于在一个平台上加密小规模数据比如一把对称密钥再拿到另一个平台上解密因为用的是平台特有的密钥所以天然与平台绑定适合做密钥迁移。这两者都是不可迁移的。再看一个常被搞混的组合一台虚拟机回滚TPM 要不要跟着回滚如果不同步一致性就破了如果全同步新产生的密钥又会丢。这个问题留到第 5 章展开。3.4 远程证明与本地证明两种自证清白平台要向别人证明自己干净走的是远程证明。流程拆开看是五步挑战方先请求一次摘要被证明方用 AIK 对指定的 PCR 值和一次性随机数签名把签名摘要连同 AIK 证书一起发过去挑战方验证签名和随机数再与第三方机构核验 AIK 证书的合法性最后读取度量日志按扩展顺序把每一步度量值重放一遍算出期望的 PCR 值与对方报上来的比对相符才认为环境可信据此决定下一步给不给它访问权限。这里的关键动作是重放。日志里记着每一次度量的原始值挑战方自己动手按同样的顺序扩展一遍算出来的结果如果和机器报的一致就说明日志没有被伪造过——因为 PCR 里的值伪造不了。本地证明换了个思路本地机器自己可能就是不可信的所以不能靠它自证得借 TPM 的机制。做法是把一条机密信息密封到某个或某组 PCR 值上需要判断启动是否可信时让 TPM 执行解封解封成功说明当前 PCR 值符合期望启动过程是安全的。正常启动完成后通常会把这条秘密信息销毁再扩展 PCR 改变机器状态确保后来者无法解封。这就是本地报告的全部逻辑——用能不能解开来代替你说了什么。密封的具体做法可以写成三步。设 M 是要保护的信息K 是一把对称密钥V 是某组 PCR 的期望值TPM 有一对加解密密钥。第一步用 K 把 M 加密得到密文第二步用 TPM 的公钥把 V 和 K 一起加密第三步把两份密文都存起来。想拿回 M必须先拿到 K而 TPM 只有在检查到当前 PCR 值等于 V 时才会交出 K。等于说数据的可访问性被绑死在了机器状态上状态一变数据就再也解不开。4. 常见的易混概念可信不等于安全哈希也不是加密4.1 可信 ≠ 安全它只能证明是谁证明不了好不好这是最大的一个坑。很多人默认通过了可信度量 这段代码没有漏洞 这段代码不是恶意代码三件事其实一件都不成立。可信计算检查不出一段可信代码里有没有漏洞它只能检查这段代码是不是某个已知来源发布的——是就判为可信。它同样判断不了一段代码是不是恶意代码因为这个功能压根不在它的设计目标里。用一句大白话概括它验的是身份证不是体检报告。为什么容易混因为可信这个词在中文里天然带着可靠、没问题的意味。怎么区分记住它给出的结论永远是这台机器的软硬件组合是某个特定状态而不是这个状态是安全的。状态安不安全得由拿着这份状态报告的人自己去判断——挑战方拿着 PCR 值和期望值比对期望值是谁定的是人定的。所以原资料里那句对于不希望有漏洞的系统和不希望有不可信的代码这两个愿望可信计算实际上无能为力说的就是这个边界。搞不清这条边界后面所有讨论都会跑偏。4.2 哈希 ≠ 加密一个回不去一个回得去哈希和加密经常被当成同义词其实方向完全相反。哈希是单向的给定输入算出定长输出但从输出推不回输入加密是可逆的有密钥就能还原。哈希的三个性质值得记牢输入敏感原文改动一个字节输出面目全非不可逆有限时间和资源内推不回原文抗冲突很难找到两段不同内容却产生相同哈希值。常见的算法有 MD4、MD5、SHA-1 这几代SHA-1 输出 160 位抗穷举能力比前两者更好。它们的设计思路一脉相承后一代基本是在前一代基础上加固。加密则分两大家族。对称加密加解密用同一把钥匙DES 用 56 位密钥、速度较快AES 是它的替代者、速度和安全级别都更高RC5 以简洁和参数可变著称Blowfish 是 64 位分组、密钥长度可变的方案特点是快、紧凑、可免费使用且至今没发现有效破解方法。它们的共同适用场景是加密大量数据。非对称加密用一对钥匙公钥加密私钥解密。RSA 的可靠性建立在大整数分解的难度上钥匙够长时实际上无法破解主要用于数字签名ElGamal 基于密钥交换的思路安全性依赖有限域上离散对数这个难题用于公钥加密和电子商业椭圆曲线算法是替代 RSA 的有力竞争者160 位就能达到 1024 位 RSA 的安全强度计算量小、处理速度快、密钥尺寸和系统参数小得多、带宽要求也低。类型代表算法关键特征典型场景对称DES56 位密钥速度快大量数据加密对称AES替代 DES速度快、安全级别高大量数据加密对称RC5简洁参数可变的分组密码分组加密对称Blowfish64 位分组密钥长度可变短数据加密非对称RSA依赖大整数分解难度数字签名非对称ElGamal依赖离散对数难题公钥加密、电子商业非对称椭圆曲线密钥短、速度快、带宽要求低公钥加密、电子商业为什么要分两套因为对称快但钥匙配送难非对称解决了配送问题但慢。实际系统里通常是两者配合非对称用来协商和签名对称用来干活。那证书和公私钥对又是什么关系证书里装着公钥同时把这把公钥属于谁这件事也装了进去而私钥产生的签名可以用证书里的公钥来验证。公钥基础设施PKI的价值就在这儿——它能证明公钥和身份的对应关系有了这个前提网络通信才谈得上可信。它属于信息安全技术的核心也是电子商务的基础之一。4.3 静态度量根 ≠ 动态度量根起点不同能保证的东西也不同这两个词长得像作用范围差得很远。静态根的起点是固化的引导代码覆盖 BIOS、引导程序一路到操作系统链长、覆盖面广但只能在启动时建立想再证明一次就得重启。动态根的起点是处理器的一条安全指令把 BIOS 和引导程序整个跳过可以在运行时重新建立也因此能提供静态根给不了的运行时保证。怎么快速区分看它从哪开始量和什么时候能建立。从固化代码开始、只在开机时能做的是静态从处理器指令开始、运行中也能做的是动态。两者不是替代关系实际系统里往往是静态根先建立基本信任动态根在需要时再补一次更细的度量。4.4 度量日志不防篡改凭什么可信这个疑惑很自然既然日志放在 TPM 外面的普通文件里攻击者直接改掉不就行了那还留着干嘛答案在于日志的定位不是可信存储而是可验证的展开。TPM 内部空间有限存不下与运行状态相关的完整信息只能存摘要所以完整记录必须放到外面。但放出去不要紧因为 PCR 里存的是这些记录的摘要而且不可伪造。攻击者改了日志重算摘要时就会和 PCR 对不上一眼就露馅。换句话说日志的安全性不靠它自己靠的是那个它永远改不动的对照物。这有点像发票和税务系统发票本身可以造假但系统里那一笔记录改不了一对就知道。5. 有了 TPM 为什么还要 vTPM回滚这个坑到底怎么埋5.1 一台物理机一个 TPM分不过来虚拟化普及之后硬件 TPM 的模型开始别扭。它是一台物理机配一个而云上一台物理机跑着几十台虚拟机。如果按老办法一台虚拟机要进安全环境其他虚拟机就得暂停——这显然不现实。真正想要的是每台虚拟机都有自己的安全环境、自己的身份密钥、自己的数据彼此不干扰。还有一个效率账。很多时候只需要验证某一台虚拟机的安全状态没必要把整个物理平台都挑战一遍。把 TPM 虚拟化之后一个物理 TPM 就能服务多台虚拟机每台有独立的实例验证粒度也从整机细到单机。顺带说个现实问题一个 vTPM 服务一组虚拟机时性能上有开销因为需要高安全环境的应用往往行为相似比如各个用户都要弹窗输密码如果给它们提供一个公用的高安全环境开销能省下不少。安全上也有新风险vTPM 管理器本身可能被篡改或者管理域被攻破那上面所有的实例都跟着不可信。5.2 虚拟机回滚为什么和可信计算打架回滚是虚拟化的日常操作出问题了退回上一个快照。问题在于虚拟机退回去了vTPM 的状态却不一定跟着退两边的状态就对不上了。设想一个典型攻击攻击者先让虚拟机正常启动此时 TPM 记录的状态是干净的然后他把虚拟机回滚到某个已经植入恶意代码的旧快照。因为 vTPM 没回滚它依然认为平台是可信的可实际跑的东西已经换了。这就叫安全状态不一致——TPM 的证词和机器的实际状态脱了钩。那干脆把 vTPM 也一起回滚呢又会引出新麻烦。一是数据丢失回滚点之后新产生的密钥、新写入的密封数据全没了二是重放攻击攻击者每次做远程证明之前都把状态回滚到可信的那个时刻等于每次都交出一份清白的旧证词入侵痕迹被抹得干干净净。单纯回滚 TPM 数据这两条都躲不掉。再看一个容易被忽略的后果很多限量试用的软件是借助 vTPM 里的数据来做次数验证的而这些数据可以回滚于是限量就变成了无限。加上前面说的密封密钥解不开——PCR 没回滚密封时绑定的状态和现在不符数据自然释放不出来。5.3 部分回滚该退的退不该退的钉死解法思路上其实就一句话不是所有东西都该跟着回滚。PCR 要回滚因为它代表的是机器当前状态机器退了它必须退不然一致性就没了。密钥不要回滚因为过期的密钥本来就不该再用而新产生的密钥一旦被抹掉就再也找不回来损失是实打实的。光这样还不够重放攻击还得单独堵。做法是再加两组永不回滚的 PCR专门用来记录回滚这件事本身快照时间、执行快照命令的用户信息、回滚前的 vTPM 状态、回滚前的虚拟机状态把这些信息的度量值分别扩展进那两组 PCR。因为这两组 PCR 永远不回滚它们就忠实地刻画了整台虚拟机的回滚轨迹——你可以回滚你的机器但你回滚不掉你回滚过这个事实。攻击者想靠回滚消除痕迹从根上就行不通了。对象是否回滚理由PCR 值回滚保证虚拟机状态与 vTPM 状态一致密钥数据不回滚避免新产生的密钥丢失回滚记录 PCR不回滚记录回滚时间、用户、双方状态防重放这套设计里新增的 PCR承担的角色和前面提到的动态度量 PCR 有点像都是拿一组不会被随意改动的寄存器去锚定一段本来容易被抹掉的历史。至于 vTPM 管理器本身它的活儿是把上面这些串起来。它通常跑三个线程一个对接 TPM 硬件驱动一个管理各个 vTPM 实例一个连接前后端驱动。收到一条指令先判断是哪个 vTPM 发来的再根据 Locality 级别判断是第几环最后才决定怎么处理。为了效率实例之间传递指令用共享内存而不是走网络栈——毕竟都在同一台物理机上没必要绕远路。6. 什么时候该用可信计算、什么时候别指望它把前面几章拼起来判断标准其实不复杂它能回答的是这台机器现在的软硬件状态是什么回答不了这个状态安不安全这段代码有没有问题。所以用不用它取决于你要的是不是这个答案。下面这张表可以当快速对照你的诉求可信计算能不能帮上向远端证明这台机器跑的是哪套固件和内核能靠远程证明和度量日志重放让敏感数据只在特定系统状态下才可解密能靠密封密钥绑定 PCR每台虚拟机要有独立身份互不干扰能靠 vTPM 实例发现系统启动过程被替换过能PCR 值对不上就露馅判断一段代码里有没有漏洞不能它只看来源不看质量判断一段代码是不是恶意代码不能这个功能不在设计目标里防住系统运行起来之后的内存攻击静态根不行动态根也只能覆盖建立信任的那一段替代杀毒、入侵检测这类运行时防护不能定位完全不同举个具体例子。假设某公司要做一个敏感配置只允许在合规机器上读取的功能正确做法是把配置用密封密钥绑到一组 PCR 值上机器状态不符就解不开这是可信计算的标准用法。但如果有人想用它来判断这段从外部拿来的脚本安不安全那就用错了工具——它顶多告诉你这段脚本来自某个可信发布方脚本里写了什么、有没有后门它一概不知。这个区别如果用错血泪经验往往就从此而来。再看一个反面场景。有些团队给系统上了可信启动就觉得运行时的安全问题也一并解决了于是放松了补丁管理和运行时监控。实际上静态可信根只保证装载那一刻的状态系统跑起来之后攻击者完全可以用缓冲区溢出替换掉一个可执行文件而 PCR 里存的还是启动时的那套值看不出任何异常。这时候真正能救场的是运行时防护和补丁不是 PCR。还有一类场景要慎用如果业务本身对性能极其敏感而每一次远程证明都要读日志、重放扩展、做签名验证这套流程的开销是实打实的。能用一次挑战解决的事不要做成每条请求都挑战一遍。我自己的教训是早年间做过一个模拟项目当时把可信启动当成了护身符觉得机器都验过了后面就高枕无忧结果一个运行期的问题照样翻车排查时才发现 TPM 那边的记录干干净净——因为它压根没打算管运行期的事。从那以后我每次看到可信两个字都强制走一遍同样的自问它到底证明了什么、证明到哪一步为止、这个结论能撑多久。问完这三个问题很多设计上的误会就自动消失了。如果你正在准备相关的课程测试或者只是想把这一堆名词一次理顺这份按概念重新归过类的题目与答案可以配着看先拿这篇把框架搭起来再回去做题名词之间就不会再打架了。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站