{"id":20557033,"url":"https://github.com/sharpvik/pwds","last_synced_at":"2026-05-29T12:31:21.538Z","repository":{"id":114206220,"uuid":"230634486","full_name":"sharpvik/pwds","owner":"sharpvik","description":"Password Manager written in Python3","archived":false,"fork":false,"pushed_at":"2022-12-08T03:23:03.000Z","size":1125,"stargazers_count":1,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-06T06:48:31.990Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sharpvik.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":"2019-12-28T16:29:40.000Z","updated_at":"2020-01-03T08:23:47.000Z","dependencies_parsed_at":"2023-06-15T23:00:31.373Z","dependency_job_id":null,"html_url":"https://github.com/sharpvik/pwds","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/sharpvik/pwds","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sharpvik%2Fpwds","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sharpvik%2Fpwds/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sharpvik%2Fpwds/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sharpvik%2Fpwds/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sharpvik","download_url":"https://codeload.github.com/sharpvik/pwds/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sharpvik%2Fpwds/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33652979,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-29T02:00:06.066Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":[],"created_at":"2024-11-16T03:34:24.168Z","updated_at":"2026-05-29T12:31:21.520Z","avatar_url":"https://github.com/sharpvik.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Pwds Password Manager\n\n*Pwds* is a simple command line password manager tool.\n\n\n\n## Contents\n\n1. [Status](#status)\n2. [User Guide](#user-guide)\n    - [Setup](#user-guide-setup)\n    - [Run It](#run-it)\n3. [Brief Algorithm Description](#algorithm-description)\n    - [Storing Passwords](algorithm-description-storing-passwords)\n    - [Verifying That Salt and Passwords Have Not Been Corrupted](algorithm-description-verifying)\n    - [Decrypting Passwords](algorithm-description-decrypting-passwords)\n4. [User Guide](#user-guide)\n5. [Dependencies](#dependencies)\n6. [Contribute](#contribute)\n\n\n\n## \u003ca name=\"status\"\u003e\u003c/a\u003e Status\n\n| Command  | Status |\n|---------:|--------|\n| `launch` | `OK`   |\n| `give`   | `OK`   |\n| `gen`    | `OK`   |\n| `see`    | `OK`   |\n| `copy`   | `OK`   |\n| `remove` | `OK`   |\n\n\n\n## \u003ca name=\"user-guide\"\u003e\u003c/a\u003e User Guide\n\n### \u003ca name=\"user-guide-setup\"\u003e\u003c/a\u003e Setup\n\n\u003e Setup script (say `setup.py`) is not yet implemented!\n\n\u003e Windows installer is not here either!\n\nFor now, you can\n\n```bash\ngit clone https://github.com/sharpvik/pwds.git\ncd pwds\npip3 install pipenv # if you don't have it yet\npipenv shell        # to create virtual environment\npipenv install      # to install dependecies from Pipfile\n```\n\n\n### \u003ca name=\"run-it\"\u003e\u003c/a\u003e Run It\n\n```\nUsage: \n    user@user:pwds$ python3 src/main.py [OPTIONS] COMMAND [ARGS]...\n\nOptions:\n    --help  Show this message and exit.\n\nCommands:\n    copy    Copy password from given source domain to target.\n    gen     Generate new password for a given domain.\n    give    Give/reset password to a given domain.\n    launch  Initialize pwds.\n    remove  Remove domain-password entry.\n    see     See password for given domain.\n```\n\n\n\n## \u003ca name=\"algorithm-description\"\u003e\u003c/a\u003e Brief Algorithm Description\n\nThis tool is supposed to run locally, although, in future updates, I'm planning\nto make it into a web service. All passwords are stored in an encrypted file in\nlocation specified in [config.py]. In that same folder you can find `salt`,\n`mastermac`, and `dictionary`. All these files are hidden (their names start\nwith a dot, like this `.name`).\n\nWhat follows is a symbolic description of the algorithm.\n\n### \u003ca name=\"algorithm-description-storing-passwords\"\u003e\u003c/a\u003e Storing Passwords\n\n```\nsecrets.token_bytes(16)                     =\u003e random salt\nPBKDF2(random salt, master password)        =\u003e secret\nSalsa20(secret, JSON object with passwords) =\u003e encrypted passwords\nHMAC(random salt, encrypted passwords)      =\u003e mastermac\nstore(random salt, encrypted passwords, mastermac)\n```\n\n### \u003ca name=\"algorithm-description-verifying\"\u003e\u003c/a\u003e Verifying That Salt and Passwords Have Not Been Corrupted\n\n```\nread(salt, encrypted passwords, mastermac)  =\u003e salt\n                                            =\u003e encrypted passwords\n                                            =\u003e mastermac\nHMAC(random salt, encrypted passwords)      =\u003e test mac\nassert test mac == mastermac\n```\n\n### \u003ca name=\"algorithm-description-decrypting-passwords\"\u003e\u003c/a\u003e Decrypting Passwords\n\n```\nread(salt, encrypted passwords, mastermac)  =\u003e salt\n                                            =\u003e encrypted passwords\n                                            =\u003e mastermac\nPBKDF2(random salt, master password)        =\u003e secret\nSalsa20(secret, encrypted passwords)        =\u003e passwords\n```\n\n\n\n## \u003ca name=\"dependencies\"\u003e\u003c/a\u003e Dependencies\n\n| Lib Name       | Description                                 | Documentation                   |\n|---------------:|---------------------------------------------|---------------------------------|\n| `click`        | Easy command line argument parsing          | click.palletsprojects.com       |\n| `appdirs`      | Knowing where to store program data files   | github.com/ActiveState/appdirs  |\n| `requests`     | `HTTP` requests handling                    | 2.python-requests.org/en/master |\n| `pycryptodome` | Implementations of cryptographic algorithms | pycryptodome.readthedocs.io     |\n| `colorama`     | Multiplatform teminal output coloring       | github.com/tartley/colorama     |\n| `termcolor`    | Terminal output coloring                    | pypi.org/project/termcolor      |\n\n\u003e Only third-party libraries are listed here. Actually, many more modules are\n\u003e used, however, those are Python standard library modules, so they just work.\n\n\n\n## \u003ca name=\"contribute\"\u003e\u003c/a\u003e Contribute\n\nIf you wish to contribute to this project, please inspect the [src](src) folder.\nThe algorithm is failry simple and can be deduced from just reading the code.\nI'm trying really hard to keep it as clean as possible.\n\nIf there's a bug or something... don't hesitate to raise an issue here.\n\nIf you wish to contact me in person, see this [config.py] file -- it has my\npersonal email address (it is also present on my [GitHub profile page]).\n\n[config.py]: src/config.py\n[GitHub profile page]: https://github.com/shapvik\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsharpvik%2Fpwds","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsharpvik%2Fpwds","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsharpvik%2Fpwds/lists"}