本页把已加密的 Sekuvo 信封转换为手机可以扫描的二维码帧。它不做任何加密,也绝不索要秘密:信封在你自己的机器上生成,这里只粘贴密文。
最稳妥的方式仍是下载 aktar.html 并从自己的磁盘打开。本页针对的情形是:你在自己的终端里完成加密,只需要二维码展示。
下面的脚本构建的信封与应用打开的完全一致(PBKDF2-HMAC-SHA256 · 310,000 轮 + AES-256-GCM)。将它保存为 zarf-uret.py,运行前先读一遍 —— 大约三十行。密码请生成而不要自己编;第一条命令就是做这件事的。
# macOS / Linux # generate a password (letters+digits, ~119 bits): python3 -c "import secrets,string; print(''.join(secrets.choice(string.ascii_letters+string.digits) for _ in range(20)))" pip3 install cryptography python3 zarf-uret.py "Server SSH" > zarf.json # paste the secret, then Ctrl-D pbcopy < zarf.json # macOS; Linux: xclip -sel clip < zarf.json
# Windows (PowerShell) # generate a password (letters+digits, ~119 bits): python -c "import secrets,string; print(''.join(secrets.choice(string.ascii_letters+string.digits) for _ in range(20)))" pip install cryptography python zarf-uret.py "Server SSH" > zarf.json # paste the secret, then Ctrl-Z + Enter Get-Content zarf.json | Set-Clipboard
#!/usr/bin/env python3
# zarf-uret.py - reads the secret from stdin, writes a Sekuvo envelope to stdout.
# Usage: python3 zarf-uret.py "Title" > zarf.json (paste the secret, then Ctrl-D)
# Requires: pip install cryptography
import sys, os, json, time, base64, hashlib, getpass
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
title = sys.argv[1] if len(sys.argv) > 1 else "Transfer"
secret = sys.stdin.read()
# The app refuses entries above 256 KB; say so here instead of after the scan.
assert len(secret.encode()) <= 256 * 1024, "secret is over 256 KB, the app will not import it"
password = getpass.getpass("Envelope password (ASCII, generated): ")
assert password.isascii() and len(password) >= 8, "ASCII and at least 8 characters"
now = int(time.time() * 1000)
payload = json.dumps({"entries": [{
"type": "NOTE", "title": title,
"createdAt": now, "updatedAt": now, "quick": False,
"data": {"notes": secret},
}]}, ensure_ascii=False)
salt = os.urandom(16)
key = hashlib.pbkdf2_hmac("sha256", password.encode(), salt, 310_000, 32)
iv = os.urandom(12)
blob = iv + AESGCM(key).encrypt(iv, payload.encode(), None)
print(json.dumps({
"app": "vault", "version": 1,
"kdf": {"algo": "PBKDF2WithHmacSHA256", "iterations": 310_000,
"salt": base64.b64encode(salt).decode()},
"cipher": "AES-256-GCM",
"data": base64.b64encode(blob).decode(),
}))
把秘密粘贴到脚本的输入里,而不要写在命令行上 —— 这样它永远不会留在 shell 历史记录中。
Sekuvo → + → 通过二维码导入 → 扫描各帧 → 输入相同的密码 → 添加到现有条目。
← 返回 sekuvo.com