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日 |
#33 在 WebAssembly 中
84 每月下载量
在 wasmsign2-cli 中使用
81KB
1.5K SLoC
用于签名 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 编码加载/保存公钥和私钥。
通过在 sign
、verify
和 verify_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