17 个版本

0.2.3 2024年2月4日
0.2.1 2023年12月13日
0.1.13 2022年2月14日
0.1.11 2021年12月2日
0.1.10 2021年11月29日

#33WebAssembly

Download history 63/week @ 2024-04-20 1/week @ 2024-04-27 2/week @ 2024-06-29 21/week @ 2024-07-06 63/week @ 2024-07-27

84 每月下载量
wasmsign2-cli 中使用

MIT 许可证

81KB
1.5K SLoC

GitHub CI docs.rs crates.io

Wasmsign2

用于签名 WebAssembly 模块的工具和库。

WASM 签名

与典型的桌面和移动应用程序不同,WebAssembly 二进制文件不嵌入任何类型的数字签名以验证它们来自受信任的来源,并且没有被篡改。

Wasmsign2 接取现有的 WebAssembly 模块,为其内容计算签名,并将签名存储在自定义部分。

生成的二进制文件仍然是一个独立的、有效的 WebAssembly 模块,但在执行之前可以验证签名。

Wasmsign2 是 WebAssembly 模块签名提案的实验性实现。文件格式在 WebAssembly 工具约定存储库 中有记录。

该提案和此实现支持特定领域的功能,例如

  • 对单个模块具有多个签名的功能,具有紧凑的表示
  • 对已用不同密钥签名的模块进行签名的能力
  • 在不破坏现有签名的情况下,用额外的自定义部分扩展现有模块的能力
  • 使用单个签名验证模块的多个子集的能力
  • 将嵌入的签名转换为分离的,反之亦然的能力

安装

wasmsign2 是一个 Rust crate,可以在其他应用程序中使用。

有关详细信息,请参阅 API 文档

它也是一个 CLI 工具,用于执行常见操作,其用法总结如下。

该工具需要 Rust 编译器,可以使用以下命令进行安装

cargo install wasmsign2-cli

使用

USAGE:
    wasmsign2 [FLAGS] [SUBCOMMAND]

FLAGS:
    -d               Print debugging information
    -h, --help       Prints help information
    -V, --version    Prints version information
    -v               Verbose output

SUBCOMMANDS:
    attach           Embed a detach signature into a module
    detach           Detach the signature from a module
    help             Prints this message or the help of the given
                     subcommand(s)
    keygen           Generate a new key pair
    show             Print the structure of a module
    sign             Sign a module
    split            Add cutting points to a module to enable partial
                     verification
    verify           Verify a module's signatures
    verify_matrix    Batch verification against multiple public keys

检查模块

wasmsign2 show --input-file <input_file>

示例

wasmsign2 show -i z.wasm

- 开关打印签名数据的附加详细信息。

创建密钥对

wasmsign2 keygen --public-key <public_key_file> --secret-key <secret_key_file>

-K, --public-key <public_key_file>    Public key file
-k, --secret-key <secret_key_file>    Secret key file

示例

wasmsign2 keygen --public-key key.public --secret-key key.secret

签名 WebAssembly 模块

wasmsign2 sign [OPTIONS] --input-file <input_file> --output-file <output_file> --secret-key <secret_key_file>

-i, --input-file <input_file>            Input file
-o, --output-file <output_file>          Output file
-K, --public-key <public_key_file>       Public key file
-k, --secret-key <secret_key_file>       Secret key file
-S, --signature-file <signature_file>    Signature file
-Z, --ssh                                Parse OpenSSH keys

示例

wasmsign2 sign -i z.wasm -o z2.wasm -k secret.key

公钥是可选的。它仅用于将密钥标识符包含在签名中,以便在模块包含使用不同密钥制作的多个签名时加快签名验证速度。

默认情况下,假设签名嵌入在模块中。可以通过可选的 --signature-file 参数提供分离的签名。

已签名的模块可以使用其他密钥签名,并且可以使用相应的任何公钥进行验证。

验证 WebAssembly 模块

wasmsign2 verify [FLAGS] [OPTIONS] --input-file <input_file>

-i, --input-file <input_file>            Input file
-K, --public-key <public_key_file>       Public key file
-S, --signature-file <signature_file>    Signature file
-s, --split <regex>                      Custom section names to be verified
-G, --from-github <from_github>          GitHub account to retrieve public keys from
-Z, --ssh                                Parse OpenSSH keys

示例

wasmsign2 verify -i z2.wasm -K public.key

可选的 -/--split 参数在下面的 "部分验证" 部分中有文档说明。

针对多个公钥验证 WebAssembly 模块

wasmsign2 verify_matrix [FLAGS] [OPTIONS] --input-file <input_file>

-i, --input-file <input_file>              Input file
-K, --public-keys <public_key_files>...    Public key files
-s, --split <regex>                        Custom section names to be verified
-G, --from-github <from_github>            GitHub account to retrieve public keys from
-Z, --ssh                                  Parse OpenSSH keys

该命令同时验证模块的签名与多个密钥,并报告找到有效签名的公钥集合。

可选的 -/--split 参数在下面的 "部分验证" 部分中有文档说明。

示例

wasmsign2 verify_matrix -i z2.wasm -K public.key -K public.key2

从模块中分离签名

wasmsign2 detach --input-file <input_file> --output-file <output_file> --signature-file <signature_file>

-i, --input-file <input_file>            Input file
-o, --output-file <output_file>          Output file
-S, --signature-file <signature_file>    Signature file

该命令从模块中提取并删除签名,并将其存储在单独的文件中。

示例

wasmsign2 detach -i z2.wasm -o z3.wasm -S signature

在模块中嵌入分离的签名

wasmsign2 attach --input-file <input_file> --output-file <output_file> --signature-file <signature_file>

-i, --input-file <input_file>            Input file
-o, --output-file <output_file>          Output file
-S, --signature-file <signature_file>    Signature file

该命令将分离的签名嵌入到模块中。

示例

wasmsign2 attach -i z2.wasm -o z3.wasm -S signature

部分验证

签名可以验证整个模块,也可以验证其一个或多个子集。

这需要在签名过程之前定义 "切割点"。超出切割点边界无法验证签名。

可以使用 split 命令将切割点添加到模块中。

wasmsign2 split [OPTIONS] --input-file <input_file> --output-file <output_file>

-i, --input-file <input_file>      Input file
-o, --output-file <output_file>    Output file
-s, --split <regex>                Custom section names to be signed

这添加了切割点,以便除了标准部分外,还可以验证名称与正则表达式匹配的自定义部分的子集。

此命令可以重复使用,向已为部分验证准备好的模块添加新的切割点。

示例

wasmsign2 split -i z2.wasm -o z3.wasm -s '^.debug_'

上面的命令使得仅验证名称以 .debug_ 开头的自定义部分成为可能,即使整个模块都已签名。

为了进行部分验证,验证命令中也有 --split 参数。

wasmsign2 verify -i z3.wasm -K public.key -s '^.debug_'
wasmsign2 verify_matrix -i z3.wasm -K public.key -K public.key2 -s '^.debug_'

OpenSSH 密钥支持

除了提案中记录的紧凑密钥格式外,API 还允许使用 DER 和 PEM 编码加载/保存公钥和私钥。

通过在 signverifyverify_matrix 命令中添加 --ssh 标志,也可以使用 OpenSSH 密钥,前提是它们是 Ed25519 (EdDSA) 密钥。

示例

wasmsign2 sign --ssh -k ~/.ssh/id_ed25519 -i z.wasm -o z2.wasm
wasmsign2 verify --ssh -K ~/.ssh/id_ed25519.pub -i z2.wasm

如果文件包含多个公钥,则 verify_matrix 命令将针对所有发现的 Ed25519 密钥检查签名。

可以从 https://github.com/<account>.keys 下载 GitHub 账户的公钥集合,将 <account> 替换为实际的 GitHub 账户名称。

可以从此类 URL 下载的密钥可以直接用于验证 WebAssembly 签名。

GitHub 集成

还可以使用 --from-github 参数自动从 GitHub 账户检索公钥。

示例

wasmsign2 verify -G example_account -i z2.wasm
wasmsign2 matrix_verify -G example_account -i z2.wasm

依赖项

~3–5MB
~92K SLoC