jku/keylet

GitHub: jku/keylet

Tillitis TKey 硬件签名令牌的 Python 客户端库,提供 ML-DSA 和 Ed25519 签名与验证功能。

Stars: 1 | Forks: 0

# keylet -- Tillitis TKey 的客户端库 [![GitHub 上的 keylet](https://img.shields.io/badge/GitHub-jku%2Fkeylet-blue?logo=github)](https://github.com/jku/keylet) [![PyPI 上的 keylet](https://img.shields.io/pypi/v/keylet.svg)](https://pypi.org/project/keylet/) [![keylet 文档](https://img.shields.io/badge/Documentation-blue)](https://jku.github.io/keylet/) Keylet 是一个用于 [Tillitis TKey](https://www.tillitis.se/products/tkey/) 安全令牌的 Python 客户端库和 CLI 工具,并为 TKey 实现了 ML-DSA / Ed25519 签名器应用。 TKey 的独特之处在于它没有长期存储:签名密钥_始终_是在 runtime 从 seed 生成的。该 seed 是通过组合 Unique Device Secret、Device Application hash 和可选的 User Supplied Secret 构建而成的。Device Application 和 User Supplied Secret 都是在 runtime 由 `keylet` 提供的。 这种独特的设计导致了一些 API 的特殊性: * User Supplied Secret(passphrase)不会直接由 keylet 验证:“错误”的 passphrase 只会导致使用不同的签名密钥。在实践中,调用方应用应该检查 `TKeySign.get_pubkey()`:如果密钥与预期不符,则可能使用了错误的 passphrase。 * 在长期使用中(预期在一段时间内使用相同的签名密钥),调用方应用负责始终选择相同的 Device Application:`keylet` 为此提供了一种机制,请参见示例。 * 在初始化之后,更改设备应用或 passphrase 的唯一方法是拔下设备并重新开始。 * 签名器初始化有一种优化措施:如果 TKey 已经使用匹配的设备应用名称和版本进行了初始化,则初始化将会成功。遗憾的是,`keylet` 无法确认确切的设备二进制文件是否为预期的那个,或者 passphrase 是否仍然是同一个(但同样地,调用方应用可以将 `TKeySign.get_pubkey()` 与预期的密钥进行比较) ## 安装 ``` pip install keylet ``` ## CLI 用法 该软件包安装了一个用于签名和验证的 `keylet` 命令行工具。这主要是该库的一个测试/演示应用。 ``` # 无密码短语签名,然后验证 $ keylet sign README.md $ keylet verify README.md # 获取公钥,使用密码短语签名,并使用保存的公钥进行验证 $ keylet --passphrase hunter2 pubkey --output pub.key $ keylet --passphrase hunter2 sign README.md $ keylet verify --pubkey pub.key README.md # 长期使用 keylet 时,请记住指定 device app digest(keylet 的默认 # app 版本可能会改变,但您将需要一个特定的应用程序才能继续使用相同的 # key) $ keylet --passphrase hunter2 --digest 186bcf6 sign README.md ``` ## 库用法 ``` from keylet import TKeySign, SignApp # 加载默认的嵌入式 ML-DSA signer app = SignApp.load_mldsa() digest = app.digest # 使用密码短语初始化 signer with TKeySign(app=app, secret="hunter2") as signer: # Sign a payload signature = signer.sign(b"my payload") ``` 在长期使用中,应使用设备应用摘要来确保同一个应用 始终用于特定密钥: ``` # 加载之前存储了 digest 的应用程序 app = SignApp.load_mldsa(digest=digest) # 使用密码短语初始化 signer with TKeySign(app=app, secret="hunter2") as signer: # Sign a payload signature = signer.sign(b"my payload") ``` 有关更多详细信息,请参阅 [API 参考](https://jku.github.io/keylet/api/)。 ## 开发 [uv](https://docs.astral.sh/uv/) 是必需的开发工具。 ``` # 运行 linters 和 type checker make lint # 修复格式和 lint 问题 make fix # 运行测试 make test # 运行测试,包括 on-device 测试 make test-device ```
标签:CVE, Python, 客户端库, 抗量子密码, 数字签名, 文档结构分析, 无后门, 硬件安全密钥, 逆向工具