9个版本

0.2.3 2024年2月4日
0.2.2 2024年2月4日
0.2.1 2023年12月13日
0.1.7 2022年2月14日
0.1.3 2021年11月14日

#59 in WebAssembly

MIT 协议

120KB
2K SLoC

GitHub CI docs.rs crates.io

Wasmsign2

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

WASM签名

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

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

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

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

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

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

安装

wasmsign2 是一个Rust crate,可用于其他应用程序。

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

它也是一个用于执行常见操作的命令行工具,其用法如下所述。

该工具需要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

使用-v开关可以打印签名数据的额外详细信息。

创建密钥对

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

可选的-s/--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

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

可选的-s/--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编码加载/保存公钥和私钥。

如果密钥是Ed25519 (EdDSA)密钥,则可以通过将--ssh标志添加到signverifyverify_matrix命令来使用OpenSSH密钥。

示例

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密钥检查签名。

可以从GitHub账户下载公钥集,地址为https://github.com/<account>.keys,将<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

依赖关系

~8–21MB
~288K SLoC