5 个版本
0.2.1 | 2024 年 3 月 12 日 |
---|---|
0.2.0 | 2024 年 2 月 5 日 |
0.1.2 | 2024 年 1 月 14 日 |
0.1.1 | 2024 年 1 月 8 日 |
0.1.0 | 2023 年 12 月 11 日 |
在 加密学 类别中排名第 249
每月下载量 251 次
在 2 个crate中使用(通过 identity_credential)
55KB
880 行
SD-JWT 引用实现
Rust 实现 JWT 的选择性披露(SD-JWT)版本 07
概述
本库支持以下功能:
- 编码:
- 创建披露器和将对象和数组中的值替换为其披露摘要。
- 向对象和数组中添加诱饵。
- 解码
- 递归地将对象和数组中的摘要替换为其相应的披露值。
默认提供 Sha-256
哈希函数,支持使用其他哈希函数进行编码/解码。
入门
在您的 cargo.toml
中包含该库。
[dependencies]
sd-jwt-payload = { version = "0.2.1" }
示例
请参阅 sd_jwt.rs 以获取可运行的示例。
用法
本库主要由以下结构组成:
SdObjectEncoder
:创建 SD 对象。SdObjectDecoder
:解码 SD 对象。Disclosure
:由SdObjectEncoder
和SdObjectDecoder
使用来表示披露。SdJwt
:创建/解析 SD-JWT。Hasher
:一个 trait,用于向编码器/解码器提供哈希函数。Sha256Hasher
:为Sha-256
哈希函数实现Hasher
。
编码
任何 JSON 对象都可以进行编码
let object = json!({
"given_name": "John",
"family_name": "Doe",
"address": {
"street_address": "123 Main St",
"region": "Anystate",
},
"phone": [
"+49 123456",
"+49 234567"
]
});
let mut encoder: SdObjectEncoder = object.try_into()?;
这创建了一个默认使用 Sha-256
哈希函数的状态编码器来创建披露摘要。
注意:SdObjectEncoder
对 Hasher
是泛型的,这允许使用其他哈希函数进行自定义编码。
编码器可以使用 conceal
方法对对象的任何值或数组元素进行编码。假设需要选择性披露 street_address
的值以及 address
和第一个 phone
的值。
let disclosure1 = encoder.conceal("/address/street_address"], None)?;
let disclosure2 = encoder.conceal("/address", None)?;
let disclosure3 = encoder.conceal("/phone/0", None)?;
"WyJHaGpUZVYwV2xlUHE1bUNrVUtPVTkzcXV4WURjTzIiLCAic3RyZWV0X2FkZHJlc3MiLCAiMTIzIE1haW4gU3QiXQ"
"WyJVVXVBelg5RDdFV1g0c0FRVVM5aURLYVp3cU13blUiLCAiYWRkcmVzcyIsIHsicmVnaW9uIjoiQW55c3RhdGUiLCJfc2QiOlsiaHdiX2d0eG01SnhVbzJmTTQySzc3Q194QTUxcmkwTXF0TVVLZmI0ZVByMCJdfV0"
"WyJHRDYzSTYwUFJjb3dvdXJUUmg4OG5aM1JNbW14YVMiLCAiKzQ5IDEyMzQ1NiJd"
注意: conceal
方法需要一个 JSON Pointer 来确定要隐藏在 JSON 对象内部的元素。
编码器还支持添加诱饵。例如,需要隐藏电话号码的数量和声明的数量。
encoder.add_decoys("/phone", 3).unwrap(); //Adds 3 decoys to the array `phone`.
encoder.add_decoys("", 6).unwrap(); // Adds 6 decoys to the top level object.
添加哈希函数声明。
encoder.add_sd_alg_property(); // This adds "_sd_alg": "sha-256"
现在,使用 encoder.object()?
将返回编码后的对象。
{
"given_name": "John",
"family_name": "Doe",
"phone": [
{
"...": "eZVn0KkQm_T8x-x57VxYt-_MmNG91Sh34E-bZEnNfWY"
},
"+49 234567",
{
"...": "KAiJIx0tktQRXBxZSBVVld9298bZIp2WkpkDYDa3CWQ"
},
{
"...": "CBKARPh6sdTCJyliZ7pBOYzix7Z4Bb4yRh0EykHX2Uw"
},
{
"...": "oi1KgsYXgqBFXUXvbVaHSGYYaWhkB5RL55T90Gl_5s0"
}
],
"_sd": [
"Jj5jBeGEawY6vRvmHDg55EjeAIP8FVhWEV2FczhUXrY",
"8eqphBPJyCBgUJhNWNP7ci-Y79N615wpZQrxi5D4ju8",
"_hOU5puJjNzSBhK0bwh3h8_b6H6nN7vd_7I0uTp80Mo",
"G_tH70MrfCkVM0HhsH9REObIt1Ei19477y6CEsS0Zlo",
"zP56MeH0ryjzqh9Kadrb5C9Z2BE2FWg8nb3g0rR3LSA",
"dgfVW11ip9OOyVi8M4h1RjXK8akw7ICeMQkjUwSI6iU",
"Bx33mOyTF5-w8gRS5yL4YQ4dig44V3lmHxk1WRss_7U"
],
"_sd_alg": "sha-256"
}
注意:没有添加 JWT 声明,如 exp
或 iat
。如果需要,这些需要手动添加和验证。
创建 SD-JWT
由于创建 JWT 不在本库的范围内,请参阅 sd_jwt.rs 示例,其中使用 josekit
创建 jwt
,并将上述对象作为声明集。
创建 SD-JWT
let sd_jwt: SdJwt = SdJwt::new(jwt, disclosures.clone(), None);
let sd_jwt: String = sd_jwt.presentation();
eyJ0eXAiOiJTRC1KV1QiLCJhbGciOiJIUzI1NiJ9.eyJnaXZlbl9uYW1lIjoiSm9obiIsImZhbWlseV9uYW1lIjoiRG9lIiwicGhvbmUiOlt7Ii4uLiI6ImVaVm4wS2tRbV9UOHgteDU3VnhZdC1fTW1ORzkxU2gzNEUtYlpFbk5mV1kifSwiKzQ5IDIzNDU2NyIseyIuLi4iOiJLQWlKSXgwdGt0UVJYQnhaU0JWVmxkOTI5OGJaSXAyV2twa0RZRGEzQ1dRIn0seyIuLi4iOiJDQktBUlBoNnNkVENKeWxpWjdwQk9Zeml4N1o0QmI0eVJoMEV5a0hYMlV3In0seyIuLi4iOiJvaTFLZ3NZWGdxQkZYVVh2YlZhSFNHWVlhV2hrQjVSTDU1VDkwR2xfNXMwIn1dLCJfc2QiOlsiSmo1akJlR0Vhd1k2dlJ2bUhEZzU1RWplQUlQOEZWaFdFVjJGY3poVVhyWSIsIjhlcXBoQlBKeUNCZ1VKaE5XTlA3Y2ktWTc5TjYxNXdwWlFyeGk1RDRqdTgiLCJfaE9VNXB1SmpOelNCaEswYndoM2g4X2I2SDZuTjd2ZF83STB1VHA4ME1vIiwiR190SDcwTXJmQ2tWTTBIaHNIOVJFT2JJdDFFaTE5NDc3eTZDRXNTMFpsbyIsInpQNTZNZUgwcnlqenFoOUthZHJiNUM5WjJCRTJGV2c4bmIzZzByUjNMU0EiLCJkZ2ZWVzExaXA5T095Vmk4TTRoMVJqWEs4YWt3N0lDZU1Ra2pVd1NJNmlVIiwiQngzM21PeVRGNS13OGdSUzV5TDRZUTRkaWc0NFYzbG1IeGsxV1Jzc183VSJdLCJfc2RfYWxnIjoic2hhLTI1NiJ9.knTqw4FMCplHoMu7mfiix7dv4lIjYgRIn-tmuemAhbY~WyJHaGpUZVYwV2xlUHE1bUNrVUtPVTkzcXV4WURjTzIiLCAic3RyZWV0X2FkZHJlc3MiLCAiMTIzIE1haW4gU3QiXQ~WyJVVXVBelg5RDdFV1g0c0FRVVM5aURLYVp3cU13blUiLCAiYWRkcmVzcyIsIHsicmVnaW9uIjoiQW55c3RhdGUiLCJfc2QiOlsiaHdiX2d0eG01SnhVbzJmTTQySzc3Q194QTUxcmkwTXF0TVVLZmI0ZVByMCJdfV0~WyJHRDYzSTYwUFJjb3dvdXJUUmg4OG5aM1JNbW14YVMiLCAiKzQ5IDEyMzQ1NiJd~
解码
解析 SD-JWT 字符串以提取 JWT 和披露内容,以便解码声明并构建披露的值。
注意:验证 JWT 的签名和提取声明集不在本库的范围内。
let sd_jwt: SdJwt = SdJwt::parse(sd_jwt_string)?;
let claims_set: // extract claims from `sd_jwt.jwt`.
let decoder = SdObjectDecoder::new();
let decoded_object = decoder.decode(claims_set, &sd_jwt.disclosures)?;
decoded_object
:
{
"given_name": "John",
"family_name": "Doe",
"phone": [
"+49 123456",
"+49 234567"
],
"address": {
"region": "Anystate",
"street_address": "123 Main St"
}
}
注意
street_address
和address
将递归解码。_sd_alg
属性已被移除。
贡献
贡献使得开源社区成为学习、灵感和创作的绝佳场所。您所做的任何贡献都 非常欢迎。
如果您有改进此项目的建议,请 fork 仓库并创建一个 pull request。您也可以简单地打开一个带有“enhancement”标签的问题。别忘了给项目加星!再次感谢!
- fork 项目
- 创建您的功能分支(
git checkout -b feature/AmazingFeature
) - 提交您的更改(
git commit -m 'Add some AmazingFeature'
) - 推送到分支(
git push origin feature/AmazingFeature
) - 打开一个 pull request
(返回顶部)
许可协议
Apache 许可协议下分发。有关更多信息,请参阅 LICENSE
。
(返回顶部)
依赖项
~2.2–3.5MB
~72K SLoC