{"id":22190867,"url":"https://github.com/appsup-dart/jose","last_synced_at":"2025-07-26T19:09:38.420Z","repository":{"id":33654214,"uuid":"155909736","full_name":"appsup-dart/jose","owner":"appsup-dart","description":"Javascript Object Signing and Encryption (JOSE) library","archived":false,"fork":false,"pushed_at":"2023-09-23T17:38:39.000Z","size":163,"stargazers_count":55,"open_issues_count":3,"forks_count":39,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-06-18T18:52:36.003Z","etag":null,"topics":["aes","cryptography","encryption","jose","jwt","rsa"],"latest_commit_sha":null,"homepage":"","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/appsup-dart.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-11-02T18:58:48.000Z","updated_at":"2024-05-30T11:16:56.000Z","dependencies_parsed_at":"2024-06-18T18:42:54.010Z","dependency_job_id":null,"html_url":"https://github.com/appsup-dart/jose","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appsup-dart%2Fjose","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appsup-dart%2Fjose/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appsup-dart%2Fjose/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appsup-dart%2Fjose/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/appsup-dart","download_url":"https://codeload.github.com/appsup-dart/jose/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":227724209,"owners_count":17810036,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aes","cryptography","encryption","jose","jwt","rsa"],"created_at":"2024-12-02T12:13:07.251Z","updated_at":"2024-12-02T12:13:07.882Z","avatar_url":"https://github.com/appsup-dart.png","language":"Dart","funding_links":["https://github.com/sponsors/rbellens"],"categories":[],"sub_categories":[],"readme":"\n[![Build Status](https://travis-ci.org/appsup-dart/jose.svg?branch=master)](https://travis-ci.org/appsup-dart/jose) \n[:heart: sponsor](https://github.com/sponsors/rbellens)\n\n\n\nJavascript Object Signing and Encryption (JOSE) library\n\nSupports JSON Web Signature (JWS), JSON Web Encryption (JWE), \nJSON Web Key (JWK) and JSON Web Token (JWT).\n\n## Supported JSON Web Algorithms\n\nThis package supports a lot of the algorithms defined in the standards.\n\n### Siging algorithms for JWS\n\n* *HS256* HMAC using SHA-256\n* *HS384* HMAC using SHA-384\n* *HS512* HMAC using SHA-512\n* *RS256* RSASSA-PKCS1-v1_5 using SHA-256\n* *RS384* RSASSA-PKCS1-v1_5 using SHA-384\n* *RS512* RSASSA-PKCS1-v1_5 using SHA-512\n* *ES256* ECDSA using P-256 and SHA-256\n* *ES256K* ECDSA using P-256K and SHA-256\n* *ES384* ECDSA using P-384 and SHA-384\n* *ES512* ECDSA using P-521 and SHA-512\n* *none* No digital signature or MAC\n\n### Key wrapping algorithms for JWE\n\n* *RSA1_5* RSAES-PKCS1-v1_5\n* *RSA-OAEP* RSAES OAEP using default parameters\n* *RSA-OAEP-256* RSAES OAEP using SHA-256 and MGF1 with SHA-256\n* *A128KW* AES Key Wrap with default initial value using 128-bit key\n* *A192KW* AES Key Wrap with default initial value using 192-bit key\n* *A256KW* AES Key Wrap with default initial value using 256-bit key\n* *dir* Direct use of a shared symmetric key as the CEK\n\n### Encryption Algorithms for JWE\n\n* *A128CBC-HS256* AES_128_CBC_HMAC_SHA_256 authenticated encryption algorithm\n* *A192CBC-HS384* AES_192_CBC_HMAC_SHA_384 authenticated encryption algorithm\n* *A256CBC-HS512* AES_256_CBC_HMAC_SHA_512 authenticated encryption algorithm\n* *A128GCM* AES GCM using 128-bit key\n* *A192GCM* AES GCM using 192-bit key\n* *A256GCM* AES GCM using 256-bit key\n\n \n\n## Usage\n\n### Decode and verify a JWS\n\n```dart\nmain() async {\n    var encoded = \"eyJhbGciOiJFUzUxMiJ9.\"\n      \"UGF5bG9hZA.\"\n      \"AdwMgeerwtHoh-l192l60hp9wAHZFVJbLfD_UxMi70cwnZOYaRI1bKPWROc-mZZq\"\n      \"wqT2SI-KGDKB34XO0aw_7XdtAG8GaSwFKdCAPZgoXD2YBJZCPEX3xKpRwcdOO8Kp\"\n      \"EHwJjyqOgzDO7iKvU8vcnwNrmxYbSW9ERBXukOXolLzeO_Jn\";\n    \n    // create a JsonWebSignature from the encoded string\n    var jws = JsonWebSignature.fromCompactSerialization(encoded);\n    \n    // extract the payload\n    var payload = jws.unverifiedPayload;\n    \n    print(\"content of jws: ${payload.stringContent}\");\n    print(\"protected parameters: ${payload.protectedHeader.toJson()}\");\n    \n    // create a JsonWebKey for verifying the signature\n    var jwk = new JsonWebKey.fromJson({\n        \"kty\": \"EC\",\n        \"crv\": \"P-521\",\n        \"x\": \"AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_\"\n            \"NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk\",\n        \"y\": \"ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDl\"\n            \"y79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2\",\n        \"d\": \"AY5pb7A0UFiB3RELSD64fTLOSV_jazdF7fLYyuTw8lOfRhWg6Y6rUrPA\"\n            \"xerEzgdRhajnu0ferB0d53vM9mE15j2C\"\n    });\n    var keyStore = new JsonWebKeyStore()..addKey(jwk);\n    \n    // verify the signature\n    var verified = await jws.verify(keyStore);\n    print(\"signature verified: $verified\");\n}\n\n```\n\n\n### Create a JWS\n\n```dart\nmain() async {\n  // create a builder\n  var builder = new JsonWebSignatureBuilder();\n\n  // set the content\n  builder.stringContent = \"It is me\";\n\n  // set some protected header\n  builder.setProtectedHeader(\"createdAt\", new DateTime.now().toIso8601String());\n\n  // add a key to sign, you can add multiple keys for different recipients\n  builder.addRecipient(\n      new JsonWebKey.fromJson({\n        \"kty\": \"oct\",\n        \"k\":\n            \"AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow\"\n      }),\n      algorithm: \"HS256\");\n\n  // build the jws\n  var jws = builder.build();\n\n  // output the compact serialization\n  print(\"jws compact serialization: ${jws.toCompactSerialization()}\");\n\n  // output the json serialization\n  print(\"jws json serialization: ${jws.toJson()}\");\n}\n```\n\n### Decode and decrypt a JWE\n\n```dart\nmain() async {\n  var encoded = \"eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.\"\n      \"UGhIOguC7IuEvf_NPVaXsGMoLOmwvc1GyqlIKOK1nN94nHPoltGRhWhw7Zx0-kFm\"\n      \"1NJn8LE9XShH59_i8J0PH5ZZyNfGy2xGdULU7sHNF6Gp2vPLgNZ__deLKxGHZ7Pc\"\n      \"HALUzoOegEI-8E66jX2E4zyJKx-YxzZIItRzC5hlRirb6Y5Cl_p-ko3YvkkysZIF\"\n      \"NPccxRU7qve1WYPxqbb2Yw8kZqa2rMWI5ng8OtvzlV7elprCbuPhcCdZ6XDP0_F8\"\n      \"rkXds2vE4X-ncOIM8hAYHHi29NX0mcKiRaD0-D-ljQTP-cFPgwCp6X-nZZd9OHBv\"\n      \"-B3oWh2TbqmScqXMR4gp_A.\"\n      \"AxY8DCtDaGlsbGljb3RoZQ.\"\n      \"KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY.\"\n      \"9hH0vgRfYgPnAHOd8stkvw\";\n\n  // create a JsonWebEncryption from the encoded string\n  var jwe = JsonWebEncryption.fromCompactSerialization(encoded);\n\n  // create a JsonWebKey for decrypting the signature\n  var jwk = new JsonWebKey.fromJson(\n    {\n      \"kty\": \"RSA\",\n      \"n\": \"sXchDaQebHnPiGvyDOAT4saGEUetSyo9MKLOoWFsueri23bOdgWp4Dy1Wl\"\n          \"UzewbgBHod5pcM9H95GQRV3JDXboIRROSBigeC5yjU1hGzHHyXss8UDpre\"\n          \"cbAYxknTcQkhslANGRUZmdTOQ5qTRsLAt6BTYuyvVRdhS8exSZEy_c4gs_\"\n          \"7svlJJQ4H9_NxsiIoLwAEk7-Q3UXERGYw_75IDrGA84-lA_-Ct4eTlXHBI\"\n          \"Y2EaV7t7LjJaynVJCpkv4LKjTTAumiGUIuQhrNhZLuF_RJLqHpM2kgWFLU\"\n          \"7-VTdL1VbC2tejvcI2BlMkEpk1BzBZI0KQB0GaDWFLN-aEAw3vRw\",\n      \"e\": \"AQAB\",\n      \"d\": \"VFCWOqXr8nvZNyaaJLXdnNPXZKRaWCjkU5Q2egQQpTBMwhprMzWzpR8Sxq\"\n          \"1OPThh_J6MUD8Z35wky9b8eEO0pwNS8xlh1lOFRRBoNqDIKVOku0aZb-ry\"\n          \"nq8cxjDTLZQ6Fz7jSjR1Klop-YKaUHc9GsEofQqYruPhzSA-QgajZGPbE_\"\n          \"0ZaVDJHfyd7UUBUKunFMScbflYAAOYJqVIVwaYR5zWEEceUjNnTNo_CVSj\"\n          \"-VvXLO5VZfCUAVLgW4dpf1SrtZjSt34YLsRarSb127reG_DUwg9Ch-Kyvj\"\n          \"T1SkHgUWRVGcyly7uvVGRSDwsXypdrNinPA4jlhoNdizK2zF2CWQ\",\n      \"p\": \"9gY2w6I6S6L0juEKsbeDAwpd9WMfgqFoeA9vEyEUuk4kLwBKcoe1x4HG68\"\n          \"ik918hdDSE9vDQSccA3xXHOAFOPJ8R9EeIAbTi1VwBYnbTp87X-xcPWlEP\"\n          \"krdoUKW60tgs1aNd_Nnc9LEVVPMS390zbFxt8TN_biaBgelNgbC95sM\",\n      \"q\": \"uKlCKvKv_ZJMVcdIs5vVSU_6cPtYI1ljWytExV_skstvRSNi9r66jdd9-y\"\n          \"BhVfuG4shsp2j7rGnIio901RBeHo6TPKWVVykPu1iYhQXw1jIABfw-MVsN\"\n          \"-3bQ76WLdt2SDxsHs7q7zPyUyHXmps7ycZ5c72wGkUwNOjYelmkiNS0\",\n      \"dp\": \"w0kZbV63cVRvVX6yk3C8cMxo2qCM4Y8nsq1lmMSYhG4EcL6FWbX5h9yuv\"\n          \"ngs4iLEFk6eALoUS4vIWEwcL4txw9LsWH_zKI-hwoReoP77cOdSL4AVcra\"\n          \"Hawlkpyd2TWjE5evgbhWtOxnZee3cXJBkAi64Ik6jZxbvk-RR3pEhnCs\",\n      \"dq\": \"o_8V14SezckO6CNLKs_btPdFiO9_kC1DsuUTd2LAfIIVeMZ7jn1Gus_Ff\"\n          \"7B7IVx3p5KuBGOVF8L-qifLb6nQnLysgHDh132NDioZkhH7mI7hPG-PYE_\"\n          \"odApKdnqECHWw0J-F0JWnUd6D2B_1TvF9mXA2Qx-iGYn8OVV1Bsmp6qU\",\n      \"qi\": \"eNho5yRBEBxhGBtQRww9QirZsB66TrfFReG_CcteI1aCneT0ELGhYlRlC\"\n          \"tUkTRclIfuEPmNsNDPbLoLqqCVznFbvdB7x-Tl-m0l_eFTj2KiqwGqE9PZ\"\n          \"B9nNTwMVvH3VRRSLWACvPnSiwP8N5Usy-WRXS-V7TbpxIhvepTfE0NNo\"\n    },\n  );\n  var keyStore = new JsonWebKeyStore()..addKey(jwk);\n\n  // decrypt the payload\n  var payload = await jwe.getPayload(keyStore);\n  print(\"decrypted content: ${payload.stringContent}\");\n}\n```\n\n### Create a JWE\n\n```dart\nmain() async {\n  // create a builder\n  var builder = new JsonWebEncryptionBuilder();\n\n  // set the content\n  builder.stringContent = \"This is my bigest secret\";\n\n  // set some protected header\n  builder.setProtectedHeader(\"createdAt\", new DateTime.now().toIso8601String());\n\n  // add a key to encrypt the Content Encryption Key\n  var jwk = new JsonWebKey.fromJson(\n    {\n      \"kty\": \"RSA\",\n      \"n\": \"sXchDaQebHnPiGvyDOAT4saGEUetSyo9MKLOoWFsueri23bOdgWp4Dy1Wl\"\n          \"UzewbgBHod5pcM9H95GQRV3JDXboIRROSBigeC5yjU1hGzHHyXss8UDpre\"\n          \"cbAYxknTcQkhslANGRUZmdTOQ5qTRsLAt6BTYuyvVRdhS8exSZEy_c4gs_\"\n          \"7svlJJQ4H9_NxsiIoLwAEk7-Q3UXERGYw_75IDrGA84-lA_-Ct4eTlXHBI\"\n          \"Y2EaV7t7LjJaynVJCpkv4LKjTTAumiGUIuQhrNhZLuF_RJLqHpM2kgWFLU\"\n          \"7-VTdL1VbC2tejvcI2BlMkEpk1BzBZI0KQB0GaDWFLN-aEAw3vRw\",\n      \"e\": \"AQAB\",\n      \"d\": \"VFCWOqXr8nvZNyaaJLXdnNPXZKRaWCjkU5Q2egQQpTBMwhprMzWzpR8Sxq\"\n          \"1OPThh_J6MUD8Z35wky9b8eEO0pwNS8xlh1lOFRRBoNqDIKVOku0aZb-ry\"\n          \"nq8cxjDTLZQ6Fz7jSjR1Klop-YKaUHc9GsEofQqYruPhzSA-QgajZGPbE_\"\n          \"0ZaVDJHfyd7UUBUKunFMScbflYAAOYJqVIVwaYR5zWEEceUjNnTNo_CVSj\"\n          \"-VvXLO5VZfCUAVLgW4dpf1SrtZjSt34YLsRarSb127reG_DUwg9Ch-Kyvj\"\n          \"T1SkHgUWRVGcyly7uvVGRSDwsXypdrNinPA4jlhoNdizK2zF2CWQ\",\n      \"p\": \"9gY2w6I6S6L0juEKsbeDAwpd9WMfgqFoeA9vEyEUuk4kLwBKcoe1x4HG68\"\n          \"ik918hdDSE9vDQSccA3xXHOAFOPJ8R9EeIAbTi1VwBYnbTp87X-xcPWlEP\"\n          \"krdoUKW60tgs1aNd_Nnc9LEVVPMS390zbFxt8TN_biaBgelNgbC95sM\",\n      \"q\": \"uKlCKvKv_ZJMVcdIs5vVSU_6cPtYI1ljWytExV_skstvRSNi9r66jdd9-y\"\n          \"BhVfuG4shsp2j7rGnIio901RBeHo6TPKWVVykPu1iYhQXw1jIABfw-MVsN\"\n          \"-3bQ76WLdt2SDxsHs7q7zPyUyHXmps7ycZ5c72wGkUwNOjYelmkiNS0\",\n      \"dp\": \"w0kZbV63cVRvVX6yk3C8cMxo2qCM4Y8nsq1lmMSYhG4EcL6FWbX5h9yuv\"\n          \"ngs4iLEFk6eALoUS4vIWEwcL4txw9LsWH_zKI-hwoReoP77cOdSL4AVcra\"\n          \"Hawlkpyd2TWjE5evgbhWtOxnZee3cXJBkAi64Ik6jZxbvk-RR3pEhnCs\",\n      \"dq\": \"o_8V14SezckO6CNLKs_btPdFiO9_kC1DsuUTd2LAfIIVeMZ7jn1Gus_Ff\"\n          \"7B7IVx3p5KuBGOVF8L-qifLb6nQnLysgHDh132NDioZkhH7mI7hPG-PYE_\"\n          \"odApKdnqECHWw0J-F0JWnUd6D2B_1TvF9mXA2Qx-iGYn8OVV1Bsmp6qU\",\n      \"qi\": \"eNho5yRBEBxhGBtQRww9QirZsB66TrfFReG_CcteI1aCneT0ELGhYlRlC\"\n          \"tUkTRclIfuEPmNsNDPbLoLqqCVznFbvdB7x-Tl-m0l_eFTj2KiqwGqE9PZ\"\n          \"B9nNTwMVvH3VRRSLWACvPnSiwP8N5Usy-WRXS-V7TbpxIhvepTfE0NNo\"\n    },\n  );\n  builder.addRecipient(jwk, algorithm: \"RSA1_5\");\n\n  // set the content encryption algorithm to use\n  builder.encryptionAlgorithm = \"A128CBC-HS256\";\n\n  // build the jws\n  var jwe = builder.build();\n\n  // output the compact serialization\n  print(\"jwe compact serialization: ${jwe.toCompactSerialization()}\");\n\n  // output the json serialization\n  print(\"jwe json serialization: ${jwe.toJson()}\");\n}\n```\n\n\n### Decode and verify and validate a JWT\n\n```dart\nmain() async {\n  var encoded = \"eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.\"\n      \"eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt\"\n      \"cGxlLmNvbS9pc19yb290Ijp0cnVlfQ.\"\n      \"dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk\";\n\n  // decode the jwt, note: this constructor can only be used for JWT inside JWS\n  // structures\n  var jwt = new JsonWebToken.unverified(encoded);\n\n  // output the claims\n  print(\"claims: ${jwt.claims}\");\n\n  // create key store to verify the signature\n  var keyStore = new JsonWebKeyStore()\n    ..addKey(new JsonWebKey.fromJson({\n      \"kty\": \"oct\",\n      \"k\":\n          \"AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow\"\n    }));\n\n  var verified = await jwt.verify(keyStore);\n  print(\"verified: $verified\");\n\n  // alternatively, create and verify the JsonWebToken together, this is also\n  // applicable for JWT inside JWE\n  jwt = await JsonWebToken.decodeAndVerify(encoded, keyStore);\n\n  // validate the claims\n  var violations = jwt.claims.validate(issuer: Uri.parse(\"alice\"));\n  print(\"violations: $violations\");\n}\n```\n\n\n### Create a JWT\n\n```dart\n\nmain() async {\n  var claims = new JsonWebTokenClaims.fromJson({\n    \"exp\": new Duration(hours: 4).inSeconds,\n    \"iss\": \"alice\",\n  });\n\n  // create a builder, decoding the JWT in a JWS, so using a\n  // JsonWebSignatureBuilder\n  var builder = new JsonWebSignatureBuilder();\n\n  // set the content\n  builder.jsonContent = claims.toJson();\n\n  // add a key to sign, can only add one for JWT\n  builder.addRecipient(\n      new JsonWebKey.fromJson({\n        \"kty\": \"oct\",\n        \"k\":\n            \"AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow\"\n      }),\n      algorithm: \"HS256\");\n\n  // build the jws\n  var jws = builder.build();\n\n  // output the compact serialization\n  print(\"jwt compact serialization: ${jws.toCompactSerialization()}\");\n}\n```\n\n\n## Features and bugs\n\nPlease file feature requests and bugs at the [issue tracker][tracker].\n\n[tracker]: https://github.com/appsup-dart/jose/issues\n\n\n## Sponsor\n\nCreating and maintaining this package takes a lot of time. If you like the result, please consider to [:heart: sponsor](https://github.com/sponsors/rbellens). \nWith your support, I will be able to further improve and support this project.\nAlso, check out my other dart packages at [pub.dev](https://pub.dev/packages?q=publisher%3Aappsup.be).\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fappsup-dart%2Fjose","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fappsup-dart%2Fjose","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fappsup-dart%2Fjose/lists"}