用 DotBGE 或 bge 打开 AmberHush 备份
AmberHush 的照片和备份都采用开放的 BGE3 格式,不会被锁在 App 里。有一份完整的备份和对应凭据,就能在 Mac 或 Linux 电脑上,用免费的 bge 命令行工具打开照片。整个解密过程都在你的电脑上完成。
更新于 2026 年 10 月 9 日 · 当前备份格式:schema 3 · 命令使用 bge 0.1.1 核验
1. 准备什么
- 在 AmberHush 中生成的完整备份文件夹,包括
manifest.json和objects/。恢复码或导出的私钥本身不含照片。iPhone 系统备份应先通过 iOS 恢复。 - 一种能打开图库的凭据:备份时使用的主密码、与这份备份匹配的恢复码,或者在 AmberHush 里导出的私钥文件及其密码。用 iPhone 锁屏密码保护的保险箱,请使用恢复码或导出的私钥;bge 无法用面容 ID 或 iPhone 锁屏密码解开备份。
- 一台可信任的电脑,以及足够存放解密文件的空间。
下载免费的 bge 工具(macOS 或 Linux)。在 macOS 上也可以通过 Homebrew 安装:
brew install --cask dotbge/tap/bge
bge --version
先复制一份备份,再创建单独的工作文件夹,并在这个文件夹中打开终端。下面的命令使用复制到工作文件夹里的文件,不需要改动原备份。看到 -p 时,执行命令后按提示输入密码,不要把密码写进命令。
生成的 PEM 私钥、文件清单、照片和视频都是明文。请放在受保护的位置,不要上传到本网站或发给客服;完成后删除临时私钥。可以保存或打印本页,留作离线指南。
2. 找到备份里的实际文件
用文本编辑器打开 manifest.json。schema 3 的 keys 列出图库的钥匙文件。找到 path 以所需文件名结尾的条目,例如 /identity.password.bge。
path 是逻辑名称,不是文件在备份中的实际位置。实际文件名由同一条目的 objectName 指定:先打开 objects/,再打开以该文件名前两个字符命名的子文件夹。例如,objectName 以 ab 开头时,文件在 objects/ab/<完整的 objectName>。如果找不到,再检查旧布局下的 objects/ 根目录。
把找到的对象复制到工作文件夹,只将副本改名为下面命令所用的名字,例如 identity.password.bge。每个所需文件都按这个方式查找。还可在 macOS 用 shasum -a 256、Linux 用 sha256sum 计算对象的 SHA-256,与条目的 sha256 核对。
3. 解开图库私钥
以下三条路径选一种即可,结果都是 library-key.pem。尝试另一条路径时请换一个工作文件夹,避免覆盖已有输出。
用主密码
从 keys 定位并复制 identity.password.bge,执行后输入生成这份备份时使用的主密码。
bge decrypt identity.password.bge -p -o library-key.pem
用恢复码
从 keys 定位并复制 recovery.private.bge 和 identity.recovery.bge。恢复码必须与这份备份匹配,并按保存时的原样输入:大写、保留连字符。较新的恢复码可能打不开较早的备份。
bge decrypt recovery.private.bge -p -o recovery-key.pem
bge decrypt identity.recovery.bge -k recovery-key.pem -o library-key.pem
用导出的私钥
在 AmberHush 的 设置 › 高级 › 导出私钥 里保存的是 AmberHush_key_backup.bge:DotBGE 使用的密钥备份格式,用你设置的私钥密码保护。它是单独的文件,不在备份里。把它复制到工作文件夹,输入私钥密码。解开得到一个 JSON,其中 privateKeyPEM 一项就是图库私钥,把它另存为 library-key.pem:
bge decrypt AmberHush_key_backup.bge -p -o key-backup.json
plutil -extract privateKeyPEM raw -o library-key.pem key-backup.jsonplutil 是 macOS 自带的工具;Linux 上用 jq -r .privateKeyPEM key-backup.json > library-key.pem。JSON 里的 keyID 与 AmberHush 设置 › 高级 里的密钥编号一致。用完请删除 key-backup.json,它含有私钥。
如果你在用 DotBGE,也可以用“导入密钥备份”把这个文件导入 DotBGE,之后就能在 DotBGE 里打开为这个保险箱加密的文件。导出的私钥只包含图库;每个私密空间有自己的私钥(第 6 步)。
4. 解开文件清单
回到 manifest.json,找到 list.objectName。按第 2 步定位对象,复制到工作文件夹并改名为 list.bge,然后解密:
bge decrypt list.bge -k library-key.pem -o file-list.json
打开 file-list.json。其中 files 数组将每个逻辑 path 对应到一个 objectName,顶层的 vaultID 是主图库的空间编号。按这份清单找文件;不要直接解密所有对象,因为备份中还可能保留已不在最新清单中的历史对象。
5. 解开照片和视频
找到 spaces/<vaultID>/media/ 下的条目。按第 2 步定位其中一个对象,复制为 selected-media.bge。先查看加密元数据中的原文件名和类型,再选择合适的输出名:
bge inspect selected-media.bge -k library-key.pem
bge decrypt selected-media.bge -k library-key.pem -o recovered-photo.heic
recovered-photo.heic 只是示例,请按实际类型改成 .jpg、.mov、.mp4 或对应扩展名。工具不会自动采用元数据里的原文件名。对需要的资源重复这个过程;缩略图是独立资源,实况照片还有静态照片和视频两个部分,应一起保留。
较早封存的媒体可能没有文件名元数据。它的加密目录记录了 originalFilename、资源角色、相册归属和拍摄信息。目录条目在 spaces/<vaultID>/catalog/ 下,用同一把私钥解密。还原目录状态需要最新有效快照及其后的日志,可按下方说明读取。上面的步骤取回单个文件,不会直接生成 Apple“照片”的完整图库。
从旧文件的加密目录中读取文件名和资源类型
在 file-list.json 中定位目录条目,将对应对象复制为 catalog-entry.bge,再用所属空间的钥匙解密:
bge decrypt catalog-entry.bge -k library-key.pem -o catalog-entry.json
找到资源的 encryptedFilename,让它与媒体逻辑路径中的 UUID 文件名对应(不是哈希命名的 objectName)。该资源记录了 originalFilename、uniformTypeIdentifier 和 role;sourceSHA256 可以核对解密后的内容。缩略图不是完整原件。所属项目还记录了拍摄信息和相册编号。
要还原最新的目录状态,从序号最大的有效 snapshot-….bge 开始;解出的 JSON 包含 sequence、lastEntryHash、assets 和 albums。再按序读取 catalog/journal/ 中序号更大的日志,快照后的首条日志用 previousHash 对照快照的 lastEntryHash;之后每条都对照上一条明文 JSON 原始字节的 SHA-256(不要先重新排版 JSON),并应用 operation 及其字段;batch 按顺序应用 changes。没有快照时从序号 1 开始。缺号、哈希不符或必要条目无法解密,都意味着无法完整重建当前元数据;单个完好的媒体文件仍可解密。
6. 私密空间需要自己的钥匙
图库私钥可以打开 schema 3 的文件清单,但不能解开私密空间的媒体。先用图库凭据按上述步骤打开清单,再找到所需私密空间的 spaces/<空间编号>/ 条目。不同空间的工作文件请分开保存。如果不知道空间编号,可以用私密空间密码逐个尝试候选空间的密码包装文件,每次换一个输出文件名;只有匹配的密码才能解开。
用该空间密码时,将它的 identity.password.bge 复制为 private-identity.password.bge,一个媒体对象复制为 private-media.bge。输出扩展名仍应按实际文件类型调整:
bge decrypt private-identity.password.bge -p -o private-key.pem
bge inspect private-media.bge -k private-key.pem
bge decrypt private-media.bge -k private-key.pem -o recovered-private-photo.heic
如果这份备份中的私密空间允许用恢复码找回,可以使用第 3 步从图库的 recovery.private.bge 解出的 recovery-key.pem。私密空间有自己的 identity.recovery.bge,没有单独的 recovery.private.bge。把该空间的包装文件复制为 private-identity.recovery.bge,并把恢复钥匙复制到这个工作文件夹:
bge decrypt private-identity.recovery.bge -k recovery-key.pem -o private-key.pem
得到的 private-key.pem 用于解密该空间的媒体。前提是该空间已启用恢复,且它的包装文件与这份备份中的恢复钥匙匹配。如果更换恢复码时尚未更新这个私密空间,请用它自己的密码,或旧备份中与它匹配的恢复文件。
7. 旧版备份
schema 1、2 的 manifest.json.files 已经是文件清单,没有需要解密的 list;直接在其中查找钥匙和媒体条目。schema 1 的对象可能直接放在 objects/ 中。早期备份若不含 recovery.private.bge,需要当时保存、且包含这个文件的原始恢复工具包,只有恢复码不能代替它。
8. 遇到问题
- 找不到文件:检查
objectName、两字符子目录和备份是否完整复制。逻辑path不是磁盘路径。 - 无法解密:核对备份日期、对应的密码/恢复码/密钥,以及对象哈希;也可能是密文损坏。
- 输出已存在:换一个输出名或工作文件夹,保留现有文件。
- 不支持的格式:更新 bge,不要修改版本号或密文。
如果所有可用凭据都已遗失,本指南和开发者都无法找回钥匙。需要咨询操作步骤时,可联系支持,无需发送凭据或私密文件。