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
120KB
2K SLoC
用于签名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
标志添加到sign
、verify
和verify_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