#sd-jwt #disclosure #sha-256 #selective-disclosure

sd-jwt-payload

JWT 的选择性披露(SD-JWT)的 Rust 实现

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

Download history 343/week @ 2024-03-14 169/week @ 2024-03-21 69/week @ 2024-03-28 39/week @ 2024-04-04 7/week @ 2024-04-11 39/week @ 2024-04-18 87/week @ 2024-04-25 144/week @ 2024-05-02 102/week @ 2024-05-09 72/week @ 2024-05-16 263/week @ 2024-05-23 136/week @ 2024-05-30 137/week @ 2024-06-06 37/week @ 2024-06-13 34/week @ 2024-06-20 26/week @ 2024-06-27

每月下载量 251
2 个crate中使用(通过 identity_credential

Apache-2.0 许可证

55KB
880

Apache 2.0 license Discord StackExchange

SD-JWT 引用实现

Rust 实现 JWT 的选择性披露(SD-JWT)版本 07

概述

本库支持以下功能:

  • 编码:
    • 创建披露器和将对象和数组中的值替换为其披露摘要。
    • 向对象和数组中添加诱饵。
  • 解码
    • 递归地将对象和数组中的摘要替换为其相应的披露值。

默认提供 Sha-256 哈希函数,支持使用其他哈希函数进行编码/解码。

入门

在您的 cargo.toml 中包含该库。

[dependencies]
sd-jwt-payload = { version = "0.2.1" }

示例

请参阅 sd_jwt.rs 以获取可运行的示例。

用法

本库主要由以下结构组成:

  1. SdObjectEncoder:创建 SD 对象。
  2. SdObjectDecoder:解码 SD 对象。
  3. Disclosure:由 SdObjectEncoderSdObjectDecoder 使用来表示披露。
  4. SdJwt:创建/解析 SD-JWT。
  5. Hasher:一个 trait,用于向编码器/解码器提供哈希函数。
  6. 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 哈希函数的状态编码器来创建披露摘要。

注意:SdObjectEncoderHasher 是泛型的,这允许使用其他哈希函数进行自定义编码。

编码器可以使用 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 声明,如 expiat。如果需要,这些需要手动添加和验证。

创建 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_addressaddress 将递归解码。
  • _sd_alg 属性已被移除。

贡献

贡献使得开源社区成为学习、灵感和创作的绝佳场所。您所做的任何贡献都 非常欢迎

如果您有改进此项目的建议,请 fork 仓库并创建一个 pull request。您也可以简单地打开一个带有“enhancement”标签的问题。别忘了给项目加星!再次感谢!

  1. fork 项目
  2. 创建您的功能分支(git checkout -b feature/AmazingFeature
  3. 提交您的更改(git commit -m 'Add some AmazingFeature'
  4. 推送到分支(git push origin feature/AmazingFeature
  5. 打开一个 pull request

(返回顶部)

许可协议

Apache 许可协议下分发。有关更多信息,请参阅 LICENSE

(返回顶部)

依赖项

~2.2–3.5MB
~72K SLoC