蚊章汇 - Mike Bursell
type: channel
link: https://linuxcn.bwsl.wang/author/783/
description: Mike Bursell
items: 我们是如何聘请开源开发人员的
items: 开源如何构建分布式信任
items: 我的 7 大 Rust 关键字
items: 你可能是 Rust 程序员的五个迹象
items: Web 的成长，就是一篇浏览器的故事
items: 关于哈希（散列）函数你应该知道的东西
items: 用于安全计算的 HTTPS 是什么？
items: 为什么每个人都在谈论 WebAssembly
items: 量子计算会打破现有的安全体系吗？
items: 对数据隐私持开放的态度

我们是如何聘请开源开发人员的
type: item
date: 2023-02-16T15:44:36+08:00
description: 我的团队不再采用标准的算法编程笔试，而是采用一套能够产出更多相关成果的流程。作为初创安全公司 Profian 的首席执行官和联合创始人，我参与了我们聘请开发人员从事 Enarx 的工作。Enarx 是一个处理机密信息计算的安全项目，几乎完全用 Rust 语言 编写（少部分用汇编语言）。Profian 现在已经在这次招聘找到了所有要找的人，一些开发人员将在接下来的几周内开始工作。然而，Enarx 绝对欢迎新的贡献者，如果事情继续顺利，公司将来肯定会雇用更多的人。招聘人员并不容易，加上 Profian 还有一系列特别的要求，这让招人变得更加困难。因此我认为分享我们如何解决这个问题应该还蛮有意思的，而且也会对社区有帮助。我们寻找什么样的人才？以下就是我前文提到的特别要求：系统编程：Profian 主要需要那些喜欢系统层编程的人。这一层面的编程已经处于栈的底层，有很多直接与硬件或操作系统的交互。例如，要创建客户端-服务器部分，我们必须编写相当多的协议、管理加密等等，而这方面的工具还不是很成熟（请参阅下面的 “Rust” 一节）。Rust：项目几乎都是用 Rust 语言编写的，那些不是的则是用汇编语言写的（目前只有 x86 平台，尽管随着我们添加更多平台情况可能会有所改变）。Rust 是一门很新、很酷同时也令人兴奋的编程语言，但它同时也很年轻，并且一些领域没有你想要的所有支持或者没有你希望的那么成熟 —— 这包括从密码学到多线程库到编译器/构建基本架构。分散各地的团队：Profian 正在建立一个能够及时通讯联系的团队。Profian 在德国、芬兰、荷兰、北卡罗来纳州（美国）、马萨诸塞州（美国）、弗吉尼亚州（美国）和乔治亚州（美国）都有开发人员。我在英国，我们的社区经理在巴西，我们有来自印度和尼日利亚的实习生。从一开始我们就知道团队很难聚集在一个地方工作，因此我们需要能够通过视频、聊天和（最不济的情况下）电子邮件与人交流和协作的成员。安全：Enarx 是一个安全项目。虽然我们并不是专门在寻找安全专家，但我们需要能够将安全放在首位去思考和工作，并设计和编写适用于安全环境的代码的人。Git：我们所有的代码都存储在 Git 中（主要是 GitHub，还有一些存在 GitLab）。我们围绕代码的大部分交互都是围绕 Git 进行的，因此任何加入我们团队的人都需要能自如使用它作为日常工作中的标准工具。开源：开源不仅仅是许可；更是一种心态，同时，这也是一种合作方式。大量开源软件是由不同地域的人创建的，他们甚至可能不认为彼此身处于一个团队。我们需要知道我们招的人不仅能在公司内部凝聚成一个紧密的团队，同时也能够与组织外部的人员协作，并接受 Profian 的“默认开放”文化，这里的开放不仅仅限于代码，还要有开放的讨论、沟通和文档。我们是如何找到人才的？正如我在其他地方提到的，招聘很困难。Profian 使用多种方式寻找候选人，它们取得了不同程度的成功：领英招聘广告领英搜索特定语言的讨论板和招聘板（例如，Reddit）外部招募人员（特别致敬来自 Interstem 公司的 Gerald）口耳相传/个人推荐虽然很难从质量方面判断这些来源如何，但如果没有外部招聘人员，我们肯定会在数量上苦苦挣扎（我们也有一些来自该途径的优秀候选人）。我们如何筛选出想要的人才？我们需要按照上述的所有要求衡量所有候选人，但并非所有要求都是同等重要的。例如，虽然我们热衷于雇用 Rust 程序员，但那些在系统级别具有强大 C/C++ 技能的人也能成为团队里有用的一份子，因为他们能够很快掌握 Rust 语言。另一方面，熟悉使用 Git 是至关重要的，因为我们无法花时间去培养新团队成员，让他们跟上我们的工作方式。你可能会觉得很惊讶，但强大的开源背景并不是必需的要求，在类似模式中工作的心态是必需的，而任何有开源参与历史的人都可能对 Git 有很好的了解。同理，在一个分散各地的团队中工作的能力这一条件上，我们认为有过任意开源社区的参与经历都会是个积极的指标，因为有如此多的开源项目都是由分散各地的人们完成的。至于安全这一条件，我们则一致决定这只是一个“锦上添花”的条件。我们想让这个过程简单快捷。 Profian 没有设置专门的人力资源部门或人力职能，因为我们正忙于编写代码。以下是我们最终使用的招聘流程（实际流程中可能略有不同），我们试图在 1-2 周内完成招聘：初审：个人履历/简历/GitHub/GitLab/领英主页，决定是否面试我作为 CEO 和候选人进行一场 30-40 分钟的讨论，了解他们是否适合我们团队的文化，同时让他们有机会了解我们，并了解他们是否真的像在初审提交的材料中所说的那样精通技术由 Nathaniel 领导的有关技术方面的深入讨论，通常我也在场与团队其他成员谈话编码笔试快速…

开源如何构建分布式信任
type: item
date: 2022-09-28T23:39:18+08:00
description: 对开源的信任是一个正反馈循环。这是我即将在 Wiley 出版的《 计算和云计算中的信任 Trust in Computing and the Cloud 》一书中经过编辑的节选，也是我之前写的一篇文章 《信任与选择开源》 Trust & choosing open source 的延伸。在那篇文章中，我提出了一个问题。当我们说 “我相信开放源码软件” 时，我们在做什么？作为回答，我认为，我们正在做的是确定有足够多的编写和测试该软件的人与我有类似的要求，而且他们的专业知识加在一起，使我使用该软件的风险可以接受。我同时也介绍了 “ 分布式信任 distributed trust ” 的概念。在社区内分布信任的概念是亚里士多德提出的 “ 人群智慧理论 wisdom of the crowd theory ” 的应用，其中的假设是，许多人的意见通常比一个人或少数人的意见更有明智。虽然在某些情况下，最简单的形式显然是错误的 —— 最明显的例子是民众对极权主义政权的支持 —— 但这一原则可以为建立某些信息提供一个非常有效的机制。我们称这种集体经验的提炼为“分布式信任”，它通过互联网上的许多机制收集。如 TripAdvisor 或 Glassdoor，记录了关于组织或其提供的服务的信息，还有像 UrbanSitter 或 LinkedIn，允许用户添加关于特定人的信息（例如，见 LinkedIn 的推荐和技能与个人档案中的认可部分）。从这些例子中可以获得的利益因网络效应而大大增加，因为随着成员数量的增加，成员之间可能的联系数量也成倍增加。分布式信任的例子还包括像 Twitter 这样的平台，一个账户的追随者数量可以被视为衡量其声誉，甚至是衡量其可信度的标准，我们应该以强烈的怀疑态度去看待这种计算。事实上，Twitter 认为它必须解决拥有大量追随者的账户的社会力量问题，并建立了一个为 “验证账户” 机制，让人们知道 “一个具有公共利益的账户是真实的”。但是有趣的是，该公司不得不暂停这项服务，因为用户对 “验证” 的确切含义或暗示的期望出现了问题：这就是不同群体之间对内容理解不同的典型案例。那么，开源的相关性在哪里呢？开源的社区方面实际上就是建立分布式信任的一个驱动力。因为一旦你成为一个开源项目周围社区的一部分，你就会承担一个或多个角色，一旦你说你 “信任” 一个开源项目，你就会开始信任这些角色（见我之前的文章）。例如，架构师、设计师、开发人员、审查人员、技术写作、测试人员、部署人员、错误报告者或错误修复者。你对一个项目的参与越多，你就越是社区的一部分，久而久之，这就可以成为一个 “ 实践社区 community of practice ”。Jean Lave 和 Etienne Wenger 在 《情境学习：正当的外围参与》 Situated Learning: Legitimate Peripheral Participation 一书中提出了实践社区的概念，团体在成员热情分享和参与共同活动的过程中演变成社区，导致他们的技能和知识共同提高。这里的核心概念是：当参与者围绕实践社区进行学习时，他们同时也成为社区的成员。“正当的的外围参与既指在实践中知识技能身份的发展，也指实践社区的再生产和转化。”Wenger 在 《实践社区：学习、意义和身份》 Communities of Practice: Learning, Meaning, and Identity 中进一步探讨了实践社区的概念：它们如何形成、对其健康的要求，以及它们如何鼓励学习。他认为，意义的可协商性（“我们为什么要一起工作，我们要实现什么？”）是实践社区的核心，并指出，如果没有个人的参与、想象力和一致性，实践社区将不会有活力。我们可以把这一点与我们对分布式信任如何建立和构建的看法结合起来：当你意识到你对开源的影响可以与其他人的影响相同时，你对社区成员的分布式信任关系就变得不那么具有传递性（第二或第三手甚至更遥远），而是更加直接。你明白，你对你所运行的软件的创建、维护、需求和质量所能产生的影响，可以与所有其他以前匿名的贡献者一样，你现在正在与他们形成一个实践社区，或者你正在加入他们的现有实践社区。然后，你就会成为一个信任关系网络的一部分，这个网络是分布式的，但与你购买和操作专利软件时的经历相差不大。这个过程并不会停止：因为开源项目的一个共同属性是“交叉授粉”，即一个项目的开发者也在其他项目上工作。由于多个开源项目之间的网络效应，使得对其他项目的重用和依赖性上升，导致整个项目的吸收量增加。这就很容易理解为什么许多开源贡献者会成为开源爱好者或传道者，不仅仅是为单个项目，而是为整个开源项目。事实上，斯坦福大学社会学家 Mark Granovetter 的工作表明，社区内太多的强关系会导致小…

我的 7 大 Rust 关键字
type: item
date: 2021-07-17T20:22:46+08:00
description: 从 Rust 标准库学习一些有用的关键字。我使用 Rust 已经有几个月了，写的东西比我预期的要多——尽管随着我的学习，我改进了所写的代码，并完成了一些超出我最初意图的更复杂的任务，相当多的东西已经被扔掉了。我仍然喜欢它，并认为谈论一些在 Rust 中反复出现的重要关键字可能会有好处。我会提供我个人对它们的作用的总结：为什么你需要考虑如何使用它们，以及任何其他有用的东西，特别是对于刚接触 Rust 的新手或来自另一种语言的人（如 Java；请阅读我的文章 为什么作为一个 Java 程序员的我喜欢学习 Rust）。事不宜迟，让我们开始吧。获取更多信息的好地方总是 Rust 官方文档 —— 你可能想从 std 标准库开始。const – 你可以用 const 来声明常量，而且你应该这样做。虽然这不是造火箭，但请一定要用 const ，如果你要在不同的模块中使用常量，那请创建一个 lib.rs 文件（Rust 默认的），你可以把所有的常量放在一个命名良好的模块中。我曾经在不同模块的不同文件中发生过 const 变量名（和值）的冲突，仅仅是因为我太懒了，除了在不同文件中剪切和粘贴之外，我本可以通过创建一个共享模块来节省大量的工作。let – 你并不 总是 需要用 let 语句声明一个变量，但当你这样做时你的代码会更加清晰。此外，如果可以，请一定要添加变量类型。Rust 会尽最大努力猜测它应该是什么类型的变量，但它不一定总能在运行时做到这一点（在这种情况下，编译器 Cargo 会提示你），它甚至可能做不到你期望的那样。在后一种情况下，对于 Cargo 来说，抱怨你所赋值的函数（例如）与声明不一致，总比 Rust 试图帮助你做错事，而你却不得不在其他地方花费大量时间来进行调试要简单。match – match 对我来说是新鲜事物，我喜欢使用它。它与其他编程语言中的 switch 没有什么不同，但在 Rust 中被广泛使用。它使代码更清晰易读，如果你做了一些愚蠢的事情（例如错过一些可能的情况），Cargo 会很好地提示你。我一般的经验法则是，在管理不同的选项或进行分支时，如果可以使用 match，那就请一定要使用它。mut – 在声明一个变量时，如果它的值在声明后会发生变化，那么你需要声明它是可变的（LCTT 译注：Rust 中变量默认是不可变的）。常见的错误是在某个变量 没有 变化的情况下声明它是可变的，这时编译器会警告你。如果你收到了 Cargo 的警告，说一个可变的变量没有被改变，而你认为它被 改变 了，那么你可能要检查该变量的范围，并确保你使用的是正确的那个。return – 实际上我很少使用 return，它用于从函数中返回一个值，但是如果你只是在函数的最后一行提供值（或提供返回值的函数），通常会变得更简单，能更清晰地阅读。警告：在很多情况下，你 会 忘记省略这一行末尾的分号（;），如果你这样做，编译器会不高兴的。unsafe – 如其意：如果你想做一些不能保证 Rust 内存安全的事情，那么你就需要使用这个关键字。我绝对无意在现在或将来的任何时候宣布我的任何 Rust 代码不安全；Rust 如此友好的原因之一是它阻止了这种黑客行为。如果你真的需要这样做，再想想，再想想，然后重新设计代码。除非你是一个非常低级的系统程序员，否则要 避免 使用 unsafe。use – 当你想使用另一个 crate 中的东西时，例如结构体、变量、函数等，那么你需要在你要使用它的代码的代码块的开头声明它。另一个常见的错误是，你这样做了，但没有在 Cargo.toml 文件中添加该 crate （最好有一个最小版本号）。我知道，这不是我写过的最复杂的文章，但这是我在开始学习 Rust 时会欣赏的那种文章。我计划在关键函数和其他 Rust 必知知识方面编写类似的文章：如果你有任何要求，请告诉我！本文最初发表于 Alice, Eve, and Bob 经作者许可转载。via: https://opensource.com/article/20/10/keywords-rust作者：Mike Bursell 选题：lujun9972 译者：mcfd 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

你可能是 Rust 程序员的五个迹象
type: item
date: 2021-04-09T07:32:40+08:00
description: 在我学习 Rust 的过程中，我注意到了 Rust 一族的一些常见行为。我是最近才 皈依 Rust 的，我大约在是 2020 年 4 月底开始学习的。但是，像许多皈依者一样，我还是一个热情的布道者。说实话，我也不是一个很好的 Rust 人，因为我的编码风格不是很好，我写的也不是特别符合 Rust 习惯。我猜想这一方面是因为我在写大量代码之前还没有没有真正学完 Rust（其中一些代码又困扰了我），另一方面是因为我并不是那么优秀的程序员。但我喜欢 Rust，你也应该喜欢吧。它很友好，比 C 或 C++ 更友好；它为低级系统任务做好了准备，这比 Python 做的更好；而且结构良好，这要超过 Perl；而且，最重要的是，从设计层面开始，它就是完全开源的，这要比 Java 那些语言好得多。尽管我缺乏专业知识，但我注意到了一些我认为是许多 Rust 爱好者和程序员的共同点。如果你对以下五个迹象点头（其中第一个迹象是由最近的一些令人兴奋的新闻引发的），那么你也可能是一个 Rust 程序员。1、“基金会”一词会使你兴奋对于 Rust 程序员来说，“基金会”一词将不再与 艾萨克·阿西莫夫 Isaac Asimov 关联在一起，而是与新成立的 Rust 基金会 关联。微软、华为、谷歌、AWS 和Mozilla 为该基金会提供了董事（大概也提供了大部分初始资金），该基金会将负责该语言的各个方面，“预示着 Rust 成为企业生产级技术的到来”，根据临时执行董事 Ashley Williams 说。（顺便说一句，很高兴看到一位女士领导这样一项重大的行业计划。）该基金会似乎致力于维护 Rust 的理念，并确保每个人都有参与的机会。在许多方面，Rust 都是开源项目的典型示例。并不是说它是完美的（无论是语言还是社区），而是因为似乎有足够的爱好者致力于维护高参与度、低门槛的社区方式，我认为这是许多开源项目的核心。我强烈欢迎此举，我认为这只会帮助促进 Rust 在未来数年和数月内的采用和成熟。2、你会因为新闻源中提到 Rust 游戏而感到沮丧还有一款和电脑有关的东西，也叫做“Rust”，它是一款“只限多玩家生存类的电子游戏”。它比 Rust 这个语言更新一些（2013 年宣布，2018 年发布），但我曾经在搜索 Rust 相关的内容时，犯了一个错误，用这个名字搜索了游戏。互联网络就是这样的，这意味着我的新闻源现在被这个另类的 Rust 野兽感染了，我现在会从它的影迷和公关人员那里随机得到一些更新消息。这是个低调的烦恼，但我很确定在 Rust（语言）社区中并不是就我一个人这样。我强烈建议，如果你确实想了解更多关于这个计算世界的后起之秀的信息，你可以使用一个提高隐私（我拒绝说 "保护隐私"）的 开源浏览器 来进行研究。3、“不安全”这个词会让你感到恐惧。Rust（语言，再次强调）在帮助你做正确的事情™方面做得非常好，当然，在内存安全方面，这是 C 和 C++ 内部的主要关注点（不是因为不可能做到，而是因为真的很难持续正确）。Dave Herman 在 2016 年写了一篇文章《Safety is Rust's fireflower》，讲述了为什么安全是 Rust 语言的一个积极属性。安全性（内存、类型安全）可能并不赏心悦目，但随着你写的 Rust 越多，你就会习惯并感激它，尤其是当你参与任何系统编程时，这也是 Rust 经常擅长的地方。现在，Rust 并不能阻止你做错误的事情™，但它确实通过让你使用 unsafe 关键字，让你在希望超出安全边界的时候做出一个明智的决定。这不仅对你有好处，因为它（希望）会让你非常、非常仔细地思考你在任何使用它的代码块中放入了什么；它对任何阅读你的代码的人也有好处，这是一个触发词，它能让任何不太清醒的 Rust 人至少可以稍微打起精神，在椅子上坐直，然后想：“嗯，这里发生了什么？我需要特别注意。”如果幸运的话，读你代码的人也许能想到重写它的方法，使它利用到 Rust 的安全特性，或者至少减少提交和发布的不安全代码的数量。4、你想知道为什么没有 ?;、{:?} 、::<> 这样的表情符号人们喜欢（或讨厌）涡轮鱼（::<>），但在 Rust 代码中你经常还会看到其他的语义结构。特别是 {:?} （用于字符串格式化）和 ?;（? 是向调用栈传播错误的一种方式，; 则是行/块的结束符，所以你经常会看到它们在一起）。它们在 Rust 代码中很常见，你只需边走边学，边走边解析，而且它们也很有用，我有时会想，为什么它们没有被纳入到正常对话中，至少可以作为表情符号。可能还有其他的。你有什么建议？5、Clippy 是你的朋友（而不是一个动画回形针）微软的动画回形针 Clippy 可能是 Office 用户很快就觉得讨厌的“功能”，并成为许多 模因 的…

Web 的成长，就是一篇浏览器的故事
type: item
date: 2021-02-19T00:18:08+08:00
description: 互联网诞生之时我的个人故事。最近，我和大家 分享了 我在 1994 年获得英国文学和神学学位离开大学后，如何在一个人们还不知道 Web 服务器是什么的世界里成功找到一份运维 Web 服务器的工作。我说的“世界”，并不仅仅指的是我工作的机构，而是泛指所有地方。Web 那时当真是全新的 —— 人们还正尝试理出头绪。那并不是说我工作的地方（一家学术出版社）特别“懂” Web。这是个大部分人还在用 28.8K 猫（调制解调器，俗称“猫”）访问网页的世界。我还记得我拿到 33.6K 猫时有多激动。至少上下行速率不对称的日子已经过去了， [1] 以前 1200/300 的带宽描述特别常见。这意味着（在同一家机构的）印刷人员制作的设计复杂、色彩缤纷、纤毫毕现的文档是完全不可能放在 Web 上的。我不能允许在网站的首页出现大于 40k 的 GIF 图片，这对我们的许多访问者来说是很难接受的。大于大约 60k 图片的会作为独立的图片，以缩略图链接过去。如果说市场部只有这一点不喜欢，那是绝对是轻描淡写了。更糟的是布局问题。“浏览器决定如何布局文档，”我一遍又一遍地解释，“你可以使用标题或者段落，但是文档在页面上如何呈现并不取决于文档，而是取决于渲染器！”他们想控制这些，想要不同颜色的背景。后来明白了那些不能实现。我觉得我就像是参加了第一次讨论层叠样式表（CSS）的 W3C 会议，并进行了激烈地争论。关于文档编写者应控制布局的建议真令人厌恶。 [2] CSS 花了一些时间才被人们采用，与此同时，关心这些问题的人搭上了 PDF 这种到处都是安全问题的列车。如何呈现文档不是唯一的问题。作为一个实体书出版社，对于市场部来说，拥有一个网站的全部意义在于，让客户（或者说潜在的客户）不仅知道一本书的内容，而且知道买这本书需要花多少钱。但这有一个问题，你看，互联网，包括快速发展的万维网，是开放的，是所有都免费的自由之地，没有人会在意钱；事实上，在那里谈钱是要回避和避免的。我和主流“网民”的看法一致，认为没必要把价格信息放在线上。我老板，以及机构里相当多的人都持相反的意见。他们觉得消费者应该能够看到书要花多少钱。他们也觉得我的银行经理也会想看到我的账户里每个月进了多少钱，如果我不认同他们的观点的话，那我的收入就可能堪忧。幸运的是，在我被炒鱿鱼之前，我已经自己认清了一些 —— 可能是在我开始迈入 Web 的几星期之后，Web 已经发生变化，有其他人公布他们的产品价格信息。这些新来者通常被那些从早期就开始运行 Web 服务器的老派人士所看不起， [3] 但很明显，风向是往那边吹的。然而，这并不意味着我们的网站就赢得了战争。作为一个学术出版社，我们和大学共享一个域名（在 “ac.uk” 下）。大学不太相信发布价格信息是合适的，直到出版社的一些资深人士指出，普林斯顿大学出版社正在这样做，如果我们不做……看起来是不是有点傻？有趣的事情还没完。在我担任站点管理员（“webmaster@…”）的短短几个月后，我们和其他很多网站一样开始看到了一种令人担忧的趋势。某些访问者可以轻而易举地让我们的 Web 服务器跪了。这些访问者使用了新的网页浏览器：网景浏览器（Netscape）。网景浏览器实在太恶劣了，它居然是多线程的。这为什么是个问题呢？在网景浏览器之前，所有的浏览器都是单线程。它们一次只进行一个连接，所以即使一个页面有五张 GIF 图， [4] 也会先请求 HTML 基本文件进行解析，然后下载第一张 GIF，完成，接着第二张，完成，如此类推。事实上，GIF 的顺序经常出错，使得页面加载得非常奇怪，但这也是常规思路。而粗暴的网景公司的人决定，它们可以同时打开多个连接到 Web 服务器，比如说，可以同时请求所有的 GIF！为什么这是个问题呢？好吧，问题就在于大多数 Web 服务器都是单线程的。它们不是设计来一次进行多个连接的。确实，我们运行的 HTTP 服务的软件（MacHTTP）是单线程的。尽管我们花钱购买了它（最初是共享软件），但我们用的这版无法同时处理多个请求。互联网上爆发了大量讨论。这些网景公司的人以为他们是谁，能改变世界的运作方式？它应该如何工作？大家分成了不同阵营，就像所有的技术争论一样，双方都用各种技术热词互丢。问题是，网景浏览器不仅是多线程的，它也比其他的浏览器更好。非常多 Web 服务器代码维护者，包括 MacHTTP 作者 Chuck Shotton 在内，开始坐下来认真地在原有代码基础上更新了多线程测试版。几乎所有人立马转向测试版，它们变得稳定了，最终，浏览器要么采用了这种技术，变成多线程，要么就像所有过时产品一样销声匿迹了。 [5] 对我来说，这才是 Web 真正成长起来的时候。既不是网页展示的价格，也不是设计者能定义你能在网页上看到什么， [6] 而是浏览…

关于哈希（散列）函数你应该知道的东西
type: item
date: 2020-07-12T22:58:14+08:00
description: 从输出的哈希值反推回输入，这从计算的角度是不可行的。无论安全从业人员用计算机做什么，有一种工具对他们每个人都很有用：加密 哈希（散列） hash 函数。这听起来很神秘、很专业，甚至可能有点乏味，但是， 在这里，关于什么是哈希函数以及它们为什么对你很重要，我会作出一个简洁的解释。加密哈希函数，比如 SHA-256 或者 MD5，接受一组二进制数据（通常是字节）作为输入，并且对每个可能的输入集给出一个 希望唯一 hopefully unique 的输出。对于任意模式的输入，给定的哈希函数的输出（“哈希值”）的长度都是一样的（对于 SHA-256，是 32 字节或者 256 比特，这从名字中就能看出来）。最重要的是：从输出的哈希值反推回输入，这从计算的角度是 不可行的 implausible （密码学家讨厌 “ 不可能 impossible ” 这个词）。这就是为什么它们有时候被称作 单向哈希函数 one-way hash function 。但是哈希函数是用来做什么的呢？为什么“唯一”的属性如此重要？唯一的输出在描述哈希函数的输出时，“ 希望唯一 hopefully unique ”这个短语是至关重要的，因为哈希函数就是用来呈现完全唯一的输出。比如，哈希函数可以用于验证 你 下载的文件副本的每一个字节是否和 我 下载的文件一样。你下载一个 Linux 的 ISO 文件或者从 Linux 的仓库中下载软件时，你会看到使用这个验证过程。没有了唯一性，这个技术就没用了，至少就通常的目的而言是这样的。如果两个不同的输入产生了相同的输出，那么这样的哈希过程就称作“ 碰撞 collision ”。事实上，MD5 算法已经被弃用，因为虽然可能性微乎其微，但它现在可以用市面上的硬件和软件系统找到碰撞。另外一个重要的特性是，消息中的一个微小变化，甚至只是改变一个比特位，都可能会在输出中产生一个明显的变化（这就是“ 雪崩效应 avalanche effect ”）。验证二进制数据哈希函数的典型用途是当有人给你一段二进制数据，确保这些数据是你所期望的。无论是文本、可执行文件、视频、图像或者一个完整的数据库数据，在计算世界中，所有的数据都可以用二进制的形式进行描述，所以至少可以这么说，哈希是广泛适用的。直接比较二进制数据是非常缓慢的且计算量巨大，但是哈希函数在设计上非常快。给定两个大小为几 M 或者几 G 的文件，你可以事先生成它们的哈希值，然后在需要的时候再进行比较。通常，对哈希值进行签名比对大型数据集本身进行签名更容易。这个特性太重要了，以至于密码学中对哈希值最常见的应用就是生成“数字”签名。由于生成数据的哈希值很容易，所以通常不需要有两套数据。假设你想在你的电脑上运行一个可执行文件。但是在你运行之前，你需要检查这个文件就是你要的文件，没有被黑客篡改。你可以方便快捷的对文件生成哈希值，只要你有一个这个哈希值的副本，你就可以相当肯定这就是你想要的文件。下面是一个简单的例子：$ shasum -a256 ~/bin/fop 87227baf4e1e78f6499e4905e8640c1f36720ae5f2bd167de325fd0d4ebc791c /home/bob/bin/fop 如果我知道 fop 这个可执行文件的 SHA-256 校验和，这是由供应商（这个例子中是 Apache 基金会）提供的：87227baf4e1e78f6499e4905e8640c1f36720ae5f2bd167de325fd0d4ebc791c 然后我就可以确信，我驱动器上的这个可执行文件和 Apache 基金会网站上发布的文件是一模一样的。这就是哈希函数难以发生碰撞（或者至少是 很难通过计算得到碰撞）这个性质的重要之处。如果黑客能将真实文件用哈希值相同的文件轻易的进行替换，那么这个验证过程就毫无用处。事实上，这些性质还有更技术性的名称，我上面所描述的将三个重要的属性混在了一起。更准确地说，这些技术名称是： 抗原像性 pre-image resistance ：给定一个哈希值，即使知道用了什么哈希函数，也很难得到用于创建它的消息。 抗次原像性 second pre-image resistance ：给定一个消息，很难找到另一个消息，使得这个消息可以产生相同的哈希值。 抗碰撞性 collision resistance ：很难得到任意两个可以产生相同哈希值的消息。抗碰撞性 和 抗次原像性 也许听上去是同样的性质，但它们具有细微而显著的不同。抗次原像性 说的是如果 已经 有了一个消息，你也很难得到另一个与之哈希值相匹配的消息。抗碰撞性 使你很难找到两个可以生成相同哈希值的消息，并且要在哈希函数中实现这一性质则更加困难。让我回到黑客试图替换文件（可以通过哈希值进行校验）的…

用于安全计算的 HTTPS 是什么？
type: item
date: 2020-02-11T20:36:05+08:00
description: 在默认的情况下，网站的安全性还不足够。在过去的几年里，寻找一个只以 “http://…” 开头的网站变得越来越难，这是因为业界终于意识到，网络安全“是件事”，同时也是因为客户端和服务端之间建立和使用 https 连接变得更加容易了。类似的转变可能正以不同的方式发生在云计算、边缘计算、物联网、区块链，人工智能、机器学习等领域。长久以来，我们都知道我们应该对存储的静态数据和在网络中传输的数据进行加密，但是在使用和处理数据的时候对它进行加密是困难且昂贵的。可信计算（使用例如 受信任的执行环境 Trusted Execution Environments TEEs 这样的硬件功能来提供数据和算法这种类型的保护）可以保护主机系统中的或者易受攻击的环境中的数据。关于 TEEs，当然，还有我和 Nathaniel McCallum 共同创立的 Enarx 项目，我已经写了几次文章（参见《给每个人的 Enarx（一个任务）》 和 《Enarx 迈向多平台》）。Enarx 使用 TEEs 来提供独立于平台和语言的部署平台，以此来让你能够安全地将敏感应用或者敏感组件（例如微服务）部署在你不信任的主机上。当然，Enarx 是完全开源的（顺便提一下，我们使用的是 Apache 2.0 许可证）。能够在你不信任的主机上运行工作负载，这是可信计算的承诺，它扩展了使用静态敏感数据和传输中数据的常规做法：存储：你要加密你的静态数据，因为你不完全信任你的基础存储架构。网络：你要加密你正在传输中的数据，因为你不完全信任你的基础网络架构。计算：你要加密你正在使用中的数据，因为你不完全信任你的基础计算架构。关于信任，我有非常多的话想说，而且，上述说法里的单词“完全”是很重要的（在重新读我写的这篇文章的时候，我新加了这个单词）。不论哪种情况，你必须在一定程度上信任你的基础设施，无论是传递你的数据包还是存储你的数据块，例如，对于计算基础架构，你必须要去信任 CPU 和与之关联的固件，这是因为如果你不信任他们，你就无法真正地进行计算（现在有一些诸如 同态加密 homomorphic encryption 一类的技术，这些技术正在开始提供一些可能性，但是它们依然有限，这些技术还不够成熟）。考虑到发现的一些 CPU 安全性问题，是否应该完全信任 CPU 有时自然会产生疑问，以及它们是否在针对其所在的主机的物理攻击中具有完全的安全性。这两个问题的回答都是“不”，但是在考虑到大规模可用性和普遍推广的成本，这已经是我们当前拥有的最好的技术了。为了解决第二个问题，没有人去假装这项技术（或者任何的其他技术）是完全安全的：我们需要做的是思考我们的威胁模型并确定这个情况下的 TEEs 是否为我们的特殊需求提供了足够的安全防护。关于第一个问题，Enarx 采用的模型是在部署时就对你是否信任一个特定的 CPU 组做出决定。举个例子，如果供应商 Q 的 R 代芯片被发现有漏洞，可以很简单地说“我拒绝将我的工作内容部署到 Q 的 R 代芯片上去，但是仍然可以部署到 Q 的 S 型号、T 型号和 U 型号的芯片以及任何 P、M 和 N 供应商的任何芯片上去。”我认为这里发生了三处改变，这些改变引起了人们现在对 机密计算 confidential computing 的兴趣和采用。硬件可用：只是在过去的 6 到 12 个月里，支持 TEEs 的硬件才开始变得广泛可用，这会儿市场上的主要例子是 Intel 的 SGX 和 AMD 的 SEV。我们期望在未来可以看到支持 TEE 的硬件的其他例子。行业就绪：就像上云越来越多地被接受作为应用程序部署的模型，监管机构和立法机构也在提高各类组织保护其管理的数据的要求。组织开始呼吁在不受信任的主机运行敏感程序（或者是处理敏感数据的应用程序）的方法，更确切地说，是在无法完全信任且带有敏感数据的主机上运行的方法。这不足为奇：如果芯片制造商看不到这项技术的市场，他们就不会投太多的钱在这项技术上。Linux 基金会的机密计算联盟（CCC）的成立就是业界对如何寻找使用加密计算的通用模型并且鼓励开源项目使用这些技术感兴趣的案例。（红帽发起的 Enarx 是一个 CCC 项目。）开放源码：就像区块链一样，机密计算是使用开源绝对明智的技术之一。如果你要运行敏感程序，你需要去信任正在为你运行的程序。不仅仅是 CPU 和固件，同样还有在 TEE 内执行你的工作负载的框架。可以很好地说，“我不信任主机机器和它上面的软件栈，所以我打算使用 TEE，”但是如果你不够了解 TEE 软件环境，那你就是将一种软件不透明换成另外一种。TEEs 的开源支持将允许你或者社区（实际上是你与社区）以一种专有软件不可能实现的方式来检查和审计你所运行的程序。这就是为什么 CCC 位于 Linux 基金会旗下（…

为什么每个人都在谈论 WebAssembly
type: item
date: 2020-01-27T20:54:39+08:00
description: 了解有关在 Web 浏览器中运行任何代码的最新方法的更多信息。如果你还没有听说过 WebAssembly，那么你很快就会知道。这是业界最保密的秘密之一，但它无处不在。所有主流的浏览器都支持它，并且它也将在服务器端使用。它很快，它能用于游戏编程。这是主要的国际网络标准组织万维网联盟（W3C）的一个开放标准。你可能会说：“哇，这听起来像是我应该学习编程的东西！”你可能是对的，但也是错的。你不需要用 WebAssembly 编程。让我们花一些时间来学习这种通常被缩写为“Wasm”的技术。它从哪里来？大约十年前，人们越来越认识到，广泛使用的 JavaScript 不够快速，无法满足许多目的。JavaScript 无疑是成功和方便的。它可以在任何浏览器中运行，并启用了今天我们认为理所当然的动态网页类型。但这是一种高级语言，在设计时并没有考虑到计算密集型工作负载。然而，尽管负责主流 web 浏览器的工程师们对性能问题的看法大体一致，但他们对如何解决这个问题却意见不一。出现了两个阵营，谷歌开始了它的 原生客户端 Native Client 项目，后来又推出了 可移植原生客户端 Portable Native Client 变体，着重于允许用 C/C++ 编写的游戏和其它软件在 Chrome 的一个安全隔间中运行。与此同时，Mozilla 赢得了微软对 asm.js 的支持。该方法更新了浏览器，因此它可以非常快速地运行 JavaScript 指令的低级子集（有另一个项目可以将 C/C++ 代码转换为这些指令）。由于这两个阵营都没有得到广泛采用，各方在 2015 年同意围绕一种称为 WebAssembly 的新标准，以 asm.js 所采用的基本方法为基础，联合起来。如 CNET 的 Stephen Shankland 当时所写，“在当今的 Web 上，浏览器的 JavaScript 将这些指令转换为机器代码。但是，通过 WebAssembly，程序员可以在此过程的早期阶段完成很多工作，从而生成介于两种状态之间的程序。这使浏览器摆脱了创建机器代码的繁琐工作，但也实现了 Web 的承诺 —— 该软件将在具有浏览器的任何设备上运行，而无需考虑基础硬件的细节。”在 2017 年，Mozilla 宣布了它的最小可行的产品（MVP），并使其脱离预览版阶段。到该年年底，所有主流的浏览器都采用了它。2019 年 12 月，WebAssembly 工作组发布了三个 W3C 推荐的 WebAssembly 规范。WebAssembly 定义了一种可执行程序的可移植二进制代码格式、相应的文本汇编语言以及用于促进此类程序与其宿主环境之间的交互接口。WebAssembly 代码在低级虚拟机中运行，这个可运行于许多微处理器之上的虚拟机可模仿这些处理器的功能。通过即时（JIT）编译或解释，WebAssembly 引擎可以以近乎原生平台编译代码的速度执行。为什么现在感兴趣？当然，最近对 WebAssembly 感兴趣的部分原因是最初希望在浏览器中运行更多计算密集型代码。尤其是笔记本电脑用户，越来越多的时间都花在浏览器上（或者，对于 Chromebook 用户来说，基本上是所有时间）。这种趋势已经迫切需要消除在浏览器中运行各种应用程序的障碍。这些障碍之一通常是性能的某些方面，这正是 WebAssembly 及其前身最初旨在解决的问题。但是，WebAssembly 并不仅仅适用于浏览器。在 2019 年，Mozilla 宣布了一个名为 WASI（ WebAssembly 系统接口 WebAssembly System Interface ）的项目，以标准化 WebAssembly 代码如何与浏览器上下文之外的操作系统进行交互。通过将浏览器对 WebAssembly 和 WASI 的支持结合在一起，编译后的二进制文件将能够以接近原生的速度，跨不同的设备和操作系统在浏览器内外运行。WebAssembly 的低开销立即使它可以在浏览器之外使用，但这无疑是赌注；显然，还有其它不会引入性能瓶颈的运行应用程序的方法。为什么要专门使用 WebAssembly？一个重要的原因是它的可移植性。如今，像 C++ 和 Rust 这样的广泛使用的编译语言可能是与 WebAssembly 关联最紧密的语言。但是，各种各样的其他语言可以编译为 WebAssembly 或拥有它们的 WebAssembly 虚拟机。此外，尽管 WebAssembly 为其执行环境假定了某些先决条件，但它被设计为在各种操作系统和指令集体系结构上有效执行。因此，WebAssembly 代码可以使用多种语言编写，并可以在多种操作系统和处理器类型上运行。另一个 WebAssembly 优势源于这样一个事实：代码在虚拟机中运行。因此，…

量子计算会打破现有的安全体系吗？
type: item
date: 2019-02-24T19:21:06+08:00
description: 你会希望 某黑客 J. Random Hacker 假冒你的银行吗？近年来， 量子计算机 quantum computer 已经出现在大众的视野当中。量子计算机被认为是第六类计算机，这六类计算机包括： 人力 Humans ：在人造的计算工具出现之前，人类只能使用人力去进行计算。而承担计算工作的人，只能被称为“计算者”。 模拟计算工具 Mechanical analogue ：由人类制造的一些模拟计算过程的小工具，例如 安提凯希拉装置 Antikythera mechanism 、 星盘 astrolabe 、 计算尺 slide rule 等等。 机械工具 Mechanical digital ：在这一个类别中包括了运用到离散数学但未使用电子技术进行计算的工具，例如 算盘 abacus 、Charles Babbage 的 差分机 Difference Engine 等等。 电子模拟计算工具 Electronic analogue ：这一个类别的计算机多数用于军事方面的用途，例如炸弹瞄准器、枪炮瞄准装置等等。 电子计算机 Electronic digital ：我在这里会稍微冒险一点，我觉得 Colossus 是第一台电子计算机， 1 ：这一类几乎包含现代所有的电子设备，从移动电话到超级计算机，都在这个类别当中。 量子计算机 Quantum computer ：即将进入我们的生活，而且与之前的几类完全不同。什么是量子计算？ 量子计算 Quantum computing 的概念来源于 量子力学 quantum mechanics ，使用的计算方式和我们平常使用的普通计算非常不同。如果想要深入理解，建议从参考维基百科上的定义开始。对我们来说，最重要的是理解这一点：量子计算机使用 量子位 qubit 进行计算。在这样的前提下，对于很多数学算法和运算操作，量子计算机的计算速度会比普通计算机要快得多。这里的“快得多”是按数量级来说的“快得多”。在某些情况下，一个计算任务如果由普通计算机来执行，可能要耗费几年或者几十年才能完成，但如果由量子计算机来执行，就只需要几秒钟。这样的速度甚至令人感到可怕。因为量子计算机会非常擅长信息的加密解密计算，即使在没有密钥的情况下，也能快速完成繁重的计算任务。这意味着，如果拥有足够强大的量子计算机，那么你的所有信息都会被一览无遗，任何被加密的数据都可以被正确解密出来，甚至伪造数字签名也会成为可能。这确实是一个严重的问题。谁也不想被某个黑客冒充成自己在用的银行，更不希望自己在区块链上的交易被篡改得面目全非。好消息尽管上面的提到的问题非常可怕，但也不需要太担心。首先，如果要实现上面提到的能力，一台可以操作大量量子位的量子计算机是必不可少的，而这个硬件上的要求就是一个很高的门槛。 2 目前普遍认为，规模大得足以有效破解经典加密算法的量子计算机在最近几年还不可能出现。其次，除了攻击现有的加密算法需要大量的量子位以外，还需要很多量子位来保证容错性。还有，尽管确实有一些理论上的模型阐述了量子计算机如何对一些现有的算法作出攻击，但是要让这样的理论模型实际运作起来的难度会比我们 3 想象中大得多。事实上，有一些攻击手段也是未被完全确认是可行的，又或者这些攻击手段还需要继续耗费很多年的改进才能到达如斯恐怖的程度。最后，还有很多专业人士正在研究能够防御量子计算的算法（这样的算法也被称为“ 后量子算法 post-quantum algorithms ”）。如果这些防御算法经过测试以后投入使用，我们就可以使用这些算法进行加密，来对抗量子计算了。总而言之，很多专家都认为，我们现有的加密方式在未来 5 年甚至未来 10 年内都是安全的，不需要过分担心。也有坏消息但我们也并不是高枕无忧了，以下两个问题就值得我们关注：人们在设计应用系统的时候仍然没有对量子计算作出太多的考量。如果设计的系统可能会使用 10 年以上，又或者数据加密和签名的时间跨度在 10 年以上，那么就必须考虑量子计算在未来会不会对系统造成不利的影响。新出现的防御量子计算的算法可能会是专有的。也就是说，如果基于这些防御量子计算的算法来设计系统，那么在系统落地的时候，可能会需要为此付费。尽管我是支持开源的，尤其是开源密码学，但我最担心的就是无法开源这方面的内容。而且最糟糕的是，在建立新的协议标准时（不管是事实标准还是通过标准组织建立的标准），无论是故意的，还是无意忽略，或者是没有好的开源替代品，他们都很可能使用专有算法而排除使用开源算法。我们要怎样做？幸运的是，针对上述两个问题，我们还是有应对措施的。首先，在整个系统的设计阶段，就需要考虑到它是否会受到量子计算的影响，并作出相应的规划。当然了，不需要现在就立即采取行动，因为当前的技术水平也没法实现有效的方案，但至少也要在加密方…

对数据隐私持开放的态度
type: item
date: 2018-07-25T08:40:00+08:00
description: 尽管有包括 GDPR 在内的法规，数据隐私对于几乎所有的人来说都是很重要的事情。今天（LCTT 译注：本文发表于 2018/1/28）是 数据隐私日 Data Privacy Day ，(在欧洲叫“ 数据保护日 Data Protection Day ”)，你可能会认为现在我们处于一个开源的世界中，所有的数据都应该是自由的，就像人们想的那样，但是现实并没那么简单。主要有两个原因：我们中的大多数（不仅仅是在开源中）认为至少有些关于我们自己的数据是不愿意分享出去的（我在之前发表的一篇文章中列举了一些例子3）我们很多人虽然在开源中工作，但事实上是为了一些商业公司或者其他一些组织工作，也是在合法的要求范围内分享数据。所以实际上，数据隐私对于每个人来说是很重要的。事实证明，在美国和欧洲之间，人们和政府认为让组织使用哪些数据的出发点是有些不同的。前者通常为商业实体（特别是愤世嫉俗的人们会指出是大型的商业实体）利用他们所收集到的关于我们的数据提供了更多的自由度。在欧洲，完全是另一观念，一直以来持有的多是有更多约束限制的观念，而且在 5 月 25 日，欧洲的观点可以说取得了胜利。通用数据保护条例（GDPR）的影响那是一个相当全面的声明，其实事实上这是 2016 年欧盟通过的一项称之为 通用数据保护条例 General Data Protection Regulation （GDPR）的立法的日期。数据通用保护条例在私人数据怎样才能被保存，如何才能被使用，谁能使用，能被持有多长时间这些方面设置了严格的规则。它描述了什么数据属于私人数据——而且涉及的条目范围非常广泛，从你的姓名、家庭住址到你的医疗记录以及接通你电脑的 IP 地址。通用数据保护条例的重要之处是它并不仅仅适用于欧洲的公司，如果你是阿根廷人、日本人、美国人或者是俄罗斯的公司而且你正在收集涉及到欧盟居民的数据，你就要受到这个条例的约束管辖。“哼！” 你可能会这样说 注1 ，“我的业务不在欧洲：他们能对我有啥约束？” 答案很简单：如果你想继续在欧盟做任何生意，你最好遵守，因为一旦你违反了通用数据保护条例的规则，你将会受到你的全球总收入百分之四的惩罚。是的，你没听错，是全球总收入，而不是仅仅在欧盟某一国家的的收入，也不只是净利润，而是全球总收入。这将会让你去叮嘱告知你的法律团队，他们就会知会你的整个团队，同时也会立即去指引你的 IT 团队，确保你的行为在相当短的时间内合规。看上去这和非欧盟公民没有什么相关性，但其实不然，对大多数公司来说，对所有的他们的顾客、合作伙伴以及员工实行同样的数据保护措施是件既简单又有效的事情，而不是仅针对欧盟公民实施，这将会是一件很有利的事情。 注2然而，数据通用保护条例不久将在全球实施并不意味着一切都会变的很美好 注3 ：事实并非如此，我们一直在丢弃关于我们自己的信息——而且允许公司去使用它。有一句话是这么说的（尽管很争议）：“如果你没有在付费，那么你就是产品。”这句话的意思就是如果你没有为某一项服务付费，那么其他的人就在付费使用你的数据。你有付费使用 Facebook、推特、谷歌邮箱？你觉得他们是如何赚钱的？大部分是通过广告，一些人会争论那是他们向你提供的一项服务而已，但事实上是他们在利用你的数据从广告商里获取收益。你不是一个真正的广告的顾客——只有当你从看了广告后买了他们的商品之后你才变成了他们的顾客，但直到这个发生之前，都是广告平台和广告商的关系。有些服务是允许你通过付费来消除广告的（流媒体音乐平台声破天就是这样的），但从另一方面来讲，即使你认为付费的服务也可以启用广告（例如，亚马逊正在努力让 Alexa 发广告），除非我们想要开始为这些所有的免费服务付费，我们需要清楚我们所放弃的，而且在我们暴露的和不想暴露的之间做一些选择。谁是顾客？关于数据的另一个问题一直在困扰着我们，它是产生的数据量的直接结果。有许多组织一直在产生巨量的数据，包括公共的组织比如大学、医院或者是政府部门 注4 ——而且他们没有能力去储存这些数据。如果这些数据没有长久的价值也就没什么要紧的，但事实正好相反，随着处理大数据的工具正在开发中，而且这些组织也认识到他们现在以及在不久的将来将能够去挖掘这些数据。然而他们面临的是，随着数据的增长和存储量无法跟上该怎么办。幸运的是——而且我是带有讽刺意味的使用了这个词 注5 ，大公司正在介入去帮助他们。“把你们的数据给我们，”他们说，“我们将免费保存。我们甚至让你随时能够使用你所收集到的数据！”这听起来很棒，是吗？这是大公司 注6 的一个极具代表性的例子，站在慈善的立场上帮助公共组织管理他们收集到的关于我们的数据。不幸的是，慈善不是唯一的理由。他们是附有条件的：作为同意保存数据的交换条件，这些公司得到了将数据访问权限出售给第三方的权利。你认为公共组织，…