# wasm-module # 签名 # webasm # 安全

app wasm-sign-cli

WebAssembly模块签名和验证工具,用于证明WebAssembly字节码的真实性和完整性。签名作为自定义部分附加到模块末尾。签名模块可以通过网络传输。解析签名模块的接收者将“看到”一个额外的自定义部分,类型为0,名称为“signature”。签名会增加118字节的开销。

1个不稳定版本

使用旧的Rust 2015

0.2.0 2018年2月21日

WebAssembly 中排名第1194

Apache-2.0

33KB
424

WebAssembly模块签名

本存储库描述了WebAssembly模块签名(WAMS)的设计和高级概述

概述

WebAssembly模块签名应证明WebAssembly模块(无论作为文件还是解析)的真实性和完整性。

要求

WebAssembly模块签名应提供以下功能

  • 可以在不解析的情况下对WebAssembly模块文件进行签名
  • 签名对静止数据和传输中的数据序列化、二进制形式的数据进行签名。
  • 模块应完整无损地签名,包括所有自定义部分。
  • 模块部分不应重新排序以满足规范形式。
  • 所有模块签名应具有相同的字节数。
  • 可以在不解析模块的情况下验证签名
  • 可以使用简单的工具将WebAssembly模块分割为两部分,签名和签名内容
  • 签名应使用ECDSA算法与SHA256。
  • 公钥可以公开可用,并且可以使用DNS-TXT记录进行分发。

建议

  • WebAssembly模块签名是一个自定义部分,类型ID为0,部分名称必须由9个字符组成,因此所有签名具有相同的字节数
  • 模块应只包含一个签名(将来可能扩展)
  • 签名对模块的所有部分进行签名,如原样。
  • 名为“signature”的自定义部分(9个字符)是默认签名。
  • 自定义部分的有效载荷包含ECDSA签名;整个部分具有字节数118。
  • 新的签名部分应仅附加到模块末尾。
  • 从模块字节码中移除最后118个字节,签名部分将被剪除。
  • 工具应支持初始版本的secp256k1,并在未来版本中支持Ed25519和secp384r1(因此预留了末尾的字节)

每个签名部分由118个字节序列组成

字段 字节
部分类型(自定义) 0
部分大小 116
部分名称长度 9
部分名称字节[9] [115, 105, 103, 110, 97, 116, 117, 114, 101](读作“签名”)
签名类型 0 代表 ECDSA/SHA256,最大摘要长度为 72 字节
签名长度 单字节值 72 或更少
签名 [...]
填充字节 0..33 填充字节,将摘要长度扩展到最多 104 字节(secp384r1)

签名始终附加在 WASM 文件的末尾。如果接收到已签名的 WASM 文件,可以截断最后 118 个字符以获取 WASM-Signature 部分。以下索引允许使用命令行工具或 JavaScript 验证签名,而无需解析 WASM 模块字节码

  • 索引 0..11 固定字节序列 [0, 116, 9, 115, 105, 103, 110, 97, 116, 117, 114, 101]
  • 索引 12 SIGNATURE_TYPE(目前唯一有效的值是 '0',表示曲线 secp256k1/SHA256)
  • 索引 13 DIGEST_DATA_LENGTH,可能介于 65..104 之间(如果使用 secp256k1 通常为 70、71 或 72)
  • 索引 14 DIGEST_DATA_START,摘要的第一个字节
  • 索引 14+DIGEST_DATA_LENGTH,摘要的结尾

如果摘要的字节大小为 72(secp256k1),则前导部分如下(之后是 ECDSA 摘要)

[0, 116, 9, 115, 105, 103, 110, 97, 116, 117, 114, 101, 0, 72 ]

摘要使用 secp256k1/SHA256 密码计算。尾部填充字节填满至总长度 118 字节。

用法

私钥生成

这是必须保密的密钥,用于签名字节码文件。

openssl ecparam -name secp256k1 -genkey -noout -out signerkey.pem

公钥生成

这是应该发布或嵌入到您应用程序中的密钥。

openssl ec -in signerkey.pem -pubout -outform pem -out signerkey.pub.pem

签名 WASM 文件

命令行工具在成功时返回退出码 0,否则返回错误码 1

wasm-sign -k signerkey.pem module.wasm signed-module.wasm

验证 WASM 文件

命令行工具在成功时返回退出码 0,否则返回错误码 1

wasm-sign -v -k signerkey.pub.pem signed-module.wasm

签名示例

输出 hexdump -C signed-module.wasm

00000110
00000120  xx xx xx xx xx xx xx 00  74 09 73 69 67 6e 61 74  |j$......t.signat|
00000130  75 72 65 00 47 30 45 02  20 58 20 79 4b 91 52 39  |ure.G0E. X yK.R9|
00000140  75 52 69 f0 cf dc 81 8a  7c d8 ab 08 1d 49 ab c2  |uRi.....|....I..|
00000150  fa 19 79 f5 03 92 e9 9b  87 02 21 00 8f a0 ad 5a  |..y.......!....Z|
00000160  f2 55 ce cf c6 ed 82 15  5a ed 7a 47 43 d9 e5 4e  |.U......Z.zGC..N|
00000170  fd 74 79 e8 80 4e 82 9c  08 eb 8e 9a 00 00 00 00  |.ty..N..........|
00000180  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000190  00 00 00 00 00 00 00 00  00 00 00 00 00 00        |..............  |

构建

cargo build --release

单元测试

cargo test

使用命令行工具进行端到端测试

make test

依赖项

~4–12MB
~141K SLoC