{ "info": { "author": "Mika Tuupola", "author_email": "tuupola@appelsiini.net", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Topic :: Security" ], "description": "# Branca Tokens for Python\n\nAuthenticated and encrypted API tokens using modern crypto.\n\n\n[![Latest Version](https://img.shields.io/pypi/v/pybranca.svg?style=flat-square)](https://pypi.org/project/pybranca/)\n[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE.md)\n[![Build Status](https://img.shields.io/travis/tuupola/pybranca/master.svg?style=flat-square)](https://travis-ci.org/tuupola/pybranca)\n[![Coverage](https://img.shields.io/codecov/c/github/tuupola/pybranca.svg?style=flat-square)](https://codecov.io/github/tuupola/pybranca)\n\n## What?\n\n[Branca](https://github.com/tuupola/branca-spec/) is a secure easy to use token format which makes it hard to shoot yourself in the foot. It uses IETF XChaCha20-Poly1305 AEAD symmetric encryption to create encrypted and tamperproof tokens. Payload itself is an arbitrary sequence of bytes. You can use for example a JSON object, plain text string or even binary data serialized by [MessagePack](http://msgpack.org/) or [Protocol Buffers](https://developers.google.com/protocol-buffers/).\n\nAlthough not a design goal, it is possible to use [Branca as an alternative to JWT](https://appelsiini.net/2017/branca-alternative-to-jwt/).\n\n## Install\n\nInstall the library using pip. Note that you also must have [libsodium](https://download.libsodium.org/doc/) installed.\n\n```\n$ brew install libsodium\n$ pip install pybranca\n```\n\n## Usage\n\nThe payload of the token can be anything, like a simple string.\n\n```python\nfrom branca import Branca\n\nbranca = Branca(key=\"supersecretkeyyoushouldnotcommit\")\n\ntoken = branca.encode(\"Hello world!\")\npayload = branca.decode(token)\n\nprint(token)\nprint(payload)\n\n# 87xqn4ACMhqDZvoNuO0pXykuDlCwRz4Vg7LS3klfHpTiOUw1ramOqfWoaA6bvsGwOQ49MDFOERU0T\n# b'Hello world!'\n```\n\nFor more complicated data structures JSON is an usual choice.\n\n```python\nimport json\nfrom branca import Branca\n\nbranca = Branca(key=\"supersecretkeyyoushouldnotcommit\")\n\nstring = json.dumps({\"scope\" : [\"read\", \"write\", \"delete\"]})\n\ntoken = branca.encode(string)\npayload = branca.decode(token)\n\nprint(token)\nprint(payload)\nprint(json.loads(payload))\n\n# 6AlLJaBIFpXbwKTFsI3xXsk4se8YsdEKOtxYwtYDQHpoqabwZzmxAUS99BLxBJpmfJqnJ9VvzJYO1FXfsX78d0YsvTe43opYbUPgUao0EGV5qBli\n# b'{\"scope\": [\"read\", \"write\", \"delete\"]}'\n# {'scope': ['read', 'write', 'delete']}\n```\n\nBy using [MessagePack](https://msgpack.org/) you can have more compact tokens.\n\n```python\nimport msgpack\nfrom branca import Branca\n\nbranca = Branca(key=\"supersecretkeyyoushouldnotcommit\")\n\npacked = msgpack.dumps({\"scope\" : [\"read\", \"write\", \"delete\"]})\n\ntoken = branca.encode(packed)\npayload = branca.decode(token)\n\nprint(token)\nprint(payload)\nprint(msgpack.loads(payload, raw=False))\n\n# 3iJOQqw5CWjCRRDnsd7Jh4dfsyf7a4qbuEO0uT8MBEvnMVaR8rOW4dFKBVFKKgxZkVlNchGJSIgPdHtHIM4rF4mZYsriTE37\n# b'\\x81\\xa5scope\\x93\\xa4read\\xa5write\\xa6delete'\n# {'scope': ['read', 'write', 'delete']}\n```\n\n## License\n\nThe MIT License (MIT). Please see [License File](LICENSE.txt) for more information.", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/tuupola/pybranca", "keywords": "api,token,jwt,xchacha20,poly1305", "license": "MIT", "maintainer": "Mika Tuupola", "maintainer_email": "tuupola@appelsiini.net", "name": "pybranca", "package_url": "https://pypi.org/project/pybranca/", "platform": "", "project_url": "https://pypi.org/project/pybranca/", "project_urls": { "Homepage": "https://github.com/tuupola/pybranca" }, "release_url": "https://pypi.org/project/pybranca/0.3.0/", "requires_dist": null, "requires_python": "", "summary": "Authenticated and encrypted API tokens using modern crypto", "version": "0.3.0" }, "last_serial": 4774265, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "4a548fe7ea0a1cccd6f08ca63509db22", "sha256": "f41d443f9f7948a210fc5fd2c85454998cd5442521aec64bd8a97ebecca091a5" }, "downloads": -1, "filename": "pybranca-0.1.0.tar.gz", "has_sig": false, "md5_digest": "4a548fe7ea0a1cccd6f08ca63509db22", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4376, "upload_time": "2018-03-19T07:52:17", "url": "https://files.pythonhosted.org/packages/08/69/a042103e57b824f5ef513c38cdc07e0f8def3d58aed60e013d9a148be511/pybranca-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "e77990b865c400384c39b62376838f3e", "sha256": "9d088fdb72f2f398aae78449a96c89c5c98ad596f20907cbdb5230eeb49c0539" }, "downloads": -1, "filename": "pybranca-0.1.1.tar.gz", "has_sig": false, "md5_digest": "e77990b865c400384c39b62376838f3e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4632, "upload_time": "2018-03-19T09:08:11", "url": "https://files.pythonhosted.org/packages/7f/3d/aeed979fc1a1d157366cb66a3f4200dcbef421607254f677010b1b7e89eb/pybranca-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "6d6c0352578e9b817828065b9e85f867", "sha256": "8b22d3827edd06c2bcca22d7c91419bd02fd7d764835851c783e034b6853f717" }, "downloads": -1, "filename": "pybranca-0.1.2.tar.gz", "has_sig": false, "md5_digest": "6d6c0352578e9b817828065b9e85f867", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4587, "upload_time": "2018-03-19T09:09:11", "url": "https://files.pythonhosted.org/packages/2e/e9/62a5510a0905d1664853c10e61974a0c5e7a2edeb978831b43d68e7e7ff4/pybranca-0.1.2.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "db75994180ad1fa503608db1c3924991", "sha256": "34bc1186e387b032b07a682d6c80d324874f3b4ae7265f86821b183355b3b829" }, "downloads": -1, "filename": "pybranca-0.2.0.tar.gz", "has_sig": false, "md5_digest": "db75994180ad1fa503608db1c3924991", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5588, "upload_time": "2018-03-20T11:49:41", "url": "https://files.pythonhosted.org/packages/60/0c/a96015b7e5d6a1a1de1a477bc5c016d4a521ee01c91990e2ff66f0f3f8e3/pybranca-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "6d96230f68d8afc4006694d4a22dc403", "sha256": "cc765cfb5f0f0bc4f34a2fb587c8f933fa060159d93237e2a01f7aace11de3e2" }, "downloads": -1, "filename": "pybranca-0.3.0.tar.gz", "has_sig": false, "md5_digest": "6d96230f68d8afc4006694d4a22dc403", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5613, "upload_time": "2019-02-03T09:29:12", "url": "https://files.pythonhosted.org/packages/6f/62/53f5fe6e310d9b3ed5f0b2f52258ac34a60b41afd4ed4cf805d7a8774ab2/pybranca-0.3.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6d96230f68d8afc4006694d4a22dc403", "sha256": "cc765cfb5f0f0bc4f34a2fb587c8f933fa060159d93237e2a01f7aace11de3e2" }, "downloads": -1, "filename": "pybranca-0.3.0.tar.gz", "has_sig": false, "md5_digest": "6d96230f68d8afc4006694d4a22dc403", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5613, "upload_time": "2019-02-03T09:29:12", "url": "https://files.pythonhosted.org/packages/6f/62/53f5fe6e310d9b3ed5f0b2f52258ac34a60b41afd4ed4cf805d7a8774ab2/pybranca-0.3.0.tar.gz" } ] }