sememtac/mememage
GitHub: sememtac/mememage
Mememage 通过在图像底部编码标识符与内容哈希,实现图像副本与外部 JSON 记录之间的防篡改绑定验证。
Stars: 0 | Forks: 0
# Mememage
将标识符编码到图像的像素中;根据任意副本验证 JSON 记录。
Mememage 会在图像底部写入一个 2 像素高的条带。它携带一个**标识符**(指向你存储在任意位置的 JSON 记录的短指针)和一个**内容哈希**(对该记录进行 SHA-256 计算后的前 16 位十六进制值)。`verify` 会重新计算哈希并将其与条带进行比较。修改任何字段,验证都会失败。
Core 仅通过哈希来证明记录到图像的*绑定*。它**不**校验像素(编辑图像但保留条带,它依然会验证通过),也**不**证明作者身份(那是签名的职责,不在讨论范围内)。根据设计,两个键保留在哈希之外,即 `signature` 和带有 `_` 前缀的键,并且 `encode` 会拒绝将它们作为你自己的字段名。
```
pip install mememage # encode / decode / verify (Pillow included)
# pip install "mememage[encrypt]" # adds AES-256 field encryption
```
## 快速开始
```
import mememage
# encode: write the bar, build a record from your fields
result = mememage.encode("photo.png", {"title": "Morning fog", "by": "catmemes"})
result.identifier # 'mememage-3dc5f03a747bb38e' (derived from your fields)
result.save("photo.json") # a record, stored or served separately
# decode: read the bar back out of any copy (PNG, JPEG, a screenshot)
bar = mememage.decode("photo.jpg")
bar.identifier, bar.content_hash
# verify: does a record match an image?
mememage.verify("photo.jpg", result.record) # truthy if intact
```
Core 不进行任何网络操作。`decode` 会为你提供一个标识符;在你保存记录的任何地方(字典、文件、DB、URL)解析出记录,然后使用 `verify`。
**哈希模型(`hash_version`)。** Core 实现了 **`open`** 模型 —— 它会对除 `content_hash`/`signature` 之外的每个字段进行哈希处理,因此无论你在记录中放入什么,都具有防篡改性。`encode` 会盖上 `hash_version: "open"` 的戳记。应用程序可以定义自己精选的 `hash_version`(固定的包含字段集),而 Core 不实现它;`verify` 会将此类记录报告为**不支持**(`Verification.supported == False`)而不是哈希不匹配 —— 它会安全失败(`bool()` 为 `False`),但这*不是*防篡改证据。请使用定义了该版本的应用程序(例如其自带的解码器)来验证这些记录。CLI 会打印 `UNSUPPORTED` 并以状态码 `3` 退出。
## 加密私有字段
将字段标记为 `private` 即可在密码下对其进行加密(通过 PBKDF2 使用 AES-256-GCM)。它依然可以在**没有密码的情况下进行验证**(哈希涵盖了密文),而 `unlock` 会显示这些字段。密码永远不会被存储。
```
result = mememage.encode("photo.png", {"title": "Public", "gps": "45.5,-122.6"},
password="hunter2", private=["gps"])
mememage.verify("photo.png", result.record) # matches, no password
mememage.unlock(result, "hunter2")["gps"] # '45.5,-122.6'
```
## 命令行
```
mememage encode photo.png --field title="Morning fog" -o photo.json # write the record
mememage decode photo.jpg --record photo.json # VERIFIED (0) / RECORD ALTERED (1) / UNSUPPORTED (3)
mememage decode photo.jpg # read the identifier only
```
如果不使用 `-o`,记录会作为 `
.json` 存放在图像旁边。如果使用 `--record`,`decode` 在匹配时以 0 退出,在不匹配时以 1 退出;如果不使用它,退出代码 0 仅表示读取到了条带。
## 许可证
MIT。标签:Zenmap, 元数据绑定, 哈希校验, 图像处理, 数据完整性, 逆向工具, 防篡改