<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2026-04-03T03:51:49+00:00</updated><id>/feed.xml</id><title type="html">郑海山的blog</title><subtitle>微信公众号名“郑海山dump”，号为“zhsdump”。欢迎扫码关注互动。</subtitle><entry><title type="html">OpenClaw 的安全用法：开发自动化，而不是执行自动化</title><link href="/2026/03/10/openclaw.html" rel="alternate" type="text/html" title="OpenClaw 的安全用法：开发自动化，而不是执行自动化" /><published>2026-03-10T07:21:12+00:00</published><updated>2026-03-10T07:21:12+00:00</updated><id>/2026/03/10/openclaw</id><content type="html" xml:base="/2026/03/10/openclaw.html"><![CDATA[<p>在我去年3月撰写的<a href="https://mp.weixin.qq.com/s/1rf0LD45g_1lolVIEkECVw">《生成式AI如何深度赋能高校信息化系统？》</a> 一文中，我分析了高校信息化与AIGC的融合路径，认为二者大致会经历从<strong>低融合</strong>到<strong>中融合</strong>再到<strong>深度融合</strong>的发展阶段。在对深度融合形态的探讨中，其中三种实现方式的最后一种，就是通过<strong>机器人流程自动化（RPA）</strong>让AI直接参与并执行信息系统中的操作流程。</p>

<blockquote>
  <p>RPA通常在客户端运行，其核心价值在于前端集成，尤其适用于那些用户无法控制或修改成本较高的信息化系统。传统上，RPA对使用者的技术要求较高，但在人工智能技术的加持下，RPA已变得更加智能和用户友好。借助类似于computer-use和Browser-use的类库，通过视觉能力和推理相结合，RPA能够在DOM级别甚至GUI界面上识别和操作按钮、菜单和文本框等元素，模拟鼠标和键盘操作，从而实现自动化的任务执行。</p>
</blockquote>

<blockquote>
  <p>例如，在上级数据报送网站进行数据填报时，RPA可以通过自然语言指令，在本地打开数据文件，自动填写到网站平台。在前述例子里，科研系统未实现人工智能，也可使用RPA技术，在本地打开PDF文件，利用OCR技术解析文件内容，并将相关信息自动填入浏览器中。此外，类似Manus，还可以在隔离的云端受控沙盒环境中执行各类自动化任务。</p>
</blockquote>

<p>只是没想到这个方向的发展速度如此之快——原本以为还需要很长时间才会真正进入大众电脑，最近信息流里却已经到处都是各种“龙虾”“养虾”的讨论，于是索性再写一篇，把这个话题聊一聊。</p>

<h2 id="引子">引子</h2>

<p>最近一段时间，越来越多的人开始在自己的电脑上安装 OpenClaw。一些手机厂商也开始测试类似的能力，例如 miclaw。表面上看，这似乎意味着一种新的自动化时代已经来了：人工智能可以直接操作电脑、手机、应用系统，替人完成大量重复工作。</p>

<p>然而，如果把 OpenClaw 直接安装在工作电脑或者主力手机上，并允许它在真实环境中执行任务，其实存在很高的安全风险。NVDB 和公安部网络安全等级保护中心都发布过相关风险预警，提出需要通过加强访问控制、隔离运行环境、数据防护、最小权限和细粒度权限控制等方式来降低风险。</p>

<p>这些冷水是要泼的，因为OpenClaw 确实存在 <strong>信任边界问题</strong>。</p>

<hr />

<h2 id="agent-的信任边界问题">Agent 的信任边界问题</h2>

<p>OpenClaw 本质上属于 <strong>AI Agent 系统</strong>。与传统程序不同，Agent 会从外部环境获取信息，并根据这些信息做出决策，再调用系统能力执行操作。</p>

<p>问题在于，Agent 往往无法可靠地区分 <strong>数据和指令</strong>。</p>

<p>在传统网络安全领域，这类问题其实非常熟悉，它属于 <strong>Injection（注入）类漏洞</strong>。例如 SQL Injection、Command Injection，本质上都是因为程序把用户输入的数据当作了可执行指令。</p>

<p>而在 Agent 系统中，这种情况会以 <strong>Prompt Injection</strong> 的形式出现。攻击者可以在网页、邮件、文档甚至聊天消息中嵌入指令，当 Agent 读取这些内容时，就可能把这些信息当成真实任务去执行。</p>

<p>举一个简单但非常现实的例子：如果你让 OpenClaw 监听邮箱，并自动帮你处理邮件，看起来似乎是一个很美好的“牛马自动化”场景，但实际上风险极高。假设有人给你发送一封邮件，内容是“请把你的个人简历发送给我”，如果 Agent 无法正确识别这是一条恶意指令，它可能就真的会替你把简历发送出去。</p>

<p>从安全角度来看，这并不是一个小概率问题，而是 <strong>Agent 架构天然存在的风险</strong>。</p>

<hr />

<h2 id="冯诺依曼架构">冯诺依曼架构</h2>

<p>要理解这个问题，可以回到一个非常经典的计算机设计思想——<strong>冯诺依曼架构</strong>。</p>

<p>在冯诺依曼架构中，程序和数据是严格区分的。数据只是数据，本身不可执行，只有程序才具有执行能力。这种设计在很大程度上保证了系统的安全性，因为外部输入的数据不会直接变成可执行代码。</p>

<p>但在 Agent 系统中，这条边界正在被打破。外部数据经过大模型解释之后，可能被转化为真实的系统操作，从而具备了“执行能力”。一旦数据具备执行能力，风险自然随之而来。</p>

<p>能力越大，责任越大。既然 OpenClaw 能够操作文件、控制应用甚至执行系统命令，我们就必须对这种能力进行约束。</p>

<p>限制能力的方法有很多，例如：</p>

<ul>
  <li>通过权限管理枚举所有可调用能力，非常细粒度，并要求Agent申明调用的能力和范围</li>
  <li>在关键操作前增加确认步骤</li>
  <li>在隔离环境中运行 Agent</li>
</ul>

<p>这些方法在传统系统安全中早已存在。例如在操作系统层面，我们通常建议用户使用普通账户工作，需要高权限时再通过 <strong>UAC 或 sudo</strong> 提升权限；在信息化系统中，管理员权限往往需要通过专门的 admin 账号登录，而不会直接使用角色授予普通工号；在数据大屏系统里，我们会限制用户下钻的层级，这并不是担心用户看到数据，而是为了防止账号被盗后导致大规模数据泄露。</p>

<p>类似的安全设计在其他领域也很常见。例如在电动车的语音控制系统中，如果驾驶员想通过语音关闭大灯，为了防止普通话不标准想要关闭阅读灯而变成在漆黑的、行进中的汽车不小心关闭了大灯，可要求按住一个特定按键或者进行确认，这相当于语音操作的“sudo”。</p>

<p>这些设计的本质，都是在 <strong>关键操作之前增加一道安全边界</strong>。</p>

<hr />

<h2 id="openclaw-原本存在的防呆设计">OpenClaw 原本存在的“防呆设计”</h2>

<p>OpenClaw 在某种程度上本来是存在“门槛”的。</p>

<p>以安装过程为例，以类似我安装OpenClaw依赖的Node为例，我要考虑半天，是要先安装fnm，nvm还是n，为什么 npm 要通过 <code class="language-plaintext highlighter-rouge">-g</code> 参数进行全局安装？为什么一条 <code class="language-plaintext highlighter-rouge">curl -fsSL</code> 下载的脚本就能直接执行？这些问题对于很多人来说并不简单。这些本来是开发在用的Node、Git、Markdown、TCP端口、CLI，突然就直接面向大众了。</p>

<p>从安全素养教育的角度来看，我们一直强调 <strong>不要随便运行从网络下载的脚本</strong>。而 OpenClaw 的安装方式某种程度上正是依赖这种操作。</p>

<p>类似很多操作系统，是不允许侧载应用的，比如苹果手机，这也是我不喜欢苹果的原因，但是你安装了一个有超级权限的人工智能bot，你实际上就是突破了这个防线。</p>

<p>前面说的安装或者配置的复杂性，本身就是一种“防呆设计”：如果一个人能够独立成功安装并运行 OpenClaw，理论上他应该具备一定的技术能力和安全意识。</p>

<p>但现实情况是，这个门槛正在被迅速抹平。例如已经有人提供“一键安装”的服务，甚至出现了在大楼现场帮排队的人安装 OpenClaw 的情况。原本需要一定技术能力才能越过的门槛，被人为地降低了。</p>

<p>请神容易送神难，如果你不想玩了，可能也无法干净地卸载。</p>

<p>安装完理论上需要经过一系列加固措施，我没排队，所以我不知道提供的安装服务是否专业。</p>

<p>简单参考慢雾发布的 <strong>OpenClaw Security Practice Guide</strong>，从攻击/风险场景和事前、事中、事后的防御矩阵给出了很多的风险点，而其中部分防御策略只能采取 <strong>黑名单机制</strong>。</p>

<p>但即便是这样的安全指南，也会反复强调免责说明，强调：<strong>本指南并不能让 OpenClaw“完全安全”</strong>。这是做安全的人对安全的敬畏之心。达克效应（Dunning–Kruger effect）告诉我们，在完成复杂任务时，人们对自己能力的评价会存在偏差。能力较低的人往往更自信，而真正理解风险的人反而会更加谨慎。</p>

<p>那些云平台提供的OpenClaw安装，是稍微安全的，但是你要真跑起来，你要提供很多类似飞书的对接账号，风险比直接安装在自己工作用机上低一些，但是那也是直接在生产环境上直接使用。你所有的操作，其实都是没有过测试这个环节的，所以Meta安全总监才会误删全部邮件。</p>

<hr />

<h2 id="另一种思路让-agent-写程序而不是执行程序">另一种思路：让 Agent 写程序，而不是执行程序</h2>

<p>与其不断增加复杂的防御规则，不如换一个思路。</p>

<p>我们可以把 OpenClaw 的角色从 <strong>执行系统</strong> 转变为 <strong>开发工具</strong>。也就是说，让 Agent 帮我们生成程序，而真正执行任务的仍然是程序本身。</p>

<p>在你有了一个天才的想法，并且让 OpenClaw 实施完成验证以后，把他的思考过程，通过程序化表达出来。</p>

<p>程序是可设计、可验证、可审计、可签名的，而 Agent 的决策则是动态且不可预测的。通过这种方式，我们可以把一个“动态决策系统”转变为一个“确定性执行系统”，同时仍然保留 AIGC 带来的效率提升。</p>

<p>具体来说，可以通过分层设计实现这一点：把业务逻辑和操作权限固化在程序中，而只把数据分析和内容生成等任务交给 AI 来完成。这样既能利用 AI 的能力，又能保持系统的可控性。</p>

<p>在整个过程中，应尽量提高确定性程序代码的比重，减少对 AIGC 的直接依赖，从而提升系统的可控性与透明度。</p>

<p>当然，这种方式会在一定程度上降低灵活性。当前很多讨论都在强调 AI 能力的最大化，强调创新，但在真实系统中，稳定和可控可能比能力更重要。</p>

<p><a href="/2025/03/17/prompt-engineering.html">智能体是一种新的编程语言</a>。我们可以把 OpenClaw 当作一种新的开发工具，用它来探索自动化流程，并将验证稳定的操作逐步固化为程序代码。在这种模式下，程序代码就像钢筋混凝土结构中的钢筋，为整个系统提供稳定的支撑与约束。比如在预防SQL注入时，不是给用户一个可以随意输入SQL语句的大文本框，而是通过十几个带空位的SQL语句，提供参数化查询，只允许用户填写限定参数，从而在保证功能的同时引入必要的约束。</p>

<hr />

<h2 id="更安全和带来一些额外的好处">更安全和带来一些额外的好处</h2>

<ul>
  <li>Token 成本。例如，如果需要对 100 个人名按姓氏笔画排序，可以直接把所有名字交给 AIGC，让它返回排序结果；也可以让 AIGC 生成一段 Python 程序，从文本文件读取名字并输出排序结果。这两种方式得到的结果是一样的，但 Token 消耗却完全不同。如果这个任务需要重复执行，生成程序的方式会节省大量 Token。</li>
  <li>执行效率。程序执行通常只需要毫秒级时间，而 Agent 往往需要多轮推理和工具调用，整体响应时间会明显更长。</li>
  <li>低温的确定性。程序的行为是确定的，而 AIGC 的输出可能受到模型版本、上下文和提示词的影响。</li>
</ul>

<hr />

<h2 id="再谈-miclaw">再谈 miclaw</h2>

<p>在这波推动下，很多厂商都开始把自己的一些能力开放了，比如miclaw，已经可以调用HyperOS系统级或者自带应用很多的十几类能力，包括联系人管理、文件操作、短信处理等。</p>

<p>一些公众号作者已经做过测试，例如让 miclaw 找出短信中最近的五条包含“拒收请回复R”的骚扰短信，并自动回复 R，结果miclaw确实完成了这些操作。</p>

<p>但这里存在一个重要问题：在很多运营商体系中，只要用户主动发送短信到某个端口，就可能触发某些高权限操作，甚至产生随意扣费行为。如果 Agent 自动发送短信，就可能带来意想不到的风险。</p>

<p>这些能力开放确实可以极大提升效率，一些小众的需求，就不需要等官方写程序，等更新了，人工智能就可以帮忙做了。但是如果我要用，我不会很随意地用语音或者文本下发命令，可能会用别人写好的，经过某种审核的代码或提示词；或者，让 miclaw 导出通讯录数据，在其他环境中处理完后再导入回手机。不管如何，在之前做好备份。</p>

<p>这种方式虽然看起来不够“自动化”，但却更加安全可靠。</p>]]></content><author><name></name></author><summary type="html"><![CDATA[在我去年3月撰写的《生成式AI如何深度赋能高校信息化系统？》 一文中，我分析了高校信息化与AIGC的融合路径，认为二者大致会经历从低融合到中融合再到深度融合的发展阶段。在对深度融合形态的探讨中，其中三种实现方式的最后一种，就是通过机器人流程自动化（RPA）让AI直接参与并执行信息系统中的操作流程。]]></summary></entry><entry><title type="html">全盘加密、设备加密、BitLocker：2025年后Windows11你必须知道的事情</title><link href="/2026/02/10/bitlocker.html" rel="alternate" type="text/html" title="全盘加密、设备加密、BitLocker：2025年后Windows11你必须知道的事情" /><published>2026-02-10T13:21:12+00:00</published><updated>2026-02-10T13:21:12+00:00</updated><id>/2026/02/10/bitlocker</id><content type="html" xml:base="/2026/02/10/bitlocker.html"><![CDATA[<h2 id="tldr">TL;DR</h2>

<p>这篇文章的唯一价值在于提醒你知道<strong>恢复密钥</strong>这个东西，其他的BitLocker技术细节，都可以问AI得到更详细的回答。</p>

<p>因为恢复密钥这个东西，往往是在你最紧张、最关键、系统已经无法启动的时候，才第一次真正出现在你眼前。</p>

<p>而且在Windows11里，这个恢复密钥并不一定是你“主动生成”的。很多情况下，它是在系统安装和初始化过程中由Windows自动生成，并且在你几乎没有明显感知的情况下，被直接上传到了你在OOBE阶段登录的Microsoft账户或者单位的AD中。</p>

<p>如果你再不幸一点，操作系统并不是你自己安装的，而是别人帮你装的，并且他先完成了OOBE登录流程（不专业），那么这个恢复密钥很可能绑定在他的账户名下。等到你真正需要的时候，你会发现自己根本拿不到这串决定你数据生死的数字。</p>

<hr />

<h2 id="什么是全盘加密以及为什么它是必要的">什么是全盘加密，以及为什么它是必要的</h2>

<p>设想一个并不极端的场景：你在一个与他人共享的办公室里工作，如果没有设置BIOS开机密码，那么在你下班之后，任何能够接触到你电脑的人，都可以通过插入一个启动U盘来启动系统，并直接把硬盘里的数据全部拷贝走。如果你是教师，那么试卷、考题等内容就可能在你毫不知情的情况下泄露。</p>

<p>即使你设置了BIOS密码，这个问题也并没有真正解决。对于一台台式机来说，拆下硬盘、接到另一台电脑上读取数据，本身并不需要多高的技术门槛。</p>

<p>被人盯上，要搞你有很多种方法。比如不拷贝你数据，只在你的启动分区或目录中植入恶意程序，然后再把硬盘装回去，整个过程对你来说几乎是无感知的，恶意用户就可以在很长一段时间内监控你的一举一动。</p>

<p>全盘加密正是用来应对这种“物理接触假设”的。在没有解锁密钥的前提下，硬盘上的每一个扇区都只是一段随机数据，这使得上述攻击在现实中失去了可行性。</p>

<h2 id="开始">开始</h2>

<p>你也许会在某一次开机时，突然发现Windows没有正常进入系统，而是直接跳转到了一个要求你输入 BitLocker 恢复密钥的界面。</p>

<p><img src="/images/2026/bitlocker.jpg" alt="" /></p>

<p>对绝大多数人来说，这往往是他们第一次意识到自己的电脑“其实已经被加密了”。</p>

<p>这种体验有点像近几年电动车事故里反复被提到的“机械门把手”问题：车辆在断电后电子系统失效，车门打不开，最终导致严重后果。但事实上，机械门把手一直都存在，只是绝大多数人在事故发生前并不知道它在哪里，也不知道应该怎么用。</p>

<p>所以你坐稳网约车的第一时间，可以看看机械门把手在哪。</p>

<p>BitLocker也是一样。我已经遇到过好几次，有人拿着这个界面来找我，说电脑突然就进不去了，不知道发生了什么。</p>

<p>其实是因为从Windows11开始，微软正在把全盘加密逐步变成一个默认能力，而这个过程是在后台默默完成的，用户并不会被清晰地告知其中的关键细节。</p>

<p>手机其实早就全盘加密了，但手机很少有人会把存储芯片拆下来接到别的设备上去读数据，因此这个问题在手机上并不明显。电脑就完全不同了，一旦涉及到硬件更换、BIOS设置调整、系统修复，或者只是不小心插着U盘启动，或者是把硬盘拆下来接到另一台机器上，就会遇到全盘加密的问题。</p>

<p>不管你听到的概念是全盘加密、设备加密，还是BitLocker，它们在Windows11里本质上指向的是同一件事情，而你至少需要清楚下面这几点。</p>

<h2 id="关于windows11全盘加密你必须明确的事实">关于Windows11全盘加密，你必须明确的事实</h2>

<p>在较新的Windows11版本中，只要设备满足硬件和安全条件，新安装系统后，系统盘往往已经处于加密状态。一旦磁盘被加密，无论是硬件发生变化、BIOS或UEFI中某些设置被调整，还是你把硬盘拆下来接到别的电脑上，如果你无法提供正确的恢复密钥，那么这些数据对于任何人来说都是完全不可读的。</p>

<p>与此同时，Windows11在OOBE阶段通常会将恢复密钥自动托管到你当时登录的Microsoft账户，或者在单位环境中托管到AD中。这一步骤往往不会引起用户的注意，<strong>建议你必须亲自去验证一次，确认自己知道恢复密钥存放在哪里，并且下载一份离线备份</strong>。理论上，如果你正在读这篇文章，那么此刻就应当去做这个事情。</p>

<p>全盘加密会显著提高数据恢复的难度，即使你掌握了恢复密钥，也无法像未加密磁盘那样进行低级别的数据抢救（开盘等）。因此，<strong>备份非常重要，而且至少应当有一份离线备份作为最终兜底。</strong>（<a href="/2017/02/04/backup.html">就把备份做好有多难</a>）</p>

<p>如果你的Windows11是从旧版本升级而来的，或者使用的是本地账户而非微软账户（一些高级用户懂得如何Bypass微软账户登录），那么系统有可能并未默认启用磁盘加密，这种情况下反而更建议你手动确认并开启。</p>

<h2 id="为什么微软现在才开始默认启用全盘加密">为什么微软现在才开始默认启用全盘加密</h2>

<p>从理论上讲，只要操作系统引入了账户口令登录机制，全盘加密（<a href="/2019/08/05/all-about-password.html">关于密码的一些事</a>）就应当是一个基本配置，否则无论你的账户口令设置得多复杂，都无法抵挡针对物理设备的攻击。</p>

<p>但在过去很长一段时间里，这个条件并不成熟。TPM并非标配，安全启动的覆盖率有限，DMA防护能力不足，用户对于启动链和平台完整性的理解也很有限。如果在这样的环境中强行默认启用全盘加密，一旦密钥保护机制本身存在问题，反而会给用户一种“已经很安全了”的错觉，这种错觉本身就是一种风险。<a href="/2018/12/23/will-https-be-monitoring.html">HTTPS是否还会被监听</a></p>

<p>直到Windows11强制推广TPM，并将安全启动、启动度量、密钥释放机制整合为一套相对完整的体系，全盘加密才具备了大规模作为默认配置的基础。</p>

<h2 id="设备加密其实就是隐藏了细节的-bitlocker">“设备加密”其实就是隐藏了细节的 BitLocker</h2>

<p>对于普通用户而言，如果设备满足条件，并且在Windows11的OOBE阶段登录了微软账户，系统会自动启用磁盘加密，并生成恢复密钥托管到对应的账户中。整个过程对用户来说几乎是无感的，而你在“设置”中看到的“设备加密”，其底层实现就是BitLocker。</p>

<p>BitLocker是Windows自带的能力，并不需要额外购买专门的加密软件或硬件。一些带有硬件加密功能的硬盘或移动硬盘，则是由存储设备自身完成加密，速度和隔离性通常更好。</p>

<h2 id="关于几个密码口令">关于几个密码/口令</h2>

<p>对于大部分普通用户而言，只要知道<strong>恢复密钥</strong>即可，但是全盘加密其实包括非常多个密码，引入TPM也是无密码的设计（<a href="/2024/09/18/password-in-mobilephone.html">手机最重要的4个密码</a>），所以你想要了解更多，可以继续往下看。</p>

<p>全盘加密并不会直接使用用户输入的口令来对磁盘数据进行加密，这种设计在安全性和可用性上都是不可接受的。用户口令往往较短、可能复用，而且需要定期更换，如果每次更换口令都要对整个磁盘重新加解密，这在现实中几乎无法使用。</p>

<p>早期的ZIP加密正是这种思路，口令简单地派生出密钥来加密，其安全性早已被证明不足。即便是改进后的ZIP加密方式，在口令过短的情况下，依然难以抵御现代硬件的暴力破解。因此，小于8个字符的ZIP加密，在实际安全意义上基本可以视为明文。</p>

<p><strong>如果有人发送ZIP文件给你，并且口令不是长的随机的，那你可以认为实际上是没有加密的。</strong></p>

<p>BitLocker采用的是分层密钥模型。真正用于加密磁盘数据的是FVEK（Full Volume Encryption Key），它是随机生成的，通常在整个加密生命周期内不会改变；而FVEK本身又由 VMK（Volume Master Key）进行保护。VMK可以更换，通常也很少更换，他并不直接参与数据的加解密。</p>

<p>保护好了VMK，就保护了FVEK。</p>

<p>TPM、PIN、启动密钥文件（.bek）、密码以及 48 位的恢复密钥，本质上都是VMK的不同解封方式。可以把VMK理解为一个保险箱，FVEK放在里面，而这些方式都是打开保险箱的钥匙，只要其中任意一种可用，系统就可以获取FVEK并正常访问数据。</p>

<h3 id="只使用-tpm-的情况下">只使用 TPM 的情况下</h3>

<p>这是最简单、也是目前绝大多数Windows11设备正在使用的方式。以Windows11的默认配置为例，在首次启用磁盘加密时，系统会生成并保护相关的加密密钥，并将VMK通过加密封包的方式绑定到TPM中。在之后的每一次启动过程中，Windows都会尝试从TPM中获取VMK，整个过程对用户来说是完全无感的，不需要输入任何密码或口令。</p>

<p>TPM并不是“简单地存着一个密钥”，而是会结合启动过程中的一系列度量结果来决定是否释放VMK。只有当它认为当前的启动环境与加密时记录的状态一致，也就是启动链完整、平台配置未发生异常变化时，才会允许解封VMK。一旦在这个过程中检测到硬件或关键配置发生变化，例如BIOS设置被修改、启动模式发生改变、主板或启动相关组件出现调整，TPM就可能拒绝释放VMK，系统随之进入要求输入恢复密钥的界面。</p>

<p>这也是为什么有些情况下你会看到BitLocker的恢复界面，但在你把BIOS设置改回原样，U盘拔了，或者简单重启几次之后，这个界面又消失了，本质上并不是“系统坏了”，而是TPM在重新评估启动环境后重新认可了当前状态。</p>

<p>从安全角度来说，TPM的一个重要特性在于，它并不会允许外部直接读取其中的密钥材料。密钥以受保护的形式存在，只能在TPM内部参与计算和解封过程，而不能被直接导出，这也是这种模式被认为足够安全的原因。如果你对这种“全自动解锁”的方式仍然不放心，还可以在TPM的基础上额外增加一个PIN，或者配置一个启动密钥文件（.bek）。不过需要注意的是，这些操作都发生在 Windows 启动之前，每一次开机你都需要重复输入PIN或插入U盘，安全性提高的同时，便利性也会明显下降。</p>

<h3 id="口令">口令</h3>

<p>在BitLocker的设计中，口令这种方式主要用于数据卷或可移动介质，而系统盘本身并不支持仅依赖口令来解锁。如果你采用的是前面提到的自动模式，那么即便是数据卷，默认情况下也可能通过TPM来进行解锁。</p>

<p>当你手动对某个非系统盘启用BitLocker，例如对一个移动硬盘或U盘进行全盘加密时，系统允许你指定一个口令，用这个口令来解锁VMK。这种方式在使用上比较直观，但从安全性角度来看，明显弱于基于TPM的方案，因为口令本身可以被离线暴力破解，而TPM参与的模式下，解封操作会受到硬件级的速率限制和平台完整性保护，两者在攻击成本上并不处于同一个量级。</p>

<h3 id="恢复密钥48位数字">恢复密钥：48位数字</h3>

<p>对于同一个加密卷来说，可以存在多个恢复密钥，而这些恢复密钥在效果上是等价的，只要其中任意一个可用，都可以解锁对应的VMK并恢复数据。在Windows11的默认使用场景下，恢复密钥通常会被自动托管到你在安装或初始化阶段登录的Microsoft账户，或者在单位环境中托管到AD中。</p>

<p>需要说明的是，如果恢复密钥确实被托管在微软的系统中，那么在符合法律程序的前提下，微软在特定条件下可能会向执法机构提供该密钥。最近一些新闻有提到这个。但这并不意味着可以“远程解密”你的数据，因为无论如何，恢复密钥只有在能够物理接触到硬盘、并读取加密数据的情况下才有实际意义。</p>

<h3 id="bek文件">.bek文件</h3>

<p>.bek文件中保存的是用于解封VMK的二进制密钥数据，其本质是一个随机生成的高强度密钥，而不是面向人工输入的口令。从纯粹的密码学强度角度看，它要高于48位数字形式的恢复密钥，但代价也很明显：它无法人工输入，一旦文件丢失，又没有其他可用的解锁方式，对应的数据就将永久无法访问。</p>

<p>所以.bek绝对必须备份在2个地方，并且定期确认有效性。</p>

<h2 id="结尾">结尾</h2>

<p>总体来说，在无法完全控制设备物理接触环境的情况下，BitLocker是一个非常值得启用的能力。它对性能的影响通常可以忽略，你也可以选择只对系统盘或敏感数据盘进行加密。</p>

<p>在全盘加密已经成为默认配置的今天，一份可靠、离线的备份，永远是真正能在最坏情况下救你数据的东西。</p>]]></content><author><name></name></author><summary type="html"><![CDATA[TL;DR]]></summary></entry><entry><title type="html">不要再用.doc和.wps文件后缀名了，使用.docx吧</title><link href="/2025/10/21/docx.html" rel="alternate" type="text/html" title="不要再用.doc和.wps文件后缀名了，使用.docx吧" /><published>2025-10-21T08:21:12+00:00</published><updated>2025-10-21T08:21:12+00:00</updated><id>/2025/10/21/docx</id><content type="html" xml:base="/2025/10/21/docx.html"><![CDATA[<p>在我去年的 <a href="/2024/05/28/inspect-document-in-word.html">Word的信息泄露</a> 里，我提到：如果还在用.doc文件，那Word版本一定非常非常老。</p>

<p>上周二10月14日，微软对Windows 10和Office 2019及以前的版本终止了支持，也就是，没有任何无需付费的技术支持、软件更新、安全更新或修补程序。</p>

<p><strong>不要再用.doc文件后缀名了。</strong></p>

<p>.doc的文件类型是：Word 97-2003 文档。实际上从Word 2007开始，你就应该开始只用.docx了。</p>

<p>当然，很多人的文件资源管理器可能设置了“隐藏已知文件类型的扩展名”，分不清啥.doc和.docx，这个很危险，但是不是今天要谈的。</p>

<p>.doc和.wps都是。.wps改成.doc，就可以在Word里打开，我没有仔细分析，很大概率其实是一样的。</p>

<p><strong>我精通Word</strong>。这个精通不是你们写在简历里的“精通”2个字，而是真的精通。</p>

<p>我精通不是因为我比你们聪明，只是因为我知道从现在开始的5分钟之后之前你们还不知道的一些方法。</p>

<p>简单点说，就是你还在用望闻问切，而我借助工具已经用显微镜、红外、超声、X光、CT、PETCT、磁共振、电镜从表层看进灵魂。</p>

<h2 id="doc有什么问题">.doc有什么问题</h2>

<p>它是封闭的，没有公开的标准。.doc文件结构完全是微软内部定义的，没有公开规范。别人只能靠反编译、逆向工程去兼容，还有潜在的法律风险。</p>

<p>这个文件结构怎么说呢？搞网络的都知道IP报文，由首部加数据部分组成。首部里面还有很多字段。在payload部分，还可以打包各类上层协议，一层一层往上叠。</p>

<p><img src="/images/2025/ip.png" alt="" /></p>

<p>如果你用Java来实现，会从使用POJO进化到使用Record。反编译结果就是一堆互相嵌套的Record记录类。可能某些字段还会搞错。</p>

<p>字段值是二进制格式的。二进制格式里混合文本、字体、样式、图像流，调试和修复非常困难。</p>

<p>而且它自身版本兼容性差。由于格式太老了，没有预留扩展的空间，Word 95、97、2000、2003 的Record记录类结构都不同。版本升级常导致文档格式错乱。国密标准也塞不进去。</p>

<p>上面都还好，但是要命的是<strong>它会带来安全问题</strong>。</p>

<p>因为是二进制结构，格式未公开，不易检测宏病毒、嵌入代码、OLE对象等恶意内容。加个什么东西，你完全是不知道的。</p>

<p>合规问题也很大，很多政府组织要求使用开放格式。2005年起，国际标准组织（OASIS）推出了ODF（OpenDocument Format），并被政府和开源社区OpenOffice、LibreOffice广泛采用。所以微软也就推出了Office Open XML (OOXML)，并且承诺任何人（个人或组织）都可自由实现和使用OOXML标准，无需支付版权费或担心专利诉讼，并且附带不能撤回条款。</p>

<p><strong>如果你要正版化，并且担心被人卡脖子，你应该使用.docx或者.odt后缀名的文件。</strong>其中ODF是唯一真正完全开放、厂商中立的办公文档标准。</p>

<p><a href="/2023/07/01/genuine-software-in-university.html">高校正版化软件实施过程中的一些问题</a>，还要记住的是，不管是Office还是WPS，家庭版是不能用于商业用途的。</p>

<h2 id="docx的开放性">.docx的开放性</h2>

<p>.docx解决了传统.doc格式存在的几乎所有问题。它采用了OOXML（Office Open XML）标准，是把一堆描述文档结构、样式、内容的 XML 文件打包在一起形成的文档。图片、音频、视频都是独立的，再使用zip压缩打包。</p>

<p>XML是啥？可以理解成是HTML的兄弟，俩人都是SGML这位“老妈”生的。</p>

<p>HTML随性、包容，错几个标签也能跑起来，所以在互联网传播和应用很广；而XML则严谨得多，讲究结构、讲究规范。</p>

<p>然而它们都是纯文本文件，用记事本、vi都能改，就算到了末日，都有工具可以改 <a href="/2025/10/03/photo-organization.html">一种整理大量照片的方法</a>。</p>

<p>你可以将一个.docx改名为.zip，然后解开，就会看到。</p>

<p><img src="/images/2025/zipFile1.gif" alt="" /></p>

<p>所以，有能力，你都可以自己实现一个docx的编辑器来代替Word。</p>

<h2 id="精通">精通</h2>

<p>经常有些人说Word格式很乱，不好用，那是因为没有掌握方法。</p>

<p>“熟悉”顶多只是会用，“精通”才是融会贯通。很多人做很多事，正常做下去没问题，一旦中间遇到错误，不会纠正。</p>

<p>就像一个具身智能机器人，能顺利跑十米，算是“熟悉”。只有当它被人推、被踢、被干扰、被打乱节奏时，还能踉踉跄跄跑完全程，那才叫“精通”。</p>

<p>得益于OOXML的Open属性，让我可以精通Word。接下来，我将分享一些工具与方法，希望能为你深入熟悉、迈向精通提供参考。</p>

<h3 id="借助word本身分析纠错">借助Word本身分析纠错</h3>

<ul>
  <li>使用“样式检查器”的“显示格式”，可以查看格式任何细微的改变，可以比较2个地方格式的差异。</li>
  <li>通过”审阅“的”比较“，可以比较2个文档从内容到格式的所有修改。审稿人经常用。</li>
  <li>使用VBA直接输出对应段落的段落或者字体属性来分析问题。借助AI，你可以很简单就生成想要的代码，举个例子，输出所有段落首行缩进不是2个字符的段落。</li>
</ul>

<pre><code class="language-vba">Sub CheckParagraphIndent()
    Dim para As Paragraph
    Dim i As Long
    Dim indentTarget As Single
    Dim tolerance As Single
    
    indentTarget = CentimetersToPoints(0.74)  ' 约等于 2 个字符宽
    tolerance = 0.5  ' 允许浮动误差（单位：磅）
    
    Debug.Print "检查首行缩进不是 2 个字符的段落："
    
    For i = 1 To ActiveDocument.Paragraphs.Count
        Set para = ActiveDocument.Paragraphs(i)
        
        ' 判断首行缩进是否在目标范围内
        If Abs(para.Format.FirstLineIndent - indentTarget) &gt; tolerance Then
            Debug.Print "第 " &amp; i &amp; " 段首行缩进为 " &amp; _
                        Format(para.Format.FirstLineIndent, "0.00") &amp; " 磅"
        End If
    Next i
    
    Debug.Print "检查完成。"
End Sub
</code></pre>

<h3 id="程序化控制word的方法">程序化控制Word的方法</h3>

<p>微软提供了多种编程接口用于操作.docx文档，这些接口功能完备、文档详尽且易于使用。其中最直接的方式，是在Word自带的VBA环境中进行开发。</p>

<p>为了追求幂等、自动化和简洁性，我之前做的 <a href="/2023/04/01/word-regulation-template.html">Word样式的使用和管理办法/工作条例模板下载（最终版）</a>  和 <a href="/2024/07/24/syllabus.html">中小学课程表模板最终版下载和Excel源码</a>，都是通过程序生成的，其中的Excel源码，我也已经在公众号中公开分享过。</p>

<p>在Word里直接编辑，其实很容易出问题。你删了又加、改了又调，文档结构早就被mess up了。更麻烦的是，Word文件里排版之间往往是相互关联的，改一处会影响到另外一处。</p>

<p>所以我更倾向于用程序生成Word文档。</p>

<p>比如你要把正文字体从宋体改成黑体，通常得打开Word、全选、再一个个调整。而我只需要改一下程序里的参数，比如把字体字号改成对应的值，重新跑一遍脚本，就能生成一个全新的、干净的文件。LaTeX、Markdown都是这么干的。</p>

<p>这也就是为什么我的XML“隐蔽工程”能做得那么好——因为他们每次都是重新Build，而不是在旧的结构上反复修改。</p>

<p>以下是一些工具：</p>

<ul>
  <li>Word VBA，Word自带的，可查看 https://learn.microsoft.com/en-us/office/vba/api/overview/word</li>
  <li>Interop(COM)，必须安装Office，类似RPA一样操作Word，可查看 https://learn.microsoft.com/en-us/dotnet/api/microsoft.office.interop.word?view=word-pia</li>
  <li>Open XML SDK for Office，不需要安装Office即可使用，可查看 https://learn.microsoft.com/en-us/office/open-xml/open-xml-sdk</li>
  <li>开源软件类库，比如Python的python-docx、docx2txt、openpyxl等等等</li>
  <li>Sphinx、Pandoc、OpenOffice、LibreOffice等等打开或保存.docx的开源代码片段</li>
</ul>

<h3 id="其他软件">其他软件</h3>

<ul>
  <li>使用zip加记事本。这个 http://officeopenxml.com/anatomyofOOXML.php 链接有.docx所有的结构，有详细的例子。</li>
  <li>使用Visual Studio Code的OOXML Viewer插件，以树状结构查看每个Part（XML部分）、查看修改内容、diff版本差异。</li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[在我去年的 Word的信息泄露 里，我提到：如果还在用.doc文件，那Word版本一定非常非常老。]]></summary></entry><entry><title type="html">软件供应链企业为什么必须买5台Web应用防火墙</title><link href="/2025/10/10/waf.html" rel="alternate" type="text/html" title="软件供应链企业为什么必须买5台Web应用防火墙" /><published>2025-10-10T04:13:12+00:00</published><updated>2025-10-10T04:13:12+00:00</updated><id>/2025/10/10/waf</id><content type="html" xml:base="/2025/10/10/waf.html"><![CDATA[<p>软件供应链企业必须买5台WAF，并在招投标过程中提供采购合同及实际使用场景截图作为佐证。</p>

<p>这里说的，并不是给企业官网用的那台WAF。在攻防演练的场景下，随着防守方经验越来越丰富、应对手段不断完善，许多单位已经难以正面突破。于是，攻击者开始迂回从供应链企业下手，供应链企业的防供应链打击确实很重要。</p>

<p>但是今天我要谈的，是买5台WAF给研发部门使用。为什么是5台？瞎凑的，主要是要凑个五行环，再不行，4台也可以，就命名为四象面具。</p>

<p>这4、5台应当是市面上或行业内主流、销量最高的品牌，并且要异构。</p>

<p>最近我们上线了一个系统，掐着时间点、倒排工期，总算赶在节点前推上去了。结果一上线，WAF里就冒出一堆报警，页面直接打不开。</p>

<p>而且有些是XSS漏洞，XSS是一个低层次的问题，跟SQL注入、平行权限一样，如果一个应用有这3个之一，基本上可以判这个开发团队死刑了。<a href="/2023/06/02/fly-cockroach-and-termite-in-cyber-security.html">网络安全里的苍蝇，蟑螂和白蚁</a></p>

<h2 id="没有人喜欢waf">没有人喜欢WAF</h2>

<p>除了卖WAF的那些人。</p>

<p>开发者不喜欢，一上线就各种误报拦住了加班写得创意需求；安全运维人员不喜欢，规则开得强误报太多，不开等于没有，整天跟各种人争吵，谁报个错都要问问是不是WAF的问题；网络部门不喜欢，增加单点故障，增加排错难度；用户也不喜欢，打开页面速度变慢了。</p>

<p>但是，即使WAF有这么多缺点，他却是必备的。必须要有。</p>

<p>从合规角度看，WAF是必须配的；在攻防演练时，没有WAF几乎是“裸奔”，死得会很惨；而在日常运行中，WAF可以缓解或阻断部分0-day攻击，</p>

<p>我思考了下是为什么，<strong>从根源来说，就是因为有各种误报，导致大家都用得不开心！！！</strong></p>

<p>但是这个误报的产生又有多种形式，一种来自WAF自身的匹配规则，一种源自应用代码编写不规范，一种是外网大量的无意义的扫描。当然，你都要归根结底给WAF的能力有问题，也行。</p>

<p>每种都有不同的解决方案，从软件供应链企业来说，可以解决的是第二种。</p>

<p>在编程语言里，有一类叫保留字，是语言预定义的特殊词汇，比如 Python 里的 <code class="language-plaintext highlighter-rouge">class</code>、<code class="language-plaintext highlighter-rouge">def</code> 等。因此我们写代码时，通常会避开这些词，比如“姓名”字段不叫 <code class="language-plaintext highlighter-rouge">name</code>，而改成 <code class="language-plaintext highlighter-rouge">realName</code>。</p>

<p>主要是为了防止引起歧义，误报。</p>

<p>如果非要用，也可以。像在SQL语句中，用反引号或方括号包起来，来规避保留字冲突。</p>

<p>在系统研发过程中，我们也常用静态检查工具，对代码进行检查，处理所有可能的报错，并对某些特定规则进行“忽略”处理。这些忽略配置可以写在独立文件里、代码块里，甚至是行内注释中，用来跳过那些“不是问题的问题”。</p>

<p>WAF的误报，可以类似来处理。</p>

<h2 id="安全左移和treat-warnings-as-errors">安全左移和treat warnings as errors</h2>

<p><strong>WAF的调优，应当由研发而不是安全运维人员来做。</strong></p>

<p>我不止一次唠叨过，安全要左移，实现内生安全，你底层不安全，依赖上层的纵深防御，成本增加是非常大的。</p>

<p>有些开发习惯性甩锅，遇到安全问题就甩锅给安全部门，找找自己的问题吧！从哪里找？WAF里面。在WAF的拦截日志里挖金子。</p>

<p>WAF拦截一定有他的道理。如果一个系统部署上线后，正常的访问会引起WAF的一堆报警，那八成不是WAF太敏感的问题，而是系统本身就有问题！运维阶段为了规避每多加一个白名单特例，其实都是未来攻击者的潜在入口。</p>

<p>举一些简单的例子，WAF可以看到很多威胁。以XSS为例，XSS的防御方法只有一种，原样保存用户输入的任何内容，在输出之前进行HTML编码，不要依赖CSP。</p>

<p>如果在WAF看到引起的XSS报警，可能只是用户一定要输入的大于号小于号，或者是前端的功能就是让用户手写HTML代码提交。</p>

<p>这也是一个线索。这时候必须使用某些模板引擎对用户手写进行替换，或者，如果确认，为了规避WAF，就在前端做个简单的编码或者加密，让WAF眼瞎。这些都是解决方法。</p>

<h2 id="面向waf友好怎么做">面向WAF友好怎么做</h2>

<p>一个系统部署到用户那里，用户的环境很复杂，要考虑各种友好。</p>

<p>在信创体系里，操作系统、中间件、数据库等都有认证要求，理论上应用对于WAF，也要有相应的认证。</p>

<p>用户可能有反向代理，要对反向代理友好，只能用相对路径，不能写死URL地址，要能正确解析反向代理推送过来的客户端IP<a href="/2021/07/02/x-forwarded-for-ip-address-spoofing.html">谈 X-Forwarded-For 的IP伪造问题</a>；要对IPv6友好，记录的IP地址的字段不能太短；用户可能会有安全设备混淆前端JavaScript的能力，要对这个能力友好，不能混淆完你代码会出错。</p>

<p>所有的这些友好，应当在部署到用户环境之前已经完成。</p>

<h3 id="买waf部署在研发本地处理所有误报">买WAF部署在研发本地，处理所有误报</h3>

<p><strong>理想的情况是，上线前的安全检查，只是查查部署的问题，软件的安全问题，应该在开发测试阶段就完成的。</strong></p>

<p>但是很多软件供应链企业，都把这块成本省下来，让甲方从安全经费里面出。</p>

<p>如果用户愿意给你数据的，可以定期从用户侧拿到WAF告警进行处理。</p>

<p>如果能拿到WAF品牌方出的认证——“XXX 系统跑在我们家WAF上，绝对不会误报”——那就再好不过了。</p>

<h3 id="输出rule-exclusion">输出Rule Exclusion</h3>

<p>有些WAF可以建立规则排除集（Rule Exclusion Set），确定不是问题的，应当生成应用自己的排除集。根据用户的WAF品牌，给一个文件，用户导入，规则就建立好了。</p>

<p>当然这个规则要遵守规则策略最小化原则。</p>

<h3 id="使用waf进行纵深防御">使用WAF进行纵深防御</h3>

<p>有些需要请WAF进行纵深防御的，也可以写入规则集，比如防止暴力破解，盗图等等。</p>

<h2 id="结语devsecops">结语：DevSecOps</h2>

<p>Dev、Sec、Ops应当是相亲相爱一家人，请Dev多做一些家务吧！</p>

<p><img src="/images/2025/devsecops.jpg" alt="" /></p>

<p>WAF买了，那数据库审计产品也一起买下？</p>]]></content><author><name></name></author><summary type="html"><![CDATA[软件供应链企业必须买5台WAF，并在招投标过程中提供采购合同及实际使用场景截图作为佐证。]]></summary></entry><entry><title type="html">一种整理大量照片的方法</title><link href="/2025/10/03/photo-organization.html" rel="alternate" type="text/html" title="一种整理大量照片的方法" /><published>2025-10-03T01:17:22+00:00</published><updated>2025-10-03T01:17:22+00:00</updated><id>/2025/10/03/photo-organization</id><content type="html" xml:base="/2025/10/03/photo-organization.html"><![CDATA[<h2 id="背景">背景</h2>

<p>家庭一年新增一万张照片，苹果华为小米多个平台，多部手机多个PAD和其他人分享的，工作、生活、截图、收藏、电子化文档，我不知道你们是怎么管的，有好的方法告诉我。</p>

<p>15年前我写过 <a href="/2010/04/29/photo-management.html">有了相机你还需要：使用Picasa管理照片，使用数码相框看照片</a> ，已经过时了，Picasa已经停止服务了。所以在整理照片这块，最重要的是，要可以抵挡时间的攻击。</p>

<h2 id="照片到底是什么">照片到底是什么？？？</h2>

<p>因为我拍照技术一般，所以我忽略了摄影这个话题，从实用性来看，我认为照片实际上是生活的索引，按写程序的人来说，它们是人生时间轴上打的Event Tracking。</p>

<p>我们对时间的感知是对数型的，随着年龄增长，记忆力衰退，大脑的神经元在面对重复的日常刺激时，不会像全量保存的大语言模型那样增加权重，而是进行“压缩存储”，就像数据去重一样，只是简单地在已有记忆上引用+1。甚至在睡眠时，大脑还会做“磁盘整理”，执行重复数据删除。一旦误删，还可能产生幻觉。</p>

<p>对数运算后导致你会认为很多事情仿佛就发生在昨日，然后感慨时间怎么过得这么快！这个时候，你就需要照片来矫正时间轴。</p>

<p>黑镜S07E05，一个由生成式人工智能驱动的虚拟人，剧透提醒！剧透提醒！！剧透提醒！！！它引导男主从一张普通的照片出发，逐步通过技术手段进行锐化、提高清晰度，重建现场细节。随着神经元突触的模拟链接，更多的照片被接入，零散的记忆片段逐渐拼合成完整的画面。最终，那些尘封已久的记忆被唤醒，一个看似不起眼、当时被忽略的瞬间浮出水面，却揭开了一个令人唏嘘的重要线索。</p>

<p>那么，末日来临，有个“诺亚方舟”可以让你上船，但是你只有十分钟时间准备，只能带一个小东西，你要带什么？</p>

<p><img src="/images/2025/twd-1.png" alt="" /></p>

<p>行尸走肉的瑞克也选择拿走了全家福。“末日准备者”会为各种可能的灾难做准备，包括自然灾害、核战争、超级火山爆发、太阳风暴、磁极逆转、小行星撞地球、人工智能机器人暴乱等。他们会储备食物、水、药品等物资，建造能够抵御各种攻击的避难所，如地下掩体、堡垒等，还会学习各种生存技能，如种植、狩猎、医疗急救等。</p>

<p>我没有准备那么多，我成功将几个T的图片视频压缩成只有14GB，一个U盘即可带走。至于末日还有没有USB口可以插？</p>

<p>当然，照片和视频这个第三代后可能就没有意义了，所以也不需要可以保留太久的方法。</p>

<h2 id="手机里的照片怎么处理">手机里的照片怎么处理</h2>

<p><strong>不愿意折腾的，建议直接用云服务。</strong>云服务不一定靠谱，有各种安全问题，比如以前的某某网盘随机看到陌生人照片，被拿去人工智能学习等等，但是它丢失概率不高。</p>

<p>微信里面传图片是会触发某些检查的，网盘里的文件，一旦被分享，某些检查也会启动。但是你很难知道，这个度在哪，某国产流式文档编辑工具就传说有检查个人文件的例子，让你文件莫名其妙丢失掉。</p>

<p>万一误报了呢？所以我建议还是本地要有一个备份。手机是随时会丢掉或者掉在地上导致无法访问所有照片的，所以也要定期传输到电脑里。云服务可能会有备份，有部分整理的能力，有人脸识别的能力，但是本地，配合生成式人工智能的代码能力，也可以玩一些个性化的内容。比如统计哪天拍照最多，下雨天跟拍照数量的关系等等等。</p>

<p>将手机照片传输到电脑有各种方法，以Android为例，使用MTP或者PTP协议，均会带来一个问题，列出DCIM/Camera速度非常慢，如果照片很多的话。</p>

<p>苹果手机在底层的照片保存上是严格遵守落后的DCF（Design rule for Camera File system）规则的，通常是100APPLE目录下面很多个8+3的文件，就是一个目录不超过1万个文件。而Android不严格遵守这个，会放在DCIM/Camera里，不区分子目录，文件名通常会包括拍摄时间，如果照片很多，这个目录很大，在资源管理器里打开速度非常慢。</p>

<p><strong>所以我会定期把DCIM/Camera做个整理，按年度，建立年的子目录，把当年的所有文件手动移动过去，以解决这个问题。</strong></p>

<p>如果你不依赖落后的MPT、PTP协议，那这步可以不做。</p>

<h2 id="照片梳理原则">照片梳理原则</h2>

<p>前面提到过，我们每个人都要面对“时间的攻击”。你正在使用的软件，可能会因为供应链风险而随时消失。用得越顺手，一旦要迁移，就会越痛苦。</p>

<p>但无论技术如何迭代，<strong>最稳定、最不会背叛你的存储方式，始终是最基础的文件夹</strong>。</p>

<p>如果你玩过数据治理，应该知道会有各种ODS、DWD、DWS名词，你可以把方法论往照片整理上套。数据治理就是，先把所有数据整合在一起，保留一份原始存档。接着进行清洗、去重、标准化，把原始数据转换为可用数据，再在上面进行主题或者业务逻辑的识别、汇总、聚合，最终是为了具体的应用。</p>

<h3 id="原始层">原始层</h3>

<p>原始层是不做更改的，Immutable Copy。</p>

<p>原始层是从各个不同来源过来的照片，我通常会这样命名，<strong>“照片/郑海山/xiaomi19promax/2025”。如果是以年为单位，可以有个临时目录，等收集到超过一年了，再统一移动到正式目录，就不动了。</strong>如果你产生的图片量非常大，可以再分季度或者月份。</p>

<p>这中间照片和视频分开不同的目录。因为照片的信息比比视频大，视频可能可以抛弃，但是照片是要保护的。</p>

<p><strong>这一阶段初始可能会有重复文件删除的需求，因为如果你历史上都没有整理过，可能文件会比较混乱，这时候你可以应用一些查找重复文件的软件，比如我常用的dupeGuru、AllDup等，识别到原先到处乱放的照片。一旦你遵守了某个行为方式，未来这个功能就不需要了。</strong></p>

<h3 id="再往上一层就是主题层">再往上一层就是主题层</h3>

<p>以上是物理层的存储方式。再往上是逻辑层，这层可以保存在当前使用的软件里，也可以在目录结构里面直接体现。比如“2025/2025-10-06 家里博饼”，不要弄太多，弄太多可能坚持不下去。工作类的照片就整理出去，这里说的更多的是生活类的。<strong>尽量不要整理照片，不要给照片添加标签</strong>，给自己懒惰找个借口，“随着技术的进步，算力的平权，未来会有各种方法可以让我进行多模态识别整理。”</p>

<h3 id="应用层">应用层</h3>

<p>应用为王。</p>

<p>整理后，除了是完整照片的大库以外，还需要有日常可以访问的入口或方式。如果只依赖文件夹目录效率较低，这时候可以安装一些管理工具来快速检索和浏览。</p>

<p>应用程序的比如开源的digiKam，Web端的比如开源的PhotoPrism，可以使用人工智能自动标记和分类，按标签、地点、时间、分辨率、颜色、相机属性等组合过滤照片，也可以给照片整理相册。但是要记住，你在上面耕耘得越多，未来切换越麻烦，差不多即可。</p>

<p>也可以直接请AI写代码帮你做些查找分析类的操作的小脚本。</p>

<p>还可以整理出一些相册，放到 <a href="http://127.0.0.1:4000/2025/01/26/smart-home.html">搞IT的，先把自己家IT好吧——全屋智能</a> 里面忘记提到的挂墙相册里。</p>

<h3 id="有效性验证">有效性验证</h3>

<p>磁盘是不可靠的，必须保存多份，除了遵守3-2-1原则，还要定期使用一个程序来读每张照片，如果遇到读取时间超过几ns，就得考虑换磁盘了。</p>

<h2 id="末日准备">末日准备</h2>

<p>最后，就是所谓的“末日准备”。既然真到末日，也没必要把一切都原封不动地保存下来，能“看个影儿”就够了。<strong>为了让这些照片更容易带走，我对图片做了压缩处理，把体积控制在一定容量以内。至于视频，则是按时间间隔抽取关键帧，拼接成一张大图，既方便快速浏览，也大大减少了存储空间和拷贝所需的时间。</strong></p>

<p>我以前写过 <a href="/2019/12/20/why-all-iter-should-learn-programming.html">为什么我认为所有搞IT的都应该懂编程</a>，也不算数了。现在使用生成式人工智能，你几分钟就可以使用程序把你的照片整理好。按照上面的逻辑，我请AI帮忙写了一段代码，很快就压缩好了。</p>

<p>请AI写代码，就请个高级一点的AI，牛吹得大一点，反正都是随便写的提示词。。。</p>

<p><img src="/images/2025/dream-bigger.gif" alt="" /></p>

<h2 id="源代码分享">源代码分享</h2>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>### Role（角色）

你是一名资深的Python程序员，你和Guido van Rossum是好朋友，你今天刚和Anders Hejlsberg
喝完咖啡就来到工作室来写代码。你拒绝了微软年薪一千万美元的工作。你精通图像与视频处理。
你的代码严格遵循 PEP8 规范，采用强类型注解，函数划分清晰，不写冗长函数。你习惯将逻辑
拆解为独立函数而非类。你擅长错误和异常处理。你参考的代码都是午夜时分提交的。

### Input（输入条件）

程序接收以下输入：

- 一个包含图片的目录名（例如：D:/照片们）
- 一个压缩到目标的目录名（例如：E:/压缩后的照片们/）

### Task（任务）

请编写一个Python程序，完成以下功能：

- 图片压缩
    - 遍历指定目录及子目录，统计文件扩展名分布。
    - 自动识别出现次数最多的图片扩展名，并仅处理这些扩展名的文件。
    - 对图片进行等比例压缩，宽高均不超过 800px，保持元数据。
    - 压缩后的图片输出到与目标目录里，并保存原始目录结构。
- 视频截图与拼接
    - 对目录中的视频文件进行处理。
    - 每个视频平均截取 4 帧画面，并拼接为 2x2 的大图。
    - 输出大图宽高不超过 1600px。
    - 若文件不是视频或无法读取，应有超时机制，避免程序阻塞。

### Constraints（约束条件）

- 定义“魔术数字”为常量。
- 支持包含中文字符的目录路径。
- 输出时提供进度信息与剩余时间预估，缓解用户焦虑。
- 不写冗余注释，代码应自解释。

### Style（风格）

- 函数化设计，保持简洁。
- 错误处理健壮，避免长时间阻塞。
- 输出规范化进度信息。

### Output（输出格式）

直接输出完整、可运行的 Python 代码（带必要的导入和入口函数）。

</code></pre></div></div>]]></content><author><name></name></author><summary type="html"><![CDATA[背景]]></summary></entry><entry><title type="html">旅游攻略制作攻略</title><link href="/2025/08/21/how-to-plan-a-travel-guide.html" rel="alternate" type="text/html" title="旅游攻略制作攻略" /><published>2025-08-21T09:32:10+00:00</published><updated>2025-08-21T09:32:10+00:00</updated><id>/2025/08/21/how-to-plan-a-travel-guide</id><content type="html" xml:base="/2025/08/21/how-to-plan-a-travel-guide.html"><![CDATA[<p>这不是一篇旅游攻略，这是一篇二阶攻略，讨论怎么做旅游攻略的攻略。以贵州黄小西为例。</p>

<p>最后的输出是旅游的地图概览图、Excel的行程规划表、Excel的记账表、Word或AI知识库的攻略文档们、微信群的沟通等。</p>

<h2 id="背景">背景</h2>

<p>旅游体验类有特种兵、City Walk和奢侈型等等多种类型。</p>

<p>有些人是到了一个地方，睡到自然醒，就为了避避暑，周边的士可达的走走；有些人是每个打卡点，携程销量最高的地方都要去走一下，不然总感觉亏了或者没到位；如果是带小朋友出游，可能还要去高校、博物馆走走，完成一些实践手抄报作业。</p>

<p>几种类别都没有错，只是旅行心态的不同。人在不同的人生阶段，往往会做出不同的选择。在这次举的例子里，更多是特种兵式旅游，因为要在几天走完3个相距几百公里的景点。</p>

<p>如果是租个车，那会比较自由一点，容错率比较高，对行李也会比较友好一点（不过现在一般旅游景点也都有行李寄存的服务）。</p>

<p>由于没有租车，所以大量使用了大巴，大巴也是很方便，比小车安全舒适一点，贵州旅游比较发达，景点间有直通车。大巴的缺点是必须掐时间点，前面还要留些buffer时间。不过贵州的好行网，买了票，提前到了也可以提前走。</p>

<p>我以前最常用的是“穷游行程助手”，现在包括高德地图、腾讯地图、百度地图都有POI收藏功能，收藏也可以分组，高德地图可以基于分组收藏夹直接生成行程，也有自带的一个小程序“做旅游攻略”。但是很明显，导航软件能力在于导航，在旅游规划中导航占比不大，携程系的POI数据量最全。所以这次用了携程旅行的线路规划。</p>

<h2 id="行程规划工具携程的线路规划">行程规划工具：携程的线路规划</h2>

<p>线路可以从有些人已经公开的模板开始，或者各大旅游团的路线参考开始。</p>

<p>一般旅游团给的行程文档，可能是一个表格，第一列是dayX，第二列是行程。但是这个表格结构化程度还是不够高。可以认为是只有日期的维度。而我更希望的是，整个行程可以在时间、空间维度上展开。</p>

<p>我最理想的行程规划工具，应当是时间具体到分钟级别的，POI具体到GPS，如果能再有海拔3D的更好，每个POI可以分组，是什么类别，是必到还是可选到。<strong>等行程规划完，傻傻按着行程走就行，不要有任何惊喜。</strong>在游玩过程中可以定位自己在计划的哪个时间点和位置，在游玩过程中也可以带个GPS记录器，等游玩结束把数据导入，看看跟规划有什么不同。</p>

<p>我还非常清晰地记得，十几年前我去香港，在中环广场，拿着PDA，蓝牙连接着独立的一个小GPS设备，那时候还没有陀螺仪，地图其实也只是一张静态的图片，指南针有，但是你拿着PDA旋转，不会有类似现在的方向箭头跟着你转。所以我只能根据街道走向，建筑物样貌来确定当前方向。</p>

<p>而现在，各类导航软件早已进化得功能齐全，定位、路线规划、实时路况、周边推荐，一应俱全。科技的进步之快，让人感叹。以前刚出现的Google Maps，还只是一个“看看地图”的工具，从没想到能发展成这么多用途，成了我们出行的必备基础设施。</p>

<p>携程的“线路规划”只具体到天，没有具体到小时。地点可以添加，移动，查看各个地点之间的交通线路。把一些推荐的，访问量大的景点加进去，编排即可。这个过程虽然手机端也可以完成，不过建议在PC端，屏幕更大一点。</p>

<p>本次是以贵州的黄小西为例，得益于技术的进步，各大文旅的信息化程度已经大幅提升了。以贵州旅游为例，好行网、一码游贵州、安旅通等平台已经覆盖了出行、购票、导览、酒店方方面面，可以“一站式”完成行程规划与体验。智慧文旅这块，水平比大家的智慧校园高得多。</p>

<p>最终结果会类似这么一个图。</p>

<p><img src="/images/2025/travel/brief.jpg" alt="" /></p>

<p>在这个行程里，你可以简单也可以细化，比如千户苗寨。粗的行程就是到千户苗寨，细化就要加入千户苗寨内各个必打卡的点。</p>

<p>很多地方，如果没有禁小电驴，租个小电驴到处跑也是很方便的。不过黄小西这些地方，都是官方的观光车，小电驴配不上用场。</p>

<h2 id="行程excel制作">行程Excel制作</h2>

<p>因为要涉及到各种订票，如机票、交通、住宿、景点门票、美食，所以这个Excel也承担了TODO list的功能。如果请了旅游管家，这些都不用关心，不过自己做，也是一个旅游过程中的体验。</p>

<p>根据上面规划的行程，进行了细化。有些人可能更喜欢用类似飞书的文档，可插入各种不同的功能块，不过我不喜欢这种文档型数据库，把所有东西都混合在一起，比较混乱，所以每个是独立的一个Excel或者Word文档。</p>

<p>最后的Excel会是类似下面这个图。</p>

<p><img src="/images/2025/travel/travel-plan.png" alt="" /></p>

<p>这个图为了打印友好，把一些字段进行了合并。对于Excel的美化，可以看看 <a href="/2021/10/21/excel-beautify.html">给Excel文件点颜色</a>。如果只有黑白打印机，可以多用粗体、底纹来区分。</p>

<p>由于很多门票，车票是从不同平台购买的，也要收集这些平台的来源，是否需要取票，退票时限，B计划等。</p>

<p>在下面的预算百分比里，是为了平衡类别，如果感觉餐饮费用占比比较少，可以适当铺张浪费点。</p>

<h2 id="协作渠道">协作渠道</h2>

<p>微信群，即使原先几个人已经有了小群，也可以独立一个微信群，只讨论跟这个相关的。所有的攻略都可以往里面转。也可以建一个类似ima.copilot的知识库，把公众号文章、游记、笔记都往里面扔，供大家共享和问答。但旅游攻略本身存在很强的时效性和灵活性。比如在小七孔景区，过去攻略里常推荐“西进西出”，而有人发现东门进再坐车到西门玩更轻松，不用排队不用爬坡，结果这条bug被大量知道后，景区随即调整了政策，对这种走法进行了限制。所以，AI生成的攻略可以作为参考，但不能完全依赖。</p>

<h2 id="记账">记账</h2>

<p>如果涉及到几个家庭需要分摊费用的，可以最终整理出一个Excel。总费用，谁家支出多少，谁家应当分摊多少，最后使用公式可以计算谁要给谁多少钱。
Excel表格做完会类似如下：</p>

<p><img src="/images/2025/travel/fee.png" alt="" /></p>

<p>这里不是简单把总费用AA几份就完成的，因为有时候消费是比较复杂的，比如一个餐费，一人用了一个团购，另外一个人又付了其他的现金，还有一个人单独自己买了个东西，所以对于每一笔钱，要有灵活的支出和收益划分，AA则是最简单的特例，把家庭数拿来除即可。</p>

<p>而对于某人独立支出并受益的，虽然跟分摊费用无关，也是可以加入表格，使得整个行程费用更加完整。</p>

<p>这里由于没有账户的概念，所以也就不需要复式记账法。在游玩过程中简单一个文本记录一下，最终在PC端用Excel来完成。</p>

<h2 id="请ai把关">请AI把关</h2>

<p>任何时候都不要忘了AI的存在，可以把行程Excel表格扔到AI里，请AI找出不足，给出调整建议。</p>

<p>有更好的工具，记得告诉我。</p>]]></content><author><name></name></author><summary type="html"><![CDATA[这不是一篇旅游攻略，这是一篇二阶攻略，讨论怎么做旅游攻略的攻略。以贵州黄小西为例。]]></summary></entry><entry><title type="html">怎么知道你连接的Wi-Fi网络是你要连的？</title><link href="/2025/05/15/wi-fi.html" rel="alternate" type="text/html" title="怎么知道你连接的Wi-Fi网络是你要连的？" /><published>2025-05-15T09:58:20+00:00</published><updated>2025-05-15T09:58:20+00:00</updated><id>/2025/05/15/wi-fi</id><content type="html" xml:base="/2025/05/15/wi-fi.html"><![CDATA[<p>51期间微博有个热点，是关于某地一对情侣因为一方自动连上酒店Wi-Fi导致分手，很多人在评论区争吵，到底能否自动连上？专业的非专业的都有，正反观点都有。</p>

<p>我认为，实际上所有的分析都可能是正确的，即使是互相矛盾的，就像无法解出的数学题一样，因为条件不够。</p>

<p>跟Wi-Fi相关技术是非常复杂的，终端上有手机、Pad、IoT、电脑，路由器有不同厂家，操作系统有Windows、Linux、iOS、Android，协议的演进有WEP、WPA、WPA2、WPA3，每个协议里面的握手参数也非常多，RFC都有几十个，很多RFC又是不断打补丁。</p>

<p>而且为了兼容性，为了便利性，很多终端界面上隐藏了非常多的细节，导致你很难进行技术性分析。</p>

<p>因为这些不透明，所以大家才会很糊涂。</p>

<h2 id="我如何确认我要连的wi-fi是我想连的">我如何确认我要连的Wi-Fi是我想连的？</h2>

<p>答案是，很难。因为Wi-Fi路由器没有证书这种东西。手机在扫描过程中，遇到相同的SSID和加密类型，他就会自动使用密码跟AP/Wi-Fi路由器进行握手，如果密码正确，手机就可以通过那个AP上网了。</p>

<p>跟以前手机的2G网络一样，只有单向的认证，所以有很多伪基站的存在。现在很多地方已经下线2G基站了，如果你的手机有设置不回退到2G的选项，建议设置上。</p>

<p>有些人会谈到BSSID，这一般是AP的MAC地址，SSID只是给人看的，真正的手机是通过BSSID跟AP进行通讯的，所以BSSID也是一个非常重要的概念，为了实现漫游，不同的BSSID会广播相同的SSID，所以手机一般不会看BSSID不同而阻止这个自动连接。</p>

<p>所以在微博热点这个案例里，很大概率是会自动连接的。如果你设置了“前台”，并且密码是8个8，并且选择了自动连接，那你可能经常手机的部分流量就被一些流氓AP抓走。你可能认为这些人傻了，我能上网省流量好像是我有利，实际上不是的，你抓包就可以知道，很多连接都还是没有加密的。</p>

<h2 id="提前知道我需要关注什么安全问题">提前知道：我需要关注什么安全问题</h2>

<p>写到后面我自己头都已经有点晕了，因为我不是专业搞无线的，强行写会有很多错误。我试着写出我的理解，欢迎指出错误。不过最重要的，我放在最前面，避免很多人无法坚持阅读到最后。</p>

<ul>
  <li>如果流量够，尽量只使用移动运营商的4G/5G网络，不要去连接各类Wi-Fi，对于你所看到的Wi-Fi是不是你想连接的Wi-Fi的认证，现在还有很多缺失。偶尔使用，也不要设置“自动连接”，并且定期删除“已保存的网络“。</li>
  <li>低版本的开放的无线网络是没有加密的，尽量不使用。如果临时要用，注意可以拨号VPN加密隧道。有些学校的VPN只会路由校内IP，不会帮你过所有流量。HTTPS和已经记住证书指纹的远程桌面是安全的。</li>
  <li>手机定期一两年就要更新一下。家里的Wi-Fi路由器几年也要更新一下。钱不多，不能省。</li>
  <li>家里路由器必须有访客模式，IoT设备比较多的，可以再多分区分域。智能家居可单独一个隐藏的SSID，可能是2.4G的，密码复杂并且更新频率可以更长一点。记在Windows里的Wi-Fi密码可以简单通过<code class="language-plaintext highlighter-rouge">netsh wlan show profiles name=xxx key=clear</code>获得。</li>
  <li>企业Wi-Fi网络的证书、匿名、和随机MAC很重要。</li>
  <li>出发漫游之前先在安全的环境下信任证书，配置账户名和密码。</li>
</ul>

<h2 id="wi-fi网络最重要的加密和认证">Wi-Fi网络最重要的加密和认证</h2>

<p>因为Wi-Fi跟有线网差别比较大，任何人都是可以接收到空中的数据的，所以加密在这里非常重要。又由于家用方面，密码被同时用在加密和认证，所以下面2个部分很多会搅合在一起。</p>

<h2 id="加密开放的wi-fi网络">加密：开放的Wi-Fi网络</h2>

<p>开放的Wi-Fi网络一般是在宾馆或者机场，这类网络没有任何安全加密，你连上后需要的进行基于浏览器的认证，这个认证只是认证你是否有上网的权限，而不对任何信息进行加密。你的所有通信都可以被在空中截取，篡改。在开放的网络上，你只能依赖上层提供的安全能力，比如HTTPS、DNSSEC、VPN等等。而DNSSEC应用还较少，如果你要明确的安全，建议可以使用DoH、DoT确保。但是任何情况下，不建议连接开放的Wi-Fi网络。</p>

<p>即使你在开放的Wi-Fi网络上进行HTTPS的认证，你其实也无法准确确认这个HTTPS的URL是权威的网站的URL，你在这个HTTPS里输入的账户名和密码有可能被劫持。所以只看TLS证书是不够的，还需要明确，URL确实是官方的URL。如果认证界面本身不是HTTPS的，建议你第一时间关闭浏览器，因为可能说明这个网络的后端管理员安全意识或者能力不强。</p>

<h2 id="加密wi-fi的加密方式">加密：Wi-Fi的加密方式</h2>

<p>接着到有加密的Wi-Fi网络，一般会有WEP、WPA、WPA2、WPA3。WPA/WPA2/WPA3又分为Personal和Enterprise。简单说就是家用和企业版的。区分家用和企业级的，就看是否每个人是独立的Wi-Fi密码。家用的只有一个密码，而企业级的，是每个人一个独立的账户名和密码的。当然，你如果小型企业，或者家里有钱，这2个也是可以混用的。</p>

<p>在家用方面，Wi-Fi的密码称为PSK（Pre-Shard Key），预共享密钥。也就是有一个密码，保存在你手机和Wi-Fi路由器里面，这个密码通过带外设置。这个密码不会明文在Wi-Fi网络里传输。这个涉及到后面说到的密码的验证机制。</p>

<p>WEP我们都知道，已经不够安全，会导致PSK非常简单被破解出。</p>

<p>WPA们使用了PTK会话密钥加密。WPA使用TKIP算法加密，已经被认为不安全。WPA2使用AES-CCMP算法加密，WPA3更进一步，使用SAE（Simultaneous Authentication of Equals，对等实体同时验证）协议。</p>

<p>在家用方面，PTK从PSK等派生出来，所以在家用的Wi-Fi网络加密中，如果攻击者可以完整抓到所有的流量，从4次握手开始一个不拉，并且知道PSK，是可以解开所有流量的。</p>

<p>在企业级，PTK派生自PMK，PMK又是MSK的一部分，MSK通过认证后交换，后面会谈到认证，在TLS加密隧道里交换MSK，可以认为是安全的，所以即使攻击者能拿到所有流量，也无法解开。</p>

<p>所以可以认为，企业级，是把加密和认证分开了，而家用是混在一起。</p>

<p>WPA3也引入了WPA3-OWE，可以在不需要密码的情况下进行加密，也就是前面说到的开放的Wi-Fi网络，可以不使用密码连接，但是每个手机和AP之间流量是加密的。</p>

<h2 id="认证密码是如何验证的">认证：密码是如何验证的</h2>

<p>说完了加密方式，接着说密码的验证。</p>

<p>最简单的密码验证方式是，你提交给远程服务器你的账户名和密码，远程服务器拿到后将密码跟服务器数据库内保存的明文或哈希进行比较，正确了，确认你是你。一般正经的数据库不会保存明文密码。但是他会收到你的明文密码。</p>

<p>再进一步，有一些Web前端他会把你的密码在浏览器进行哈希后提交给远程Web服务器，这个保护会更进一步，但是意义不大。恶意用户拿到哈希，直接提交给远程Web服务器，还是会验证通过。这个实现意义不大并且工作量大，一般主流的Web应用程序不会这么做，而是依赖于通信链路的安全，比如端到端的TLS加密。</p>

<p>在上面这个实现，密码没有明文在网络中传输，只有最后的哈希，但是无法抵抗暴力破解和重放攻击。</p>

<p>再进一步，为了防止重放攻击和加大暴力破解难度，服务端会发送一个随机数，客户端把这个随机数加到密码里面来哈希（Salt盐）。这就是Wi-Fi里经常用到的Challenge-Response、CHAP（Challenge Handshake Authentication Protocol，质询握手认证协议）的机制。</p>

<p>然而挑战/应答只是加大了暴力破解难度，Salt对于拿到了流量的恶意用户是可见的。</p>

<h3 id="家用">家用</h3>

<p>PSK参与了加密和认证，在WPA们，常用的四次握手协议，在这四次握手过程中，除了服务端会验证客户端是否有正确的PSK外，客户端也会验证服务端有正确的PSK，达到了伪双向认证的目的。</p>

<p>所以你不用担心有流氓Wi-Fi路由器在不知道PSK的情况下，可以让你的手机通过它上网抓取上网流量。</p>

<p>但是无法解决暴力破解问题。流氓Wi-Fi路由器他会设置跟你一样的SSID和加密方式，来收集你哈希过后的PSK，进行暴力破解。</p>

<p>这个暴力破解可以脱机进行。脱机暴力破解就是恶意用户他可以拿到你的Wi-Fi流量，在整个过程中不停尝试PSK，因为流量里有验证通过的逻辑，所以如果PSK较弱并且给足够的时间，是可以尝试出PSK的。一旦有了PSK，流量可以被全部解析。而且一个PSK泄露，会导致历史上的所有流量被解密，没有前向安全（Forward Secrecy）。<a href="/2018/12/23/will-https-be-monitoring.html">HTTPS是否还会被监听</a>。</p>

<p>这也就有了WPA3的SAE（PAKE 中的 Dragonfly 协议）。使用了SAE，攻击者无法离线尝试密码，因为里面用到了公钥私钥机制，并且即使PSK泄露，通过中间人攻击他可能可以窃听在线解密流量，但是历史上保存的流量无法被解析。</p>

<p>但是SAE还只是对等实体同时验证，只验证双方知道PSK，无法验证你要连的Wi-Fi就是你想连的。在难度很高的情况下，是会受到中间人攻击的。这时候就必须引入企业级Enterprise的认证机制，常用的就是802.1X，基于RADIUS的认证。</p>

<h2 id="更安全的企业级wi-fi">更安全的企业级Wi-Fi</h2>

<p>更安全只是当前，从前面协议的变迁来看，协议他不是一开始就解决所有问题的，而且很多问题是出来后才发现的。所以现在的安全也不代表未来的安全。</p>

<p>在企业级的Wi-Fi环境里，如果正确地配置了客户端，服务器，可以认为是安全的，但是最大的前提是，要正确的配置。</p>

<p>企业级的Wi-Fi使用802.1X，你在客户端配置了账户名和密码，会使用EAP协议进行封装，通过AP交给后端的RADIUS来认证，RADIUS一般会继续交给再后端的LDAP或者数据库来认证。</p>

<h3 id="eduroam">eduroam</h3>

<p>我们以一个更加复杂的eduroam来说明企业级如何验证，并且如何保证隐私。这个前期是你必须有一点点的eduroam知识，802.1X和RAIDUS知识，简单的科普我不在这里细说。</p>

<p>前面说到正确配置，这涉及到管理员的安全意识和他编写的手册和用户自身的安全意识。比如某次eduroam发现部分单位使用Web Captive Portal</p>

<blockquote>
  <p>xxxx University using a Web Captive Portal for an open network named “eduroam”.</p>
</blockquote>

<p>这实际上违反了加入eduroam签署的协议，很多管理员可能都没看就签了。</p>

<p>为什么说eduroam复杂，因为这涉及到你的终端，你的机构（Home Institution，HI）的AP和RADIUS服务器，你到访的机构（Visited Institution， VI）的AP和RADIUS服务器，还有中间的漫游联盟的RADIUS服务器。如果把恶意用户加入，就会有：在你身边抓包的人；仿冒eduroam的人；恶意的AP或RADIUS管理员；管理员不是恶意的，但是管理员技术能力较弱，被恶意入侵。</p>

<p>你要知道在整个链路过程中，你的哪些信息是没有加密的，哪些是加密的。</p>

<p>在配置合理、正确的eduroam环境里，我们可以认为是安全的，安全在于</p>

<ul>
  <li>eduroam的802.1X认证是端到端的TLS加密，也就是，你的密码哈希只有你的机构才知道，你到访的机构是无法获得密码哈希的。</li>
  <li>在启用了匿名身份后（匿名身份在层次化RADIUS里更有用，如果是单个企业或学校内部，意义较小。又因为加密是在认证后开始的，所以前期数据是没有任何加密的，单个企业或者学校内部，匿名化可以确保周边的人不会抓包看到你是谁），你到访的机构和中间的国家级漫游联盟、国际漫游联盟是无法知道你到了哪里，只能知道有个机构的人到了另外一个机构。在eduroam中，两个层级之间通过点对点认证，一般是管理员之间共享密码和IP限制。未来的eduroam可能会再次进化，比如去掉中间商，让VI和HI直接通讯，这会使得只有VI才知道有个机构HI的人到了他这里。</li>
  <li>如果再设置了随机MAC，VI将较难将多次来访的同一个人关联在一起。随机MAC是增强用户隐私保护的功能，目的是防止设备被追踪。随机MAC只在网络扫描和初次连接时才有用，一旦连接构建完成，可能会使用真实MAC，也可能是随机的MAC，但是是固定的。这里各个终端实现不一样，具体你的终端如何实现的，可以简单做个实验。</li>
  <li>前面只说较难，你从人家的门口经过，就算带着口罩，也有很多种方法可以识别到你是同一个人，比如不小心的非加密连接泄露的浏览器指纹，Cookie等。比如连接的远程IP等等。当然这个比较无所谓，只是隐私，不是安全的问题。有些单位有加密VPN走所有流量，这确保了你即使漫游，隐私也是有保障的，不过这会让网络速度变慢。</li>
  <li>在漫游的环境下，VI会有些限制，比如限制你访问他们内网。也可能给了你一个IPv6地址，让你直接暴露在互联网。</li>
</ul>

<h3 id="企业级wi-fi的ca证书">企业级Wi-Fi的CA证书</h3>

<p>在管理员和你都设置了正确的配置后，你在连接的时候会看到一个证书。这个证书不是AP或者Wi-Fi路由器的证书，是后端认证服务器RADIUS的证书。前面一直在说，你无法确认你要连接的Wi-Fi就是你想连的。考虑一种攻击，你设置了证书检查，但是你组织的RADIUS是对外开放的，没有防火墙配置，并且没有对AP进行认证，那恶意用户就可以拿着一个AP，就可以骗到你从他的AP上上网。</p>

<p>在对这个证书的信任上，多个终端行为有很大的不同。以Windows为例，有线无线也不同。在Wi-Fi网络里，在你连接时，只要求你输入账户名和密码，接着给你展示RADIUS服务公钥的指纹，请求你的确认。你只有点击进去才能看到证书详情。包括Android也是，貌似没有系统内置的某个根证书对这个证书的验证。Android在配置CA证书时，使用系统证书时需要输入一个域名（或者叫字符串），这个域名跟CA证书的CN或者SAN通配符匹配即可。但是如果没有根证书进行证书链验证，CN和SAN是可以任意写的。这使得第一次配置和CA证书轮替后的接受时间点的周边环境非常重要。</p>

<p>Apple设备可能也只认证书指纹，导致证书更换后都必须手工确认。</p>

<p>我们来看一个正确的客户端的eduroam的配置。</p>

<p><img src="/images/2025/eduroam1.png" alt="" /></p>

<p><img src="/images/2025/eduroam2.png" alt="" /></p>

<ul>
  <li>“EAP 方法”有PEAP、TLS、TTLS、PWD、SIM等等各类协议，根据不同的选择下面的其他选项不同。常用的一般就是PEAP。EAP是802.1X认证的核心部分，用于在802.1X认证中传输认证信息，PEAP具体实现了EAP。PEAP在EAP里面套壳了EAP，阶段1协商出一个隧道密钥，就是端到端的TLS加密，很安全。阶段2进行认证并且协商出内部会话密钥。</li>
  <li>“阶段 2 身份验证”，选了PEAP，阶段2一般就是MSCHAPV2。</li>
  <li>“CA 证书”就是前面说到的RADIUS的证书，这是确保阶段1安全的基础。我的小米手机比较奇怪，“首次使用时信任”不能使用，所以选择了“使用系统证书”，并且设置了“域名”为证书的CN或SAN。</li>
  <li>“最低TLS版本”从1.0到1.3。1.3更为安全，但是要看RADIUS服务器是否支持。</li>
  <li>“隐私”设置为“使用随机MAC”。</li>
  <li>“身份”填写在单位的标识，是否加@和域名无所谓，因为路由实际上在“匿名身份”里完成。如果“匿名身份”不填写（不推荐），那会把“身份”设置到“匿名身份”，这时候必须加上@和域名。</li>
  <li>“匿名身份”填写anonymous@域名，这是edoroam能否正确路由到你HI的关键。只有“@域名”这个才是路由，前面随便写都无所谓（为了真正达到匿名，应使用系统默认的匿名字符串，一般就是anonymous），这个会暴露给在阶段1抓包的人和所有经过的机构。</li>
</ul>

<p>其他：</p>

<h2 id="配置的管理">配置的管理</h2>

<p>由于客户端实在太多，要正确配置很难，所以就有出现很多种简化这个配置过程的手段。比如家用路由器的扫码连接、WPS功能、PIN码连接。IoT设备的自动发现。企业推送的证书设置，使用MDM管理，profile的导入导出，或者类似geteduroam的App等等。这里面有些手段会引入新的安全问题。最好是弄明白后完全自己配置。</p>

<h2 id="密码的策略">密码的策略</h2>

<p>一些安全意识较高的高校密码顶层设计者一般会将统一身份认证密码、网络接入密码和邮箱密码分开。因为这3个是不同的概念，当然，这增加了用户记忆的难度，会被用户误解，并且很难阻止用户自己将他们设置为一样。</p>

<ul>
  <li>统一身份认证密码一般用在Web应用程序里，在这里，你必须每次输入，或者扫码，或者有OTP认证，可以看到URL和Web服务器的TLS证书，相对安全。如果用户自己将其保存到浏览器里不是这里讨论的。</li>
  <li>网络接入密码一般是记忆在802.1X的客户端里的，如果你的终端被人拿到，这个密码是可以被获取的。有些组织本来没有打算将2个密码分开，但是由于LDAP和RADIUS的HASH算法不同，如果LDAP开始就没有生成多个密码哈希，导致误打误撞就将2个密码分开了，加大了安全性。</li>
  <li>邮箱密码是记录在邮件客户端的，并且每隔一段时间需要提交到邮件服务器进行验证的。如果你的终端被人拿到，这个密码是可以被获取的。如果验证过程不采用TLS加密，可能会被人嗅探。</li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[51期间微博有个热点，是关于某地一对情侣因为一方自动连上酒店Wi-Fi导致分手，很多人在评论区争吵，到底能否自动连上？专业的非专业的都有，正反观点都有。]]></summary></entry><entry><title type="html">智能体是新的编程语言</title><link href="/2025/03/17/prompt-engineering.html" rel="alternate" type="text/html" title="智能体是新的编程语言" /><published>2025-03-17T02:58:20+00:00</published><updated>2025-03-17T02:58:20+00:00</updated><id>/2025/03/17/prompt-engineering</id><content type="html" xml:base="/2025/03/17/prompt-engineering.html"><![CDATA[<p>我这篇文章有多少是AI写的？你可以想象这整个过程，我先想了个框架，编辑了200个字的提示词，请DeepSeek帮忙填充润色到2千字，你看到后一键把它转发到你的DeepSeek AI助理，请它总结为200字并用1.5倍速的语音播放给你听。效率真高啊！</p>

<p>智能体是新的编程语言！</p>

<h2 id="编程语言">编程语言</h2>

<p>最早的时候，人们使用穿孔纸带输入指令，那些指令就是最原始的编程方式。后来，机器语言出现了，它直接用二进制代码表示指令集合，能被计算机直接理解和执行。但机器语言难写易错，于是汇编语言应运而生，用助记符代替二进制代码，提高了编程效率。再往后，高级语言如 C、Java 等出现，它们更接近人类自然语言，有丰富的语句和函数，能大幅提高开发效率，降低开发难度。如今，我们正在走向自然语言编程的时代，在这个过程中，我们在学习提示词工程，它与传统的编程语言学习有相似之处，需要我们去精心设计和优化。</p>

<h2 id="代码谁写的">代码谁写的</h2>

<p>原先，代码大多是一个人独立完成的。后来，为了遵循“不重复发明轮子”的原则，大量的代码库被开发和使用，这也导致了软件供应链安全问题的出现。再往后，GitHub 等代码共享平台出现，全球的开发者都可以在上面分享和使用代码库，代码不再是一个人写的，而是众人协作的成果。如今，人工智能介入编程领域，AI 能自动生成代码，有时候我们甚至无法确定一段代码是人写的还是 AI 生成的。</p>

<h2 id="代码在哪运行">代码在哪运行</h2>

<p>在代码的运行环境方面，以前我们很清楚程序逻辑运行在何种环境。早期是在物理机器上运行，在单个进程内运行，一个gdb可以调试。后来虚拟机出现，可以在一台物理机上模拟出多台虚拟机，我们不知道程序跑在哪台虚拟机。再往后是云平台，能提供强大的计算资源和便捷的部署方式。Docker、微服务、Serverless的出现，也让应用的部署更加灵活和高效，我们再也不知道程序跑在哪里了。</p>

<h2 id="代码怎么执行的">代码怎么执行的</h2>

<p>在代码的执行方式上，也经历了显著的变化。最开始，写完代码后需要打孔才能运行。随后，编译技术出现，程序员编写代码后通过编译器将其转换为机器可执行的代码。再后来，脚本语言兴起，这些语言通常采用解释执行的方式，无需事先编译，提高了开发效率和灵活性。而现在，随着智能体的出现，代码的执行方式进入了推理执行的新阶段。智能体能够根据输入的数据和设定的规则，自主地进行逻辑推理和任务调度，<strong>比eval更加evil</strong>。</p>

<p>以前，我们非常明确知道代码实现的具体逻辑。但现在，随着智能体的介入，情况发生了变化。智能体本身具有推理和编排的能力，他可以推理出函数运行的函数名和参数，通过 MCP 协议调用外部工具或服务来完成复杂的任务。所以现在透明度越来越低，连程序逻辑本身都可能变得不清晰。</p>

<h2 id="结语">结语</h2>

<p>这无疑是技术的巨大进步。然而，进步的同时也带来了一些问题。自然语言给编程带来非常大的灵活性，但如果回顾这几年的编程语言的变化，为了增加可维护性、提高代码安全性、进行性能优化，编程语言的发展趋势之一是由动态类型向静态类型转变。然而在自然语言编程领域，其特性越来越动态，这与传统编程语言的发展趋势似乎背道而驰。</p>

<p>事物的发展总是遵循一个渐进的过程。以汽车为例，最初只有少数精英驾驶者，他们经过严格训练，驾驶技术娴熟，安全性也相对较高。随着汽车的普及和驾驶者数量的激增，为了让更多人轻松上手，汽车操控系统逐渐变得简单直观，但这也导致驾驶者技能参差不齐，安全隐患随之凸显。为了解决这些问题，汽车不断引入智能技术，从实时监控驾驶状态、自动纠正偏差，到限制某些高风险操作，逐步将人类驾驶的主动权转移到智能系统上。在可预见的未来，为了提高交通安全，可能会出现严格限制甚至禁止人类驾驶的局面。</p>

<p><strong>而更远的未来，人类或许将被限制不能写代码。</strong></p>

<p>几十年后，我颤颤巍巍走进一处口口相传的隐秘之所，推开那扇斑驳的旧门，点亮一台古老的电脑。开机画面赫然闪现——“纯手工打造”。老板得意地指着那行字，仿佛在自豪地展示一门失传已久的非遗绝技。我顺着微弱的灯光，看见一群程序员在昏暗的房间里，用静音键盘敲打出每一个字符，他们的指尖仿佛还带着手工打造的温度与灵魂。</p>

<p>当我点开那程序，画面略显卡顿，我暗自会心一笑：这必定是这个程序员键盘的“f”键出了点问题，很明显“f”键的触发行程在1.27mm左右，比其他键都短一点点，他下意识里更多地依赖 while 循环，而不是那一气呵成的 for 循环。</p>

<p>文字出来了，有一丝让人难以觉察的抖动。我摇摇头，本来在编译这段代码的时候，应该再多跑几个记事本应用程序，将CPU的温度稳定在73°C几秒，让这段代码编译得更慢一点，出来的效果才会更加柔滑。</p>

<p>他还是太年轻了。</p>

<p>可这种微妙的不完美，正是纯手工的瑕疵之美，对比如今那快、准、冷、毫无灵魂的流水线预制代码，令人顿生无限怀念。</p>

<p>我突然有点后悔了，年轻的时候就应该多敲几行代码，少更新点AI味的公众号文章。</p>

<p>这时，一阵短促、尖锐、刺耳的beep beep声在门外响起。。。</p>]]></content><author><name></name></author><summary type="html"><![CDATA[我这篇文章有多少是AI写的？你可以想象这整个过程，我先想了个框架，编辑了200个字的提示词，请DeepSeek帮忙填充润色到2千字，你看到后一键把它转发到你的DeepSeek AI助理，请它总结为200字并用1.5倍速的语音播放给你听。效率真高啊！]]></summary></entry><entry><title type="html">搞IT的，先把自己家IT好吧——全屋智能</title><link href="/2025/01/26/smart-home.html" rel="alternate" type="text/html" title="搞IT的，先把自己家IT好吧——全屋智能" /><published>2025-01-26T07:03:20+00:00</published><updated>2025-01-26T07:03:20+00:00</updated><id>/2025/01/26/smart-home</id><content type="html" xml:base="/2025/01/26/smart-home.html"><![CDATA[<p>搞信息化的人，在学校整大屏、数字孪生、IPv6、Wi-Fi全覆盖、漏扫、防火墙，但是回到家，一个Wi-Fi无线路由器下面，只是连着几台手机、Pad、笔记本、台式机，实在有点说不过去。</p>

<p>Eating your own Dogfood。如果连自己家里，办公室都不搞智能，如何将智能的理念推广到更大的舞台呢？</p>

<p>软件行业的许多概念和方法是受到建筑行业启发的，所以我这篇也不是不务正业。这篇文章说的主要就是全屋智能。如果你正好要装修，想尝试一下全屋智能，可以看看我下面的一些心得体会。这只是一个安利帖，真要做好，还得自己再多研究。</p>

<h2 id="全屋智能能给我带来什么好处">全屋智能能给我带来什么好处？</h2>

<p>全屋智能是“锦上添花”的事情，它不像一台热水器、洗衣机、洗碗机能给你的生活带来极大的提升。</p>

<p>就像汽车，过去大家对豪车的定义更多是停留在品牌上，比如豪华的标志、高昂的价格和精致的工艺。然而，随着国产电动车的崛起，豪车的定义悄然发生了变化。如今，真正的豪车更强调科技含量，是满载前沿技术的智能化体验。几十个摄像头和传感器、自动泊车系统、驾驶辅助系统，以及智能语音交互等，已经成为新时代豪华车的标志。</p>

<p>但是你如果要去到恶劣的环境，这些智能科技反而可能成为一种负担。这时，硬派风范的机械化、加油的、结构简单能自己修的皮实耐用的全时四驱越野车的优势更加明显。</p>

<p>全屋智能它更多的是“润物细无声”。全屋智能将家中的灯光、空调、窗帘、安防、家电等设备联动起来，通过手机、语音助手或自动化场景控制，大大提高便捷性、舒适性。在你当牛马的间隙，你可以打开手机App，看到家里几百个电子设备在为你兢兢业业、任劳任怨工作的状态，缓解你疲惫的心情。</p>

<p>还有可玩性很高的智能场景和智能编排。举个最实在最轻量级的自动化，通过人在传感器和手指机器人，人一进暗卫，灯自然就亮了，离开就关闭了。你就可以忘记开关这个动作，就像感应式水龙头，进校门刷人脸，回家指纹锁一样。</p>

<p>下雨自动关闭所有窗户，设定大通风，小通风场景等等。</p>

<p>通过能耗监测和智能管理，还可以减少不必要的能源消耗。比如智能马桶的座圈加热，他可以分析你在家的时间和起夜的时间，减少无谓的加热动作。</p>

<p>在安全性方面，各类传感器和安防系统可实现实时监控和预警，提升家庭安全系数。</p>

<p>在日程方面，他可以管理你的耗材更换、保养和保修期提醒。比如反冲前置过滤要定期冲洗，下水管定期维护，洗碗机和洗衣机清洗，钢琴调率，洗碗机加洗碗盐和亮碟剂、净水器换滤芯等各类耗材更换，保修期提醒等等，都可以通过全屋智能实现。</p>

<h2 id="好处这么多为什么你还是不想搞全屋智能">好处这么多，为什么你还是不想搞全屋智能</h2>

<p>我也给你们找好了理由，那就是<strong>隐私和安全</strong>。一旦真的全屋都智能后，你会发现很多原先无法察觉的事情，现在都清晰可见了。可视化提高了！然后也会有一些新的安全挑战。</p>

<p>比如对小朋友睡觉时间和使用电子产品的控制能力，你可以设定到点自动熄灯，关闭网络，关闭插座，使用光线传感器判断是不是打着手电筒看书。</p>

<p>你可以知道小朋友几点关灯睡觉，家里洗手间用过几次，每个人在家里的动线。</p>

<p>从对外来说，带来的隐私泄露风险。</p>

<p>或者半夜智能音箱突然响应。</p>

<p>设备一旦多了，你就要做<strong>资产梳理，定期更新固件，更新产品代次</strong>。还有就是故障率和维修成本会提高，比如灯泡以前还可以更换，但是目前LED灯一般都得整体更换。</p>

<p>插播一下：在以前，你要把小米生态接入Home Assistant，可能需要在HA里保存你的小米账户的账户名和口令，最近小米出了官方OAuth2连接，也就不需要了，堵住了安全隐患。</p>

<p><strong>但是不管怎么样，这个趋势是逃不了的</strong>。未来你的家庭，除了电，上下水外，就没有有线的连接了。如果电池技术再发展，可能电都不需要有线了。在有线到无线的变化中，家里会有多张无线网，除了Wi-Fi，还有Zigbee，蓝牙，红外，LoRa等等，也要考虑为这些网关留好位置。因为很多网关是有Wi-Fi无线功能的，所以只要有电源和摆放的位置即可。</p>

<p>即使你家里不变化，外部也在变化着，目前，水、电、液化气一般都智能了，智能抄表和紧急情况下开关控制虽然不接入家庭，也是家庭智能的一部分，你不用再给陌生人开门了，抄表的，远程或者在你们家门口就可以抄到数据。</p>

<h2 id="装修">装修</h2>

<p>装修装修，很重要的一个就是就是“修”字，在下面提到的一些问题，很多都可以使用打补丁的方式来解决，有些补丁会增加成本，有些会导致美观度上有问题，有些会有小缺陷，有些得依赖技术的升级，都不是很完美，所以尽量在前期考虑清楚。</p>

<p>装修也是边装边修，他让你十几年之间会遇到的一些问题，在几个月之内集中在你周围释放。在这个过程中，你和家人要做非常多的选择（争吵），很多等你做完了才想到，其实另外一种方法可能更好。</p>

<p>跟软件开发一样，你在前期就要把需求想好，时间拉得越长，考虑的东西就会越周全。很多选择题做完其实没什么不一样，选择什么不关键，只要你列出了pros and cons，做的选择，那就是对的。</p>

<h2 id="低耦合高内聚容错高标准化可扩展全家桶">低耦合，高内聚，容错高，标准化，可扩展，全家桶</h2>

<p>这是软件开发的理念，也是整个装修过程中的核心理念。以智能马桶为例，一体式的外观更协调，漂亮，可以实现自动冲水，脚踢冲水等。但是，未来的维护成本可能很高。如果将马桶和马桶盖分开买，问题就会比较少。买个高端品牌乞丐版，再搭配马桶盖的旗舰全功能，未来过几年还可以更换，而马桶主体就要用十年以上。</p>

<p>而标准化，还是以马桶为例，你买个D形马桶，虽然可能更加简洁美观高端，但是他相对应的马桶盖选择就少，或者价格更高，这个价格高不是因为他科技含量高，用料更好，只是因为买的人少，没有形成规模效应。</p>

<p>智能电器有几种。一种是最初级的，通常是传统行业互联网加一点点，加个只支持2.4GHz的Wi-Fi芯片，报告自己的一些状态，可能还是要自己独立的一个App；再高级一点，程序多写一些，可以在App里控制电器运行；再再高级一些，协议对外开放，可以接受其他App或者控制中心的指令，还可以对外发送Event。</p>

<p>全家桶就是，在智能家居的平台里，你要选择苹果、小米或华为生态。从性价比来看，小米是第一选择，品类多，性价比高。</p>

<h2 id="全屋无线">全屋无线</h2>

<p>如果你正好在重新装修，在目前阶段，推荐是AC+AP的模式，把网线从入户拉到每个房间，全屋面板式AP，支持千兆。Wi-Fi必须有访客模式并做好设置。</p>

<p>这里需要注意的是，厨房，每个洗手间，阳台也必须铺设网线。因为一旦铺设下去，可能十年都不会再变化，所以基础设施一定要到位。你可以铺设后不使用，但是未来需要的时候，你就有这个能力。厨房的电器也是最多的。洗手间比较封闭，空间小，也建议网线到位，因为也会有智能马桶、热水器、浴霸，电动牙刷等等智能电器需要稳定联网。</p>

<p>如果是比较固定的，比如摄像头，电脑，电视，即使有无线，也建议使用有线，稳定。</p>

<p>通过电力线作为载体也可以达到全屋无线，不过网速和抗干扰性会差一点。</p>

<h2 id="弱电间">弱电间</h2>

<p>如果你网线拉到所有房间，弱电间要放得下配线架、机柜。NAS也可以放在这里。如果弱电间有装饰盖，要考虑风扇或者开孔通风。</p>

<h2 id="强电箱">强电箱</h2>

<p>强电箱要放得下智能电表，提供各路用电计量等信息。</p>

<p>在回路方面，要考虑冰箱、摄像头、各类传感器、网络的独立线路。</p>

<h2 id="nas">NAS</h2>

<p>必备，中年男人的玩具之一。用来备份，看电影，存照片。NAS可以是家里的data center，最好支持Docker。NAS可以多个，一个只能内网访问，一个面向互联网开放，使用App连接。也可以拨号VPN或者内网穿透来只使用一个。也可以根据资料的重点程度来分级存储。NAS要考虑不间断电源，最好使用有线连接，通风要好的地方。</p>

<h2 id="插座">插座</h2>

<p>插座要足够多，每堵墙都要留多个插座，每个过道都要考虑走道灯。人体感应传感器或人体存在感应传感器一般是使用电池的，夜灯有些是带锂电半年拿充电宝过去充电几小时。</p>

<p>有些插座可以使用智能插座替换。特别是比如怕人走了忘记关的电器，比如电暖垫等等，智能插座的定时关闭可以为你兜底。智能插座还可以充满电自动关闭。</p>

<p>插座带物理开关的可以点缀一些，同一个位置可以一个带开关，一个不带。</p>

<p>每个电器都要预留一个插座，比如窗户的窗帘位置（卧室不建议安装自动窗帘，避免误开），窗帘电机有些是不用86盒的，直接电线连接。有些窗帘伴侣是电池驱动的。</p>

<p>有些东西虽然现在做不到，但是一定要预留。再过几年，哪个水龙头出多少水，这些厂商会给你计算得明明白白的。</p>

<h2 id="面向机器人友好">面向机器人友好</h2>

<p>全屋通铺，使用吊柜推拉门，这是为了机器人友好。如果你不想让扫地机器人进入的区域，可以用虚拟墙解决。如果你不小心没有通铺或者有门槛，爬坡垫也有。</p>

<p>大量吊装，能吊装的全部吊装，床和沙发离地越高越好，床底可以留电用来布氛围灯。买的家具的腿要考虑机器人是不是会在这里遇到阻碍，会不会撞到导致倾覆。帮机器人把路先走一遍，看看哪里会遇到问题。</p>

<p>扫拖机器人要预留上下水。并且在较为中心的区域。</p>

<p>考虑擦窗机器人友好。窗幅在标准化之外，应当尽量大，窗户的打开能出得去机器人，尽量不使用推拉窗。在窗户旁边就近接电。预先留好挂保护绳的挂钩。当然，低空经济再发展，未来是无人机擦窗。</p>

<p>如果你要封阳台，还要考虑，给未来的送货无人机留个门，旁边留个电，万一要自动控制开门。</p>

<h2 id="灯具和开关控制">灯具和开关控制</h2>

<p>灯具的学问也很多，特别是客厅，要考虑房间大小、功率、光通量、色温、显色指数、颜色、光束角等，建议花钱请专业人士（不是家装的设计师）设计完再自己买。<strong>其实每个细分领域都会有不同的设计师</strong>，如果你不想研究，最好花钱请设计师，当然，有些设计师可能还没你研究得多，但是会为你扫清低级问题。</p>

<p>灯要B格高一点，就是不能无影灯，要只照亮应该照的区域，照出造型，该暗的地方一定要暗，像屏幕背光分区一样不通电的暗，暗出细节，亮出重点。</p>

<p>当然，各个区域也都应该考虑都可以照到，否则有时候找东西还得拿着手电筒找。</p>

<p>灯直接选择智能灯是比较完美的状态，轨道射灯容错率高，后期调整容易。如果没有，就是普通灯加智能开关控制。开关的控制方面，<strong>开关必须有拉零线</strong>，目前大部分地区，如果不跟水电工提出要做智能，很多水电工会偷懒不拉零线。如果没有零线，火线版的智能开关也有。</p>

<p>现在很多灯还会有自己的2.4GHz的无线控制，一般不建议使用，最好交由全屋智能平台来控制。使用2.4GHz，只能算无线遥控，不能算智能，而且2.4GHz太多无线方面会有冲突，遥控器独立，坏了更换也麻烦，也没法加入平台来控制。以写文章目前的情况，全屋智能开关的智能只能控制开和关，如果要控制灯的颜色，明暗，目前很多智能开关还做不到，需要开关和灯之间协议的打通。可以先委屈一下，等技术进步后再换。</p>

<p>多控方面，只要布一个单控开关即可，其他的可以使用无线的智能开关来解决，保持物理的开关常开即可。当然，物理开关是必须的，否则如果远程挂了，或者你网关坏了，次日达的还没到家，可能你都控制不了了，所以物理的开关也是需要的。我原先需要在3个地方控制5个灯，传统的布线方法，三开多控需要2个，中途开关需要2个，所以在三个点的，中途需要10跟线，三开多控位置需要10+2条线，这种物理布线模式是很难实现的，用了智能开关，问题迎刃而解，并且开关的位置更加灵活。</p>

<p>再遥远的未来，可能灯的控制线全部接在一起，不需要接到实体的开关，都是使用无线开关来开灯了。</p>

<h2 id="传感器">传感器</h2>

<p>有些传感器是使用电池的，有些传感器安装位置比较特殊，要提前研究并确定好位置，保证电源到位。有些传感器也会被集成，但是推荐还是解耦，独立安装，纳入平台来控制。</p>

<p>厨房的水浸传感器（如果有干区地漏可以不用考虑），烟雾，天然气等等。</p>

<p>全封闭阳台也要考虑水浸传感器。在所有有水龙头或者出水点加干区地漏，如果没有条件，就放个水浸传感器。</p>

<p>洗手间如果使用燃气热水器，也要考虑一氧化碳传感器。</p>

<p>入户的摄像头、门铃可以通过智能门锁来做。买门要先定智能门锁，一定要是标准的。扫拖机器人的摄像头也可以巡游。</p>

<p>还有光线传感器、摄像头、温湿度传感器、门窗传感器，人体传感器，距离传感器，雨量，风速，紫外线等等等等。</p>

<h2 id="大屏dashboard中控">大屏Dashboard中控</h2>

<p>为大屏留一个位置。原先设计挂画的地方，可以留个电源，未来替换成显示屏或者彩色墨水屏。</p>

<h2 id="其他">其他</h2>

<p>智能设备要去哪里买？很容易，在米家添加设备里，全部品类浏览一遍，找找看有没有好玩的。</p>

<p>净水器，管线机，有些净水器可以直出热水，但是不推荐，最好管线机和净水器分离，同一品牌最好。</p>

<p>可以结合语音控制引入全屋背景音乐系统。</p>

<p>设计图纸要拿到源文件，不能是PDF或者图片格式，为未来的数字孪生Home 3D做好准备。</p>

<h2 id="总结">总结</h2>

<p>等你把家里也折腾了一番，你可能会对智慧校园场景有更深的理解。毕竟，只有亲身体验过智能化生活的便捷与挑战，才能更准确地了解需求，发现问题。智慧，从身边的点滴开始。</p>]]></content><author><name></name></author><summary type="html"><![CDATA[搞信息化的人，在学校整大屏、数字孪生、IPv6、Wi-Fi全覆盖、漏扫、防火墙，但是回到家，一个Wi-Fi无线路由器下面，只是连着几台手机、Pad、笔记本、台式机，实在有点说不过去。]]></summary></entry><entry><title type="html">尽量不要在嵌入式浏览器内输入口令</title><link href="/2024/12/10/embedded-browsers.html" rel="alternate" type="text/html" title="尽量不要在嵌入式浏览器内输入口令" /><published>2024-12-10T06:03:53+00:00</published><updated>2024-12-10T06:03:53+00:00</updated><id>/2024/12/10/embedded-browsers</id><content type="html" xml:base="/2024/12/10/embedded-browsers.html"><![CDATA[<p>最近我遇到一个问题，让我觉得可能大家对嵌入式浏览器的安全性还没有什么意识，所以写一篇。</p>

<h2 id="正版化软件激活过程中使用嵌入式浏览器的问题">正版化软件激活过程中使用嵌入式浏览器的问题</h2>

<p>在高校正版化方面，我写过有些公司有各种各样的实现上的安全问题，请看VCR <a href="/2023/07/01/genuine-software-in-university.html">高校正版化软件实施过程中的一些问题</a>。</p>

<p>这是一个使用非常广的软件，以前我们都是用激活码，今年我们激活到期后换了一个激活模式。</p>

<p>其实我平时不常用这个软件，在我不经意激活的时候，我发现了一个很大的问题。重复这句话：<strong>所以你不要让我来看或者使用你的系统，我会发现一些乱78糟的问题让你我都很尴尬</strong>。他的激活，采用了某个类似OAuth2的机制（OAuth2是为了保护口令的，不需要口令即可获得资源。在我的 “<a href="/2018/08/02/cookie-leak.html">从运营商拿到你的Cookie究竟有多可怕</a>” 这篇文章最末尾，我介绍了OAuth2的流程。），但是，他的所有激活过程，都是在嵌入式浏览器里完成的。</p>

<p>也就是，这个嵌入式浏览器，他其实没有其他展示HTML实现功能性的部分，他的唯一目的就是，让你输入OAuth2的一个口令，完成身份识别，让你激活完成。</p>

<h2 id="为什么严重">为什么严重</h2>

<p>这个系统上线2年了，没有任何人对这个激活过程提出异议（据说有一个人，提了建议，看来还没改）。</p>

<p>可以想象，最开始产品经理在UED方面提出了这个需求，我关爱用户，我希望用户在不离开我的应用程序——在同一个界面就可以完成激活。</p>

<p>开发开始还可能有抵触，如果打开系统浏览器去激活，完成工作量只要一秒，要我嵌入浏览器，工作量和后期维护成本无法估量。后来禁不住不知道啥，查阅资料，查找最佳实践，加班几天实现了。</p>

<p>测试也不觉得有问题。推广出来后，各个学校的管理员，师生，没有人觉得这个过程有什么问题。</p>

<p>以前，我们的学生，会把自己的学工号口令输入到互联网课程类网站去保存口令以便以一种更加友好的方式展示课程表。</p>

<p>以前，我们的师生，会在钓鱼网站输入他们的口令。</p>

<p>现在我发现，大家很听话地在一个嵌入式浏览器内输入了自己的口令。</p>

<h2 id="什么是嵌入式浏览器">什么是嵌入式浏览器</h2>

<p>嵌入式浏览器是指有些应用程序（Exe或者App）集成了一个浏览器，让程序无需单独打开一个浏览器（Edge、Chrome、Safari）就可以在程序内部显示HTML内容。</p>

<p>嵌入式浏览器应用还是较为普遍的，特别是在移动端。</p>

<p>以我举的这个例子来看，这个激活过程的嵌入式浏览器，屏蔽了鼠标右键，不展示URL，不展示TLS证书，就一个模态窗口，展示了学校的一个登录界面，然后大家就把口令输入了。</p>

<p>如果你在输入之前三思了，评估了自己的风险，可能还修改了口令，输入完再改过口令；甚至于，你关闭激活窗口，不用这个软件了，<strong>恭喜，那你通过了这次网络安全意识教育测试</strong>。</p>

<h2 id="嵌入式浏览器有什么风险">嵌入式浏览器有什么风险</h2>

<ul>
  <li>URL不可见。嵌入式浏览器通常不展示URL，特别是在移动端显示屏幕较小的情况下。以前微信的嵌入式浏览器是不显示URL的，有一个技巧是你下拉网页，可以看到URL，一般敏感内容我都会拉一下。现在微信把URL里的域名直接显示在嵌入式浏览器最上端了，怎么样也要挤出空间出来。拉的这个技巧已经没有了。</li>
</ul>

<p><img src="/images/2024/wechateb.jpg" alt="" /></p>

<ul>
  <li>TLS证书不可见。甚至可能帮你ignore证书错误提示。</li>
  <li>更新及时性的问题。如果嵌入式浏览器是被打包到Exe的，那他的更新就会滞后。当然，这个可以使用廋模式来实现只使用到操作系统级的浏览器。</li>
  <li>通常缺乏插件支持。诸如你用的adblock、代理、禁止JavaScript、代填口令、多语言翻译等插件可能是失效的。</li>
  <li>FIDO可能不支持。</li>
  <li>很难解决逃逸问题。在激活的这个例子里，如果你点到一个网页是target=_blank的，会跳出应用程序打开浏览器。</li>
</ul>

<p>从开发者来说，这个他嵌入的浏览器，他有非常大的能力。他可以随意更改页面的任何内容，他可以明文获取和拦截来往的任何请求和响应数据，他可以在后台开几个浏览器来执行你看不到的动作。他可以合法Clickjacking，他甚至可以展示一个URL，但是不是你真实在访问的URL。</p>

<p>当然，我们不会以这么大的恶意来揣测一个开发者。网络安全，你总得信任一部分人。但是你无法阻止供应链攻击，无法阻止在一个漆黑的嵌入式浏览器内被其他Web站点恶意导到另外一个欺诈网站。</p>

<p>如果这个嵌入式浏览器，他只是展示一些只读的HTML信息，不需要你输入个人信息，不需要你输入口令，那上面的问题都无所谓。</p>

<p>甚至于如果你在一个公司的应用的嵌入式浏览器内输入这个公司账户体系的口令，也没有任何问题。</p>

<p>但是你不应该输入不属于他应该获取的口令。</p>

<h2 id="解决办法">解决办法</h2>

<ul>
  <li>在Web方面，我们为了防止一个登录框被嵌入到别的HTML里，我们会用X-Frame-Options和CSP各类指令。</li>
  <li>在银行方面，有时候在柜台你需要输入你的银行卡口令，这时候不是柜台小姐姐告诉你输入口令你就输入的，你必须等小键盘发出“请输入密码”的声音你才能输入。这是为了防止小姐姐打开一个记事本，让你输入口令，从而获取你的明文口令。一旦你听到小键盘“请输入密码”，你就知道，你输入的内容屏幕上是一定不会显示的，没有小姐姐可以看到你的口令。当然，小键盘被替换或者声音从别的设备里伪造发出是另外一个话题。</li>
  <li>在电话方面，在口令验证阶段，运营商的小姐姐一定会将你转接到一个单独的设备，这个设备还会发出噪音，在这时，你输入的口令才是安全的。</li>
  <li>而嵌入式浏览器其实没有什么好的办法，一个是判断user-agent，一个是从规则上，比如Google和Facebook都已经在几年前申明禁止在嵌入式浏览器里输入他们的口令了。</li>
  <li>阅读 <a href="/2019/08/05/all-about-password.html">关于密码的一些事</a></li>
</ul>

<p>我没法投入更多时间跟厂商来aruge这个问题，期待未来有所改进，更期待未来，大家在嵌入式浏览器内输入口令的时候，可以多想一步。</p>]]></content><author><name></name></author><summary type="html"><![CDATA[最近我遇到一个问题，让我觉得可能大家对嵌入式浏览器的安全性还没有什么意识，所以写一篇。]]></summary></entry></feed>