GSoC 申请将在 UTC 时间 4月19日结束,如果你对 WasmEdge 的项目感兴趣,欢迎申请。这篇文章将为大家介绍 sonder-joker 通过 LFX Mentorship 为 WasmEdge 实现标准 WebAssembly 的经历。

我是 sonder-joker,一名软件工程专业的本科生,喜欢开源、软件基础架构和具有挑战性的工作。去年秋季,我申请了 2021 年秋季的 WasmEdge CNCF LFX Mentorship:在 WasmEdge 中实现 WASI-Crypto 提案。

在 WasmEdge 实现 Wasi-crypto 的代码已经基本完成,我想把 LFX mentorship 的经历和大家分享一下。希望这篇文章能为想要加入开源项目并为之做出贡献的人提供一些帮助。我会在这篇文章介绍 LFX mentorship 是如何工作的,我是如何完成任务,以及我在这其中的所思所想。

我之所以选择这个项目,是因为我想参与一个具有挑战的开源项目的开发,而虚拟机正是我感兴趣的一个领域。通过 LFX Mentorship 来申请加入一个开源项目正是开始做开源贡献的好选择。

在 LFX Mentorship 之前,我在密码学相关领域的知识为零。在参与了 wasi-crypto 的实现之后,我了解了不少关于密码学编程的知识。通过 LFX Mentorship,我将成为 WasmEdge Runtime 项目的贡献者(代码还没正式 merge)。更进一步,我还成为了 wasi-crypto 项目的 collaborator!

wasi-crypto 的简要概述

wasi-crypto 简介

wasi-crypto 是一组可移植的、模块化的、运行时独立的 WebAssembly 原生的 API。在我们可以在保留 WebAssembly sandbox 特性的同时使用 wasi-crypto 来执行加密操作。

为什么我们需要 wasi-crypto

WasmEdge 提供了一个实验性的 WASI Socket API,用于支持 Wasm 中的 Berkeley Sockets API。 WasmEdge 提供了一种打开新 socket、侦听现有 socket 以及发送和接收数据的新方法。

在此之上,我们可以支持更多相关功能(例如 SSL)。要实现此功能,一种可选的方法是将 OpenSSL 库编译为 Wasm 并将其链接为库。但是,性能可能并不好,因为所有计算都是在 Wasm 级别完成的。而另一种可选的方法则是将 OpenSSL 库包装到 Wasm 的 external function 中,例如,将openssl 中的 ssl_connect 绑定到 (import "OpenSSL" "ssl_connect" .. . . )

然而,实现这个功能并不简单。为了简化工作量,我们决定先实现 WASI-crypto 提案,然后再通过这个提案来完成以上事情。

我如何实现 wasi-crypto

分解整体任务

wasi-crypto 是一个比较复杂的项目。但是,我们可以先梳理整个工作,然后分解为几个子任务。我根据 wasi-crypto 提案的模块 和 WasmEdge 的需求对其进行了划分。

选择一个合适的的开源加密库

显然,从头开始实现加密库是不现实的,没有必要重新发明轮子。C/C++ 中有许多与加密相关的库,我们很容易就能找到一个开源加密库作为我们的底层实现。经过挑选和研究,我们选择了OpenSSL。

原因如下:

OpenSSL 是最著名的加密库,它足够强大和安全。大多数 Linux 发行版都预装了 OpenSSL 包。在大多数边缘设备上运行 Linux 系统和 WasmEdge 的情况下,使用 OpenSSL 库可以使 WasmEdge 的大小保持较小。而且,OpenSSL 的开源许可证不影响 WasmEdge 的开源许可证,OpenSSL 由两部分组成:libssl 和 libcrypto,其中的 libssl 提供了我们需要的算法。

当然,也有缺点。OpenSSL 的 API 设计对开发人员并不友好,这在 3.0 中已进行了改进。

此外,OpenSSL 3.0 的性能并不令太人满意。

因此,在与我的导师 Hydai(WasmEdge 的核心维护者)讨论后,我们选择了 OpenSSL v1.1.1。

在 GitHub 上记录进度

我每周会与 WasmEdge 的 mentor Hydai 开会,讨论进展和下一步安排。每次会议结束后,我都会记录当前的进度,并将它们与最初的安排进行比较,看看我是否能够按时完成工作。在实施 wasi-crypto 过程中,我的计划发生了多次更改,但我认为这是不可避免的——动态调整任务的安排十分重要。

受邀成为 wasi-crypto 的维护者

为了在 WasmEdge 中实现 wasi-crypto,我反复阅读了很多次规范。在此过程中,我发现了 wasi-crypto 规范中的一些问题,包括typo、示例和规范不一致的一些地方以及一些标准未覆盖的地方。

所以我在 wasi-crypto 创建了一些 issue 与社区沟通,而对于已经确定的问题,我会通过 pull request 来修复它们。在这个过程中,我收到了来自 wasi-cryotp 维护者的积极响应。直到某天,我收到为 wasi-crypto 编写测试的邀请,并且受邀成为一名 maintainer 以进一步改进 wasi-crypto。这真的很令人惊讶——开源不需要你特别的专业,你只需要保持热情。从简单的 typo 开始,然后更多地参与并提出一些示例/标准上的建议,社区将永远欢迎你并帮助你纠正错误。

开源协作过程中的一些问题

避免大量无意义的 git log

在项目开始时,由于我对于 wasi-crypto 的了解还不够深入,经常有一些大规模的改动。这些改动有时候毫无相关性,但是粘连在一起,我提交了很多没有意义的 git commit,这让 reviewer 感到困惑。从这件事情,我学到的教训是,在编写代码之前,必须要建立起一个合适的模型并弄清楚如何设计,更好的做法是什么。否则,我们可能会在后面的阶段浪费大量的时间。

编写足够的单元测试

在大多数开源项目中,测试是必不可少的。例如,WasmEdge 使用测试覆盖率作为代码质量评估的关键指标。

wasi-crypto 有一个定义良好的类 POSIX 接口,并且很容易编写单元测试。但是我前期只写了几个简单的单元测试,显然还不够。

因此当我写了更多的单元测试来达成要求的覆盖率时,我发现了不少实现上的问题。藉此,我了解到单元测试和 TDD(Test-Driven Development)的必要性。

接下来做什么

对于目前的设计,仍然有很多可以优化的的地方,我会去尝试重构以获得更好的性能。

另外,尽管我已经在 host side 做了很多测试,但 client side 的测试也是必不可少的。而且 wasi-crytpo 提案目前并没有通用的 .wasm 测试。所以我会将在 WasmEdge 中添加 .wasm 的测试,并且将其推进到 wasi-crypto 提案之中。

总结

因为既要照顾到自己的学业,也要同时完成项目,以之前从未学习过密码学的基础,在为期 3 个月的指导期间内我并没有完成所有任务。但我仍然在努力在 WasmEdge 中实现 wasi-crypto - 我相信在社区的帮助下我将能够完成这一目标。现在这一工作即将到达尾声。

参与开源项目, 尤其是基础设施工作方面的开发是一种令人兴奋的体验,我希望这篇文章可以帮助那些想要申请类似 LFX MentorShip 项目的新开发者,比如正在进行中的 GSoC 以及即将开始的开源之夏。对于想要参与开源项目并尝试实现一些有意思的工作的每个人来说,这种社区项目是很好的第一步。

谷歌编程之夏即将开启,快来申请开源任务吧

CNCF LFX Mentorship:从对密码学一无所知到在 WasmEdge 中实现 wasi-crypto相关推荐

  1. OpenKruise 开发者不容错过的带薪实习机会!马上加入 LFX Mentorship 计划

    LFX Mentorship 计划由 Linux Foundation 组织发起,为像 OpenKruise 这样的 CNCF 托管项目提供了激励开源贡献.扶植社区发展的优秀土壤.参与其中的开发者不仅 ...

  2. 密码学系列之:加密货币中的scrypt算法

    文章目录 简介 scrypt算法 scrypt算法详解 scrypt的使用 简介 为了抵御密码破解,科学家们想出了很多种方法,比如对密码进行混淆加盐操作,对密码进行模式变换和组合.但是这些算法逐渐被一 ...

  3. ctf古典密码学特征大全(更新中)

    目录 字母表打乱 rot13 凯撒密码(有秘钥可枚举) 文字倒序排列 埃特巴什码 数字打乱 rot5 字母和数字 字符加字母和数字打乱 rot47 有密钥 serpent蛇密码 维吉尼亚密码 有无秘钥 ...

  4. 一种伪DNA密码学方法

    https://arxiv.org/pdf/0903.2693.pdf 这篇是论文的翻译加个人理解,就其中有些问题邮件询问了Kang Ning老师,得到的回复就是--Will update short ...

  5. 【翻译】2021年LFX秋季项目。一个成功的季节,有37名实习生毕业!

    作者:Ihor Dvoretskyi 12月16日, 2021年 发表人:Ihor Dvoretskyi 自2019年以来,CNCF通过LFX项目接待实习生的经验非常丰富,帮助数百名开发者开始接触开源 ...

  6. 聚焦云原生,阿里云与 CNCF 共话「云未来,新可能」

    12 月 9 日,一场属于中国开发者的年度技术盛宴即将拉开帷幕 -- 由云原生计算基金会 CNCF 主办的 KubeCon + CloudNativeCon + Open Source Summit ...

  7. 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新

    文章目录 简介 什么是区块链 区块链不是什么 区块链的基础:密码学 区块链的基础:分布式系统和共识机制 超级账本Hyperledger 以太坊 Libra 比特币 总结 简介 区块链是一种防篡改的共享 ...

  8. 密码学系列之:碰撞抵御和碰撞攻击collision attack

    简介 hash是密码学和平时的程序中经常会用到的一个功能,如果hash算法设计的不好,会产生hash碰撞,甚至产生碰撞攻击. 今天和大家详细探讨一下碰撞攻击. 什么是碰撞攻击 所谓碰撞攻击指的是对于同 ...

  9. 密码学系列之:memory-hard函数

    文章目录 简介 为什么需要MHF Memory hard的评估方法 MHF的种类 MHF的密码学意义 memory-hard在MHF中的应用 简介 Memory hard function简称为MHF ...

最新文章

  1. R语言将多个dataframe导出到excel的多个表单(sheet)实战
  2. 导入Scrapy 项目报错:no module named scrapy
  3. lua调用.so测试
  4. R语言与非参数检验之两独立样本中位数检验
  5. IAR stm8 调试时无法看到局部变量解决
  6. pycharm如何汉化
  7. c++ 二次开发 良田高拍仪_六枝特良田LYV-850加工中心导轨配套防护罩日常维修
  8. NETBACKUP error 90
  9. mysql时间 gt_关于Mysql 5.6 TIMESTAMPDIFFgt;=和gt;的一个问题 - SegmentFault 思否
  10. 计算机 管理策略,有关管理组策略管理模板的建议 (.adm) 文件
  11. 谷粒商城:02. 数据库初始化以及SQL语句
  12. MySQL-第八篇MySQL内置函数
  13. DataType error: cannot resolve DataType of [[[D
  14. 卸载Notepad++
  15. 堆排序(java完整代码)
  16. IDA动态调试SO文件
  17. 计算机屏幕坐标系转换,测量坐标系到计算机屏幕坐标系的换算
  18. 连接防火墙/路由器的几种方式
  19. 计算机网络说明文,电脑的说明文600字
  20. 【Linux】git提交三把斧

热门文章

  1. 软考高项:英语专题及真题
  2. Android:密度计算器
  3. 复杂可编程逻辑器件的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  4. 海词词典—浏览器划词助手使用教程
  5. [PAT A1025]PAT Ranking
  6. 网络营销广告投放策略
  7. Python学习--Machine-Learning 吴恩达机器学习编程作业 (第六周)
  8. 网络侦察及其防御技术研究综述
  9. 快速解决U盘无法拷贝大文件
  10. 快速近似最近邻算法_数据科学家指南,以选择最佳近似最近邻算法