7个不稳定版本
0.6.4 | 2024年3月6日 |
---|---|
0.6.2 | 2023年10月20日 |
0.6.1 | 2023年5月23日 |
0.5.0 | 2023年4月14日 |
0.1.3 |
|
#151 在 密码学
83 每月下载量
在 parside 中使用
455KB
11K SLoC
cesride
用于与可组合事件流表示(CESR)一起使用的密码学原语。
这个库目前处于建设中。如果您想帮忙构建,请查看下面的贡献。
重要参考资料
贡献
如果您想贡献,请查看问题。标签提供了一些指导。
在开始新问题时,确保没有人正在做同样的事情,以避免重复工作(尽管总是欢迎和考虑替代实现)
- 检查是否没有开放拉取请求
- 确保没有人给自己分配了任务
- 查看问题上的评论
- 查看开发集成(“链接了一个可能由这个拉取请求关闭的问题”)
当您找到想要承担的问题时
- 如果可能,为自己分配一个任务
- 在您创建的分支上打开一个拉取请求 - 即使是空的
- 在您正在处理的问题上的评论中粘贴PR链接以供可见
为了更好的协调,请使用本文档底部的链接加入#cesr-dev
Slack频道。
开发
安装依赖项
cargo install cargo-audit
cargo install cargo-tarpaulin
更改一些代码然后自动修复它
make fix
在本地提交更改并运行这些自动化测试
make clean preflight
您现在可以打开一个拉取请求了!
术语
cesride
由命名清晰简洁的密码学原语构建。话虽如此,那些不熟悉命名策略但对密码学熟悉的人可能会在第一次使用cesride
时感到有些困惑。实现已从KERIpy迁移过来,术语也随代码一起携带。基本内容
Diger
- 表示摘要的原始类型。它具有验证输入哈希值是否与其原始值匹配的能力。Verfer
- 表示公钥的原始类型。它具有验证数据签名的功能。Signer
- 表示私钥的原始类型。它具有创建Sigers
和Cigars
(签名)的功能。Siger
- 一种 索引签名。当与标识符关联的多个当前密钥存在时,KERI会使用它。Cigar
- 一种 非索引签名。Salter
- 表示种子的原始类型。它具有生成新Signers
的能力。
每个原始类型都将附加方法,允许用户生成和解析合格的基础2或基础64表示。常见的方
.qb64()
- 将加密材料作为字符串的合格基础64表示.qb64b()
- 将加密材料作为字节(八位组)的合格基础64表示.qb2()
- 将加密材料作为字节(八位组)的合格基础2表示.code()
- 限定代码(描述加密材料类型).raw()
- 原始加密材料(非限定)作为字节(八位组)
限定
Q: 你说的“限定加密材料”是什么意思?
A: 有类似表格的代码表,类似于TLV表,但几乎在所有情况下省略了长度字段(因为原始类型大小固定)。在CESR的术语中,类型或代码传达了足够的信息,以便应用程序可以解析嵌入限定加密材料的数据。
这里是什么意思
DKxy2sgzfplyr-tgwIxS19f2OchFHtLwPWD3v4oYimBx
- 这个前缀是D
。如果我们查看上面答案中链接的表格中的这个代码,我们会发现这是一个可转移的(可旋转的)Ed25519公钥。
ELEjyRTtmfyp4VpTBTkv_b6KONMS1V8-EW-aGJ5P_QMo
- 这个前缀是E
。再次,咨询表格,我们了解到这是一个Blake3 256摘要。
每个原始类型都可以用Base64或二进制表示,并且可以从这两种格式进行处理。
示例
use cesride::{common::Tierage, Salter};
// in this example we sign some data and ensure the signature verifies
let authentic = b"abcdefg";
let forgery = b"abcdefgh";
let mut sigers: Vec<Siger> = vec![];
// delay creating sensitive material until the last moment so it is resident in memory for shorter
let salter = Salter::new_with_defaults(Some(Tierage::med))?;
// generate a set of 3 signing keys. the fourth argument here is the code, and when we specify
// none we'll be given an Ed25519 key. the path here (third argument) will be input during key
// stretching so that the same seed can be used for a number of keys with differing paths
let signers = salter.signers(Some(3), None, Some("my-key"), None, None, None, None)?;
// sign some data
for i in 0..signers.len() {
sigers.push(signers[i].sign_indexed(authentic, false, i as u32, None)?);
}
// verify the signatures
for i in 0..signers.len() {
// check that verification works if the data and signature match
assert!(signers[i].verfer().verify(&sigers[i].raw(), authentic)?);
// verification fails if the data (or signature) does not match
assert!(!signers[i].verfer().verify(&sigers[i].raw(), forgery)?);
}
use cesride::{Signer, Indexer, Matter};
// here we verify that a cigar primitive and a siger primitive have the same underlying
// cryptographic material
let data = b"abcdefg";
// defaults to Ed25519
let signer = Signer::new_with_defaults(None, None)?;
// create our signatures
let cigar = signer.sign_unindexed(data)?;
let siger = signer.sign_indexed(data, false, 0, None)?;
// compare the raw signatures
assert_eq!(cigar.raw(), siger.raw());
use cesride::{Diger, Matter, matter};
// here we simply print a qualified digest in base64 to stdout after hashing serialized data
// hash digests underpin core concepts of the KERI ecosystem
let data = b"abcdefg";
// derive the digest, opting this time to specify the algorithm
let diger = Diger::new_with_ser(data, Some(matter::Codex::SHA3_512))?;
// output the digest
println!("Blake3 256 digest: #{d}", d=diger.qb64()?);
有关此阶段的更多实现细节,请参阅KERIpy。
熵
我们使用两种OsRng
实现来获取我们的随机数据。我们的私钥有时来自底层库中的标准方法,这就是为什么我们目前包括两种实现(两个签名模块依赖于不兼容的特性)。
当使用Salter
时,可以从相同的种子材料产生许多确定性和可重现的结果(如密钥),或者使用随机种子材料。在后一种情况下,我们直接使用较新的OsRng
实现来填充缓冲区。
外部依赖项(crates)
密钥拉伸
- Argon2 (argon2) -
Salter
使用 argon2id 将种子拉伸成密钥材料。这是我们选择的密钥层级和参数,以保持与参考 Python 实现 (KERIpy) 的兼容性。min
:在cesride
上下文外部不可用,除非直接将temp
参数传递给stretch()
以执行手动拉伸。**决不要**在生产环境中使用此安全层级。argon2id 参数- m: 8
- t: 1
- p: 1
low
:默认层级,适用于低风险在线交互- m: 65536
- t: 2
- p: 1
med
:适用于高风险在线交互- m: 262144
- t: 3
- p: 1
high
:抵抗离线攻击(用于备份)- m: 1048576
- t: 4
- p: 1
我们使用来自 OsRng
的 16 字节熵量在 rand_core
中对 argon2 进行种子。有关选择合适的 argon2 参数的更多详细信息,请参阅此文档。
哈希
cesride
支持以下哈希算法
- Blake3 256 (blake3)
- Blake3 512 (blake3)
- Blake2b 256 (blake2)
- Blake2b 512 (blake2)
- Blake2s 256 (blake2)
- SHA3 256 (sha3)
- SHA3 512 (sha3)
- SHA2 256 (sha2)
- SHA2 512 (sha2)
由于性能优于其他算法,建议大多数应用程序使用 Blake3。
签名
cesride
支持以下签名算法
- Ed25519 (ed25519-dalek)
- Secp256k1 (k256)
- Secp256r1 (p256)
我们计划支持 Ed448。
ECDSA 曲线(Secp256k1 和 Secp256r1)使用随机签名。Ed25519 总是确定性的。这意味着如果您需要避免关联并想使用 Ed25519,您需要为每个不希望关联的用例对数据进行盐化。例如,ACDC 考虑了这一点,允许通过在待签名数据中注入含盐的随机数来配置使用 Ed25519,其中隐私是一个问题。
社区
双周会议
Discord
- Discord 邀请https://discord.gg/edGDD632tP)
#cesr
频道。
依赖项
~11–20MB
~279K SLoC