{ "info": { "author": "Steve Herrin", "author_email": "steve.herrin@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Security" ], "description": "SpookyOTP\n=========\n\nLightweight Python package for TOTP/HOTP (Google Authenticator) codes\n\nDescription\n===========\n\nThis is a lightweight package for generating TOTP and HOTP codes used\nfor two-factor authentication. They can be used with Google Authenticator\nor FreeOTP.\n\nSome features (such as using different hashing algorithms or displaying\nmore than 6 digits) do not work with Google Authenticator.\n\nURIs generated (and QR codes encoding them) follow the [Google Authenticator format](https://github.com/google/google-authenticator/wiki/Key-Uri-Format)\n\nExample\n=======\n from spookyotp import (get_random_secret, TOTP, from_uri)\n\n secret = get_random_secret(n_bytes=10)\n totp = TOTP(secret, 'Example', 'user@example.org')\n totp.save_qr_code('qr.png')\n\n # you can now load the QR code with your app of choice\n code = input(\"Enter code: \") # or raw_input in Python 2\n matches = totp.compare(code)\n if matches:\n print(\"Correct!\")\n else:\n print(\"Incorrect.\")\n\n # serialization and deserialization is supported via URI\n uri = totp.get_uri()\n new_totp = from_uri(uri)\n\nWhy Spooky?\n===========\n\nI created the git repo on Halloween, and there is already a project\ncalled PyOTP.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "https://github.com/steveherrin/SpookyOTP/archive/1.1.3.tar.gz", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/steveherrin/SpookyOTP", "keywords": "totp hotp authenticator", "license": "Apache2", "maintainer": "", "maintainer_email": "", "name": "SpookyOTP", "package_url": "https://pypi.org/project/SpookyOTP/", "platform": "", "project_url": "https://pypi.org/project/SpookyOTP/", "project_urls": { "Download": "https://github.com/steveherrin/SpookyOTP/archive/1.1.3.tar.gz", "Homepage": "https://github.com/steveherrin/SpookyOTP" }, "release_url": "https://pypi.org/project/SpookyOTP/1.1.3/", "requires_dist": [ "qrcode", "six" ], "requires_python": "", "summary": "A lightweight Python 2/3 package for handling HOTP/TOTP (Google Authenticator) authentication.", "version": "1.1.3" }, "last_serial": 4347810, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "1d80ad3470c1f80d48973027b73a50f5", "sha256": "96024e462b9ac7f85872b82b09dc35d6e2aba8babe210fd17b0ec1efcc1b87fe" }, "downloads": -1, "filename": "SpookyOTP-0.1.tar.gz", "has_sig": false, "md5_digest": "1d80ad3470c1f80d48973027b73a50f5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4854, "upload_time": "2014-11-17T17:31:29", "url": "https://files.pythonhosted.org/packages/1e/5b/b8e27121e449832be68846bf5a7149f49fdcc29a0da0b2508d5e646d3043/SpookyOTP-0.1.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "87d811cee0e08bf08fbdcfb18a2fcaa8", "sha256": "ffd9f45bb5f4eb864b6c1befd2d87d0a69df29b87c71dbc4fbfcbf31d7b30be3" }, "downloads": -1, "filename": "SpookyOTP-1.0.0.tar.gz", "has_sig": false, "md5_digest": "87d811cee0e08bf08fbdcfb18a2fcaa8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6086, "upload_time": "2015-04-22T18:05:38", "url": "https://files.pythonhosted.org/packages/52/4a/20ac08f71f1063f05b955057338cb627f50f61d61f2bf34a458b8b7863b2/SpookyOTP-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "f14e9b65c432c258aae9a6e2cec63753", "sha256": "8e4c40eb5128ff10da2c76b3fb0abaaa2cbb8f1a4a48359f34901a4b24f1f5eb" }, "downloads": -1, "filename": "SpookyOTP-1.0.1-py2.7.egg", "has_sig": false, "md5_digest": "f14e9b65c432c258aae9a6e2cec63753", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 11623, "upload_time": "2015-09-14T15:57:34", "url": "https://files.pythonhosted.org/packages/95/7b/6161254394b1e94266b110c81e5e9d13c9559d81ac0ffe83728ace04fee6/SpookyOTP-1.0.1-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "9c04e03d6aaa52d7d1959d87f3665a5e", "sha256": "1f0e2d7d74e274a6ca8a1ddaf8939cddb9e86adcafa9f97e850e199c053b463b" }, "downloads": -1, "filename": "SpookyOTP-1.0.1-py2-none-any.whl", "has_sig": false, "md5_digest": "9c04e03d6aaa52d7d1959d87f3665a5e", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 6699, "upload_time": "2015-09-14T15:57:38", "url": "https://files.pythonhosted.org/packages/d8/e8/e7f550e211cc73f693b40ed11bc7f06f7f2c14ca7fef294cc7a845c3d80e/SpookyOTP-1.0.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5efeda6460d31c6326cf843512d07823", "sha256": "5102b1fcefeb76fa9a471c0c402e3d5caa61a8afcc76d641509c6b31db318e02" }, "downloads": -1, "filename": "SpookyOTP-1.0.1.tar.gz", "has_sig": false, "md5_digest": "5efeda6460d31c6326cf843512d07823", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6264, "upload_time": "2015-09-14T15:57:30", "url": "https://files.pythonhosted.org/packages/19/02/33d1be9382e8887d2ecb2eca2c94824fa7525b297f1d030d81fa2a4d9ab8/SpookyOTP-1.0.1.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "73fd96970aa7ae5df4eb64bd0c3866e8", "sha256": "e065cef473b96b1e04bf48b5afcf7d1481ef0fbd20dbc1fdd66c6906dfee89ce" }, "downloads": -1, "filename": "SpookyOTP-1.1.0-py2.7.egg", "has_sig": false, "md5_digest": "73fd96970aa7ae5df4eb64bd0c3866e8", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 5509, "upload_time": "2016-10-06T19:50:09", "url": "https://files.pythonhosted.org/packages/cd/76/ed32e625d7278ab8148221bf5ea8ebc62e08dc2a6480e5ef9a2f0cf3afcc/SpookyOTP-1.1.0-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "a1d259502f45996e915812c27474c816", "sha256": "a11706976ae0246aba85a321b6fd7a9b0890002fc13320c77ee9eab24e2e0203" }, "downloads": -1, "filename": "SpookyOTP-1.1.0-py2-none-any.whl", "has_sig": false, "md5_digest": "a1d259502f45996e915812c27474c816", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 6821, "upload_time": "2016-10-06T19:50:12", "url": "https://files.pythonhosted.org/packages/b4/9d/9ae1c321024296bd32580bdac6cb86301987ed30d2eb631573b834efdcd8/SpookyOTP-1.1.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cd755a7857ab5c611b041763bbf111fd", "sha256": "3f030ac4d5ef69feb964fcfc4fcf157736921818cc1e7f4690225d5a30255017" }, "downloads": -1, "filename": "SpookyOTP-1.1.0.tar.gz", "has_sig": false, "md5_digest": "cd755a7857ab5c611b041763bbf111fd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6398, "upload_time": "2016-10-06T19:50:06", "url": "https://files.pythonhosted.org/packages/c9/b3/f260aa70203a8c44327223599fec0c115fbbbb3f0a0d6fc8abbc7af0c878/SpookyOTP-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "474c65bf7f4bb7c662e67dec6c857ca2", "sha256": "29427aca4495f4bbc25d6a85c16621ecb3885b1922157349284077c1b8eac2f7" }, "downloads": -1, "filename": "SpookyOTP-1.1.1-py2.7.egg", "has_sig": false, "md5_digest": "474c65bf7f4bb7c662e67dec6c857ca2", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 5822, "upload_time": "2016-10-06T21:32:11", "url": "https://files.pythonhosted.org/packages/7d/56/7f81552177964f72d367f610db60eb33fe0216bb6e06b3e9a1aea2d3e884/SpookyOTP-1.1.1-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "aae58b65c7ee97253bee47fc8c3fd4a6", "sha256": "87e6f9f45fdcfecf37e52c1d84241a28975ed965cdd3b9d931f2f1deb167f130" }, "downloads": -1, "filename": "SpookyOTP-1.1.1-py2-none-any.whl", "has_sig": false, "md5_digest": "aae58b65c7ee97253bee47fc8c3fd4a6", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7145, "upload_time": "2016-10-06T21:32:14", "url": "https://files.pythonhosted.org/packages/f0/0c/7d5ded00dd065d35f51952227c523feea547aa34751e5be7e010d42e6938/SpookyOTP-1.1.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ab60ffa15ad4fae39a7f378de8ae031a", "sha256": "6dc19c4297051ccb4e33201525d7af168ec25fe020b0c967482ee83c2fcb3a04" }, "downloads": -1, "filename": "SpookyOTP-1.1.1.tar.gz", "has_sig": false, "md5_digest": "ab60ffa15ad4fae39a7f378de8ae031a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6810, "upload_time": "2016-10-06T21:32:09", "url": "https://files.pythonhosted.org/packages/0b/db/43463d323527cc0a5d8634012e3b3904266d75a82d346c5e6c1924dd645c/SpookyOTP-1.1.1.tar.gz" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "f363e0d8fb79b070d52eba7a358a400c", "sha256": "2b61b6f24451dbecd8619a7c99c286e9ec5d20b4fdc8ef8aff5baf3025e6b264" }, "downloads": -1, "filename": "SpookyOTP-1.1.2-py2-none-any.whl", "has_sig": false, "md5_digest": "f363e0d8fb79b070d52eba7a358a400c", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 6586, "upload_time": "2018-10-06T19:12:29", "url": "https://files.pythonhosted.org/packages/1c/62/cdde08b6dcb526f584097b2c4208183fb0c3f3c371856aaf4833bcecf044/SpookyOTP-1.1.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6d794b1c585277072724f49d1b7a09a5", "sha256": "c462d27e0edda38d88a55c4a7e563389d3a0d03009c8cec05b575c11fefbfc28" }, "downloads": -1, "filename": "SpookyOTP-1.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "6d794b1c585277072724f49d1b7a09a5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6584, "upload_time": "2018-10-06T19:10:30", "url": "https://files.pythonhosted.org/packages/94/1c/8dbcca87f7c54e658aa71556c8b3bcc51f6d7136d3ae0718d8f277efa221/SpookyOTP-1.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a4d223d4a5a28e3fcb79e4974a05f1aa", "sha256": "3fdc93842ee63fe0380b693f3a48e9ee009591a427e92370c0f1d2793c12b99f" }, "downloads": -1, "filename": "SpookyOTP-1.1.2.tar.gz", "has_sig": false, "md5_digest": "a4d223d4a5a28e3fcb79e4974a05f1aa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6767, "upload_time": "2018-10-06T19:10:31", "url": "https://files.pythonhosted.org/packages/fb/fe/c33d3ab50e4068a5cf5007a3f4a91beb8041da8cbe0df91edabeaee7e16f/SpookyOTP-1.1.2.tar.gz" } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "4b101b5e315168390b9a699356134553", "sha256": "d1d130c31fbf2157e0b592550cbb7888aa44dc12ee9d9ca67409cbdb273f3cc5" }, "downloads": -1, "filename": "SpookyOTP-1.1.3-py2-none-any.whl", "has_sig": false, "md5_digest": "4b101b5e315168390b9a699356134553", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 7173, "upload_time": "2018-10-06T19:19:20", "url": "https://files.pythonhosted.org/packages/11/98/b8a27480a974e4d565d617cf35f5a5c4be835f4f820726fe3f08dbbaf021/SpookyOTP-1.1.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ce1fb0083e9491115a41d28776e44fa0", "sha256": "a09c8cdac595ff1f19e0d1e5bbe6808c49e56d4eb99119bb4188a4bd8e03148e" }, "downloads": -1, "filename": "SpookyOTP-1.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "ce1fb0083e9491115a41d28776e44fa0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7173, "upload_time": "2018-10-06T19:19:21", "url": "https://files.pythonhosted.org/packages/a2/93/a528aedc4e8321ab1f4d0df4463655dad5b15d5f4dae50154882635c0a63/SpookyOTP-1.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7656ae41d604a921f311d382b75eca43", "sha256": "0852c5766b3ab31465f010601aa0a87346248a1ed0c8b56c310299cb57438302" }, "downloads": -1, "filename": "SpookyOTP-1.1.3.tar.gz", "has_sig": false, "md5_digest": "7656ae41d604a921f311d382b75eca43", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6982, "upload_time": "2018-10-06T19:19:22", "url": "https://files.pythonhosted.org/packages/cd/64/4f4ec962589cb3933f1d77bd65712fe0fbd30219a725f8aaf6da60fe646f/SpookyOTP-1.1.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4b101b5e315168390b9a699356134553", "sha256": "d1d130c31fbf2157e0b592550cbb7888aa44dc12ee9d9ca67409cbdb273f3cc5" }, "downloads": -1, "filename": "SpookyOTP-1.1.3-py2-none-any.whl", "has_sig": false, "md5_digest": "4b101b5e315168390b9a699356134553", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 7173, "upload_time": "2018-10-06T19:19:20", "url": "https://files.pythonhosted.org/packages/11/98/b8a27480a974e4d565d617cf35f5a5c4be835f4f820726fe3f08dbbaf021/SpookyOTP-1.1.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ce1fb0083e9491115a41d28776e44fa0", "sha256": "a09c8cdac595ff1f19e0d1e5bbe6808c49e56d4eb99119bb4188a4bd8e03148e" }, "downloads": -1, "filename": "SpookyOTP-1.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "ce1fb0083e9491115a41d28776e44fa0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7173, "upload_time": "2018-10-06T19:19:21", "url": "https://files.pythonhosted.org/packages/a2/93/a528aedc4e8321ab1f4d0df4463655dad5b15d5f4dae50154882635c0a63/SpookyOTP-1.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7656ae41d604a921f311d382b75eca43", "sha256": "0852c5766b3ab31465f010601aa0a87346248a1ed0c8b56c310299cb57438302" }, "downloads": -1, "filename": "SpookyOTP-1.1.3.tar.gz", "has_sig": false, "md5_digest": "7656ae41d604a921f311d382b75eca43", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6982, "upload_time": "2018-10-06T19:19:22", "url": "https://files.pythonhosted.org/packages/cd/64/4f4ec962589cb3933f1d77bd65712fe0fbd30219a725f8aaf6da60fe646f/SpookyOTP-1.1.3.tar.gz" } ] }