{ "info": { "author": "HacKan", "author_email": "hackan@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: End Users/Desktop", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Natural Language :: English", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Security :: Cryptography", "Topic :: Utilities" ], "description": "|GitHub license| |PyPI pyversions| |PyPI version| |GitHub release|\n|GitHub version| |Updates| |Build Status|\n\nPassphrase\n==========\n\n**Passphrase** is a tool to generate **cryptographically secure**\npassphrases and passwords. A passphrase is a list of words usually\nseparated by a blank space. This tool acts like a\n`diceware `__ generator\n(more about this in `EFF's website `__).\n\nIts security is based on Python's\n`os.urandom `__ to\nget cryptographically secure random bits to make an integer number. It\nalso makes use of the `EFF's Large\nWordlist `__ as\nwords reference for passphrases.\n\n**Who is this tool for**: **Passphrase** is a library and a CLI tool,\nthus its intended audience are developers and advanced users that love\nto use the terminal :)\n\nA secure passphrase must be of at least 6 words, but 7 is better, and\nmaybe you can add a random number to the list. If you need a password,\nmake it bigger than 8 characters (`NIST's latest\nrecommendation `__),\nand prefer more than 12 (I recommend 16 or more). Passwords are\ncomprised of digits, upper and lowercase letters and punctuation symbols\n- more specifically: ``ascii_lowercase``, ``ascii_uppercase``,\n``digits`` and ``punctuation`` from\n`Lib/string `__\n-.\n\nThose settings mentioned are specifically for the EFF's Large Wordlist.\nIf you specify a different wordlist, the minimum amount of words for a\npassphrase to be secure changes: for shorter lists, the amount\nincreases. The minimum secure amount of words (for a passphrase) or\ncharacters (for a password) are calculated by **Passphrase** and a\nwarning is shown if the chosen number is too low (when used as a\nscript), by calculating the list's entropy.\n\n**Important note**: the quality and security of generated passphrases\nrely on:\n\n- the `OS-specific randomness\n source `__, and\n- the quality of the wordlist.\n\nIf you are not sure which wordlist to use, just use the one provided by\n**Passphrase** (it is used by default when running as a script) or one\nof the EFF's wordlists (check at about the middle of `this blog\npost `__).\n\nRequirements\n------------\n\n- **Python 3.5+**.\n\nHow to use it\n-------------\n\n| **Passphrase** can be used as a *package* in other apps, or as a\n *stand-alone script*.\n| Start by downloading the files, preferrably fom the `latest\n release `__\n - releases are always signed -.\n\nYou can also use *`pip `__*\nbut I discourage it, given that there's no cryptographic verification of\nsignatures nor hashes at all.\n\nAs a package\n~~~~~~~~~~~~\n\nCheck the `developers\nguide `__.\n\nAs a script\n~~~~~~~~~~~\n\nOnce downloaded and verified, you can install it with\n``setup.py install`` or ``make package-install`` but I recommend you do\n``make install`` for system-wide installation or ``make altinstall`` for\nuser-wide installation, as it will create a single executable zip file\nplus install the man page.\n\nTo uninstall, run respectively ``make package-uninstall``,\n``make uninstall`` or ``make altuninstall``.\n\nAnother option is to run ``pip install --user hc-passphrase`` (for\nuser-wide installation) or ``pip install hc-passphrase`` (for\nsystem-wide installation), but I advise against this way given that pip\ndoesn't do any cryptographic verification of signatures nor hashes at\nall.\n\nExamples of use\n^^^^^^^^^^^^^^^\n\nCheck the `man\npage `__\nfor more information.\n\nGenerally, you should rely on **Passphrase**'s entropy calculation\ninstead of fixing a desired amount, unless you specifically need some\nlength/word amount. The default entropy is 77 bits, and using over 128\nbits is a wiser choice on the long term.\n\nGenerate a passphrase of 6 words (default settings)\n'''''''''''''''''''''''''''''''''''''''''''''''''''\n\n::\n\n :~$ passphrase\n trophy affiliate clobber vivacious aspect thickness\n\nGenerate a passphrase of 128 bits of entropy\n''''''''''''''''''''''''''''''''''''''''''''\n\n::\n\n :~$ passphrase -e 128\n shorty collie prison reopen barge morally flavoring shifter scarcity perfume\n\nGenerate a passphrase of 6 words and a number (minimum recommended)\n'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''\n\n::\n\n :~$ passphrase -w 6 -n 1\n jasmine identity chemo suave clerk copartner 853727\n\nGenerate a passphrase of 6 words with 5 characters uppercase\n''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''\n\n::\n\n :~$ passphrase -w 6 --use-uppercase 5\n LiTmus cocoa littEr equation uNwrapped sibliNg\n\nGenerate a passphrase of 6 words with 5 characters lowercase\n''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''\n\n::\n\n :~$ passphrase -w 6 --use-lowercase 5\n MOrTUARY SIesTa MAKEOVER CURABLE JET MARSHy\n\nGenerate a password of 16 characters (minimum recommended)\n''''''''''''''''''''''''''''''''''''''''''''''''''''''''''\n\n::\n\n :~$ passphrase -p 16\n E`31nDL0^$oYu5='\n\nGenerate a password of 8 alphanumeric characters only\n'''''''''''''''''''''''''''''''''''''''''''''''''''''\n\n::\n\n :~$ passphrase -p 8 --use-lowercase --use-uppercase --use-digits\n Warning: Insecure password length chosen! Should be bigger than or equal to 13\n 7wmivbmR\n :~$ passphrase -p 8 --use-alphanumeric\n Warning: Insecure password length chosen! Should be bigger than or equal to 13\n ipLdqmGU\n\nGenerate a secure password of lowercase characters only\n'''''''''''''''''''''''''''''''''''''''''''''''''''''''\n\n::\n\n :~$ passphrase -p --use-lowercase\n yafwodlcbfumtfsbb\n :~$ passphrase -p --use-lowercase -e 128\n fbwzekpmmridyapdouvejmlzlrjn\n\nUse an external wordlist to generate a passphrase\n'''''''''''''''''''''''''''''''''''''''''''''''''\n\n::\n\n :~$ passphrase -i eff_short_wordlist_1_1column.txt\n wimp broke dash pasta zebra viral outer clasp\n :~$ passphrase -d -i eff_short_wordlist_1.txt \n mouse trend coach stain shut rhyme baggy scale\n\nSave the output to a file\n'''''''''''''''''''''''''\n\n::\n\n :~$ passphrase -o pass.txt\n :~$ passphrase > pass.txt\n\nGenerate a passphrase and use it with GPG\n'''''''''''''''''''''''''''''''''''''''''\n\n::\n\n :~$ sha256sum somefile.txt\n 589ed823e9a84c56feb95ac58e7cf384626b9cbf4fda2a907bc36e103de1bad2 somefile.txt\n :~$ passphrase --no-newline -o pass.txt | gpg --symmetric --batch --passphrase-fd 0 somefile.txt\n :~$ cat pass.txt | gpg --decrypt --batch --passphrase-fd 0 somefile.txt.gpg | sha256sum -\n gpg: AES256 encrypted data\n gpg: encrypted with 1 passphrase\n 589ed823e9a84c56feb95ac58e7cf384626b9cbf4fda2a907bc36e103de1bad2 -\n\nGenerate a passphrase avoiding `shoulder surfing `__\n''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''\n\n::\n\n :~$ passphrase -m -o pass.txt\n\nGenerate using the verbose mode\n'''''''''''''''''''''''''''''''\n\n::\n\n :~$ passphrase -v\n Passphrase v1.1.3\n by HacKan (https://hackan.net) FOSS under GNU GPL v3.0 or newer\n Using 77 bits of entropy for calculations (if any). The minimum recommended is 77\n Generating a passphrase of 6 words and 0 numbers using internal wordlist\n The entropy of this passphrase is 77.55 bits\n porridge browse undertone credibly underline gullible\n :~$ passphrase -v -p\n Passphrase v1.1.3\n by HacKan (https://hackan.net) FOSS under GNU GPL v3.0 or newer\n Using 77 bits of entropy for calculations (if any). The minimum recommended is 77\n Generating password of 12 characters long using uppercase characters, lowercase characters, digits, punctuation characters\n The entropy of this password is 78.66 bits\n ZJN(Lvy{D'9H\n\nIs this really secure?\n----------------------\n\n| First of all, we will say that a password or passphrase generator\n algorithm is secure if its output is *trully* random. To achieve that,\n **Passphrase** relies entirely on ``os.urandom``, which always\n provides an interface to the OS's cryptographically secure random\n generator. The whole program is quite big, but most of it is just the\n menues and the word list.\n| The generator algorithms are very short and simple, they are in\n `passphrase.passphrase `__:\n ``Passphrase::generate()`` and ``Passphrase::generate_password()``.\n The lower level functions are in\n `passphrase.random `__,\n which directly uses ``os.urandom``; higher level functions are in\n `passphrase.secrets `__,\n that provides a convenient interface to those low level functions, so\n that implementation errors are avoided.\n\n| The whole magic is done by ``passphrase.secrets.randbelow()``, that\n returns a random natural number lower than the given value, that is\n then used as index for the word or character list by\n ``passphrase.secrets.randchoice()``, function used by the generators.\n| Both ``randbelow()`` and ``randint()`` where copyied from Python's\n Lib/random, but trimmed down so that they don't allow anything fishy.\n This also makes **Passphrase** independent from unnecessary libraries\n and potential external vulnerabilities.\n\nThe algorithms are very straight forward, easy to understand and verify.\n*Boring crypto is the best crypto*.\n\nAttack surface\n~~~~~~~~~~~~~~\n\nLet's analyze some possible attack scenarios and its mitigations. If you\nwant to add something or you see a mistake, please write an\n`issue `__.\n\nAttacker is root\n^^^^^^^^^^^^^^^^\n\nTL;DR: **game over**.\n\nAn attacker that is *root* can do whatever it wants, so it's out of the\nscope of this analysis.\n\nAttacker can modify source code or wordlist\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIf it can modify the source code somehow, or the default\n`wordlist `__,\nit's also game over since a software that succesfully checks itself\ndoesn't exist yet. However, it could be mitigated by placing the files\nunder the ownership of some privileged user (*root*).\n\nAttacker can modify external libraries\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n**Passphrase** doesn't require any external library, just Python 3 core.\n\nAttacker can perform a timing attack\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n| Words for passphrases and characters for passwords are randomly\n fetched from indexed lists. The process is: generate a random number,\n use it as index for the list, get the word or character. Timing -\n somehow - access time to this list would retrieve no difference from\n some number against another, so I think this scenario does not affect\n **Passphrase**, nor permits passphrase/password guessing.\n| However, it is possible to somehow force the list into certain memory\n pages and time cache-miss, and try to guess the word gotten from the\n list. It could be an over complicated attack, yet it does exist.\n\nTimings\n-------\n\nI realize at some point that the library was taking waaay longer to work\nthan before (I solved it in\n`2c0eb8b `__),\nso I decided to measure each version runtime from now on. So here's the\nruntime table for each tag:\n\n+-----------------+----------------+--------------------+-----------------------------------+\n| Version (tag) | Runtime (ms) | Relative Runtime | Runtime Change Between Versions |\n+=================+================+====================+===================================+\n| v0.2.3 | 43.1 | 1.00 | +0% |\n+-----------------+----------------+--------------------+-----------------------------------+\n| v0.2.3-1 | 41.2 | 0.96 | -4% |\n+-----------------+----------------+--------------------+-----------------------------------+\n| v0.3.0 | 39.1 | 0.91 | -5% |\n+-----------------+----------------+--------------------+-----------------------------------+\n| v0.4.1 | 107 | 2.48 | +174% |\n+-----------------+----------------+--------------------+-----------------------------------+\n| v0.4.2 | 105 | 2.43 | -2% |\n+-----------------+----------------+--------------------+-----------------------------------+\n| v0.4.4 | 105 | 2.43 | +0% |\n+-----------------+----------------+--------------------+-----------------------------------+\n| v0.4.5 | 30.7 | 0.71 | -71% |\n+-----------------+----------------+--------------------+-----------------------------------+\n| v0.4.7 | 30.6 | 0.71 | -0% |\n+-----------------+----------------+--------------------+-----------------------------------+\n| v0.4.8 | 35.6 | 0.83 | +16% |\n+-----------------+----------------+--------------------+-----------------------------------+\n| v0.5.0 | 35.6 | 0.83 | +0% |\n+-----------------+----------------+--------------------+-----------------------------------+\n| v0.5.1 | 37.5 | 0.87 | +5% |\n+-----------------+----------------+--------------------+-----------------------------------+\n| v1.0.0 | 37.3 | 0.87 | -0% |\n+-----------------+----------------+--------------------+-----------------------------------+\n\n| You can try it yourself: download each release, unpack it and time it.\n| The command to run, depending on the release version, is:\n\n- newer than v0.4.5, run: ``make timeit``.\n- older than v0.4.5, run\n ``python3 -m timeit -n 100 -r 10 -s 'import os' 'os.system(\"python3 -m passphrase -w6 -q\")'``.\n- older than v0.4, run:\n ``python3 -m timeit -n 100 -r 10 -s 'import os' 'os.system(\"python3 src/passphrase.py -w6 -q\")'``.\n\nLicense\n-------\n\n**Passphrase** is made by `HacKan `__ under GNU GPL\nv3.0+. You are free to use, share, modify and share modifications under\nthe terms of that\n`license `__.\n\n::\n\n Copyright (C) 2017 HacKan (https://hackan.net)\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU General Public License for more details.\n\n You should have received a copy of the GNU General Public License\n along with this program. If not, see .\n\n.. |GitHub license| image:: https://img.shields.io/github/license/hackancuba/passphrase-py.svg\n :target: https://github.com/HacKanCuBa/passphrase-py/blob/master/LICENSE\n.. |PyPI pyversions| image:: https://img.shields.io/pypi/pyversions/hc-passphrase.svg\n :target: https://pypi.python.org/pypi/hc-passphrase/\n.. |PyPI version| image:: https://badge.fury.io/py/hc-passphrase.svg\n :target: https://badge.fury.io/py/hc-passphrase\n.. |GitHub release| image:: https://img.shields.io/github/release/hackancuba/passphrase-py.svg\n :target: https://github.com/hackancuba/passphrase-py/releases/\n.. |GitHub version| image:: https://badge.fury.io/gh/hackancuba%2Fpassphrase-py.svg\n :target: https://badge.fury.io/gh/hackancuba%2Fpassphrase-py\n.. |Updates| image:: https://pyup.io/repos/github/HacKanCuBa/passphrase-py/shield.svg\n :target: https://pyup.io/repos/github/HacKanCuBa/passphrase-py/\n.. |Build Status| image:: https://travis-ci.org/HacKanCuBa/passphrase-py.svg?branch=master\n :target: https://travis-ci.org/HacKanCuBa/passphrase-py\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/HacKanCuBa/passphrase-py/archive/v1.2.1.tar.gz", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/hackancuba/passphrase-py", "keywords": "cryptography passphrase password security", "license": "GNU GPL 3.0+", "maintainer": "", "maintainer_email": "", "name": "hc-passphrase", "package_url": "https://pypi.org/project/hc-passphrase/", "platform": "POSIX :: Linux", "project_url": "https://pypi.org/project/hc-passphrase/", "project_urls": { "Download": "https://github.com/HacKanCuBa/passphrase-py/archive/v1.2.1.tar.gz", "Homepage": "http://github.com/hackancuba/passphrase-py" }, "release_url": "https://pypi.org/project/hc-passphrase/1.2.1/", "requires_dist": null, "requires_python": ">=3.5", "summary": "Generates cryptographically secure passphrases and passwords", "version": "1.2.1" }, "last_serial": 4307234, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "2dfea05966e1d4716290be106e076a6c", "sha256": "b85b768a76b60c937fba440c0a7c0ab3cbaa5f4ffc0537db0556311c95723c75" }, "downloads": -1, "filename": "hc_passphrase-1.0.0-py3-none-any.whl", "has_sig": true, "md5_digest": "2dfea05966e1d4716290be106e076a6c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 56136, "upload_time": "2018-02-08T18:21:32", "url": "https://files.pythonhosted.org/packages/56/c4/50ea1980806501fc07df939dfda0000721c8cc38a2690c700d6ba9d5671e/hc_passphrase-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "67daa3ff3c3222b5108bd2e5553b4e9e", "sha256": "73fd8d25054834507866bb4a6ccb512b55ca87036cb069dbddaccb075fc5b8ef" }, "downloads": -1, "filename": "hc-passphrase-1.0.0.tar.gz", "has_sig": true, "md5_digest": "67daa3ff3c3222b5108bd2e5553b4e9e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 65826, "upload_time": "2018-02-08T18:22:06", "url": "https://files.pythonhosted.org/packages/7c/57/f4e1b312767dc20bdd91bf380313e6bba281cc2800bb2389a57c249215b0/hc-passphrase-1.0.0.tar.gz" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "9f841ab135d3b789c8b7dcd542028488", "sha256": "d8bc8a8ba41f9b6f272a217b63c9fb90899ac39302ee163aef2bd7a9a8dfbd0a" }, "downloads": -1, "filename": "hc_passphrase-1.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "9f841ab135d3b789c8b7dcd542028488", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 56197, "upload_time": "2018-07-20T00:13:23", "url": "https://files.pythonhosted.org/packages/c2/9e/d57c8913274b9b64ce0c20479b3be34c652c17ba478272aa29d65f285cea/hc_passphrase-1.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1dcb76dad199e73aa69a644a3f9de072", "sha256": "843ba4118adb718d3f3257edce9d330e223e8947c420e099153fe4506ed3ed0b" }, "downloads": -1, "filename": "hc-passphrase-1.1.2.tar.gz", "has_sig": false, "md5_digest": "1dcb76dad199e73aa69a644a3f9de072", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 65952, "upload_time": "2018-07-20T00:13:25", "url": "https://files.pythonhosted.org/packages/57/2d/dffb8238fae2f4675986ddc2299e604e31e89a40ffc280e1c67b1bbe1e2b/hc-passphrase-1.1.2.tar.gz" } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "4a45ae014f49bf402f1f488c3ee39a80", "sha256": "89a834d371804521ed58145858995d013d0ff808c2d6dfa64125a3d211491eb9" }, "downloads": -1, "filename": "hc_passphrase-1.1.3-py3-none-any.whl", "has_sig": true, "md5_digest": "4a45ae014f49bf402f1f488c3ee39a80", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 56141, "upload_time": "2018-08-11T23:34:02", "url": "https://files.pythonhosted.org/packages/19/3c/a93dee258104ed423e09e6e6a2c78449939a8872a6e6098ab8d90a5dcb72/hc_passphrase-1.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b5d8560e21ceddb618ca1ee0ebe22825", "sha256": "6c93747dea9965f117070263663f9529bd54d241ed64b528e9c5775059d6bb8c" }, "downloads": -1, "filename": "hc-passphrase-1.1.3.tar.gz", "has_sig": true, "md5_digest": "b5d8560e21ceddb618ca1ee0ebe22825", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 65882, "upload_time": "2018-08-11T23:34:05", "url": "https://files.pythonhosted.org/packages/8c/49/79323c51264bf5515aa9f68d1fea679f6df83ea010d120b9160a439eb952/hc-passphrase-1.1.3.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "f1f881bb838a104c6a074057a31128dc", "sha256": "91999ed645751816c59211d4ad506ef823f8f73203b83ac8666476197f3a7249" }, "downloads": -1, "filename": "hc_passphrase-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "f1f881bb838a104c6a074057a31128dc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 57452, "upload_time": "2018-09-23T20:50:03", "url": "https://files.pythonhosted.org/packages/79/e3/7ce2ce152d69fafb68bd04b082c2fbaf5aa28c4a47f4fbc0f02394ece206/hc_passphrase-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c53e1eb5b4816bd484912a553b2714ef", "sha256": "528f1ddf6b134b043e2f955eadb47560246f94294cb03dd848348b13a3a49fc4" }, "downloads": -1, "filename": "hc-passphrase-1.2.0.tar.gz", "has_sig": true, "md5_digest": "c53e1eb5b4816bd484912a553b2714ef", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 67092, "upload_time": "2018-09-23T20:50:42", "url": "https://files.pythonhosted.org/packages/0f/cc/20fd7dca1ac8ed0a44c513c9d0e2ff37c5e4d7d36e0dae043d839ad19d8a/hc-passphrase-1.2.0.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "6f9af7e41344809cd137ae3a8e0d8688", "sha256": "d3e32e044984fe52ba413c125ac28648457e73f9fb463900132f7098845b3d0e" }, "downloads": -1, "filename": "hc_passphrase-1.2.1-py3-none-any.whl", "has_sig": true, "md5_digest": "6f9af7e41344809cd137ae3a8e0d8688", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 50887, "upload_time": "2018-09-25T04:36:29", "url": "https://files.pythonhosted.org/packages/d8/07/ded5f1fa8026c76f911dd074ae6d0dadb19da99fff06a33ce68621cfa95a/hc_passphrase-1.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e396d9066fd8892a1011ee6f362612a8", "sha256": "63f354fff706a36fdecf8471f519f1d08769f7d46f30c82961e3a5101772d43f" }, "downloads": -1, "filename": "hc-passphrase-1.2.1.tar.gz", "has_sig": true, "md5_digest": "e396d9066fd8892a1011ee6f362612a8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 69586, "upload_time": "2018-09-25T04:36:31", "url": "https://files.pythonhosted.org/packages/38/53/4679f3fa12301ad5f35c0a4ad591d3cf859c9d3719c76bc1a01d910ff122/hc-passphrase-1.2.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6f9af7e41344809cd137ae3a8e0d8688", "sha256": "d3e32e044984fe52ba413c125ac28648457e73f9fb463900132f7098845b3d0e" }, "downloads": -1, "filename": "hc_passphrase-1.2.1-py3-none-any.whl", "has_sig": true, "md5_digest": "6f9af7e41344809cd137ae3a8e0d8688", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 50887, "upload_time": "2018-09-25T04:36:29", "url": "https://files.pythonhosted.org/packages/d8/07/ded5f1fa8026c76f911dd074ae6d0dadb19da99fff06a33ce68621cfa95a/hc_passphrase-1.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e396d9066fd8892a1011ee6f362612a8", "sha256": "63f354fff706a36fdecf8471f519f1d08769f7d46f30c82961e3a5101772d43f" }, "downloads": -1, "filename": "hc-passphrase-1.2.1.tar.gz", "has_sig": true, "md5_digest": "e396d9066fd8892a1011ee6f362612a8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 69586, "upload_time": "2018-09-25T04:36:31", "url": "https://files.pythonhosted.org/packages/38/53/4679f3fa12301ad5f35c0a4ad591d3cf859c9d3719c76bc1a01d910ff122/hc-passphrase-1.2.1.tar.gz" } ] }