{"id":13630499,"url":"https://github.com/talhof8/gasper","last_synced_at":"2025-04-17T13:32:32.992Z","repository":{"id":144221332,"uuid":"297160378","full_name":"talhof8/gasper","owner":"talhof8","description":"Gasper is a CLI for safe, privacy-aware file storage based on Shamir's Secret Sharing","archived":false,"fork":false,"pushed_at":"2020-10-01T00:46:15.000Z","size":1468,"stargazers_count":40,"open_issues_count":4,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-11-08T21:38:59.913Z","etag":null,"topics":["backup","cli","file-upload","golang","privacy","shamir-secret-sharing","storage"],"latest_commit_sha":null,"homepage":"","language":"Go","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/talhof8.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2020-09-20T20:44:51.000Z","updated_at":"2024-03-29T07:22:11.000Z","dependencies_parsed_at":"2023-04-28T14:24:55.776Z","dependency_job_id":null,"html_url":"https://github.com/talhof8/gasper","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/talhof8%2Fgasper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/talhof8%2Fgasper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/talhof8%2Fgasper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/talhof8%2Fgasper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/talhof8","download_url":"https://codeload.github.com/talhof8/gasper/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249344854,"owners_count":21254751,"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":["backup","cli","file-upload","golang","privacy","shamir-secret-sharing","storage"],"created_at":"2024-08-01T22:01:45.166Z","updated_at":"2025-04-17T13:32:32.665Z","avatar_url":"https://github.com/talhof8.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/talhof8/gasper/blob/master/assets/logo.png?raw=true\" alt=\"Gasper Logo\"/\u003e\n\u003c/p\u003e\n\n\n# Gasper\n\n![](https://img.shields.io/github/issues/talhof8/gasper)\n![](https://img.shields.io/github/stars/talhof8/gasper)\n![](https://img.shields.io/github/license/talhof8/gasper)\n![](https://img.shields.io/twitter/url?url=https%3A%2F%2Fgithub.com%2Ftalhof8%2Fgasper)\n\nBack-up \u0026 encrypt your files in a distributed manner, across multiple stores of your choice, by splitting them to shares. \nRetrieve them at any point, with only a minimum number of shares required for retrieval.\n\nEach file is being split to multiple shares, all of which are distributed to different destinations defined by you (be it AWS S3, Dropbox, Google Drive, your local filesystem, FTP Server, etc...). You can retrieve your file at any given moment, even if you only have access to a part of the stores you originally used (down to a minimium threshold of your choice). \n\nGasper is based on the awesome [Shamir's Secret Sharing algorithm](https://en.wikipedia.org/wiki/Shamir%27s_Secret_Sharing). \n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://1.bp.blogspot.com/-7_pky8H-2f0/Wj5er1bgd6I/AAAAAAAACQ0/1X5NlcRD5M00SxYdC2ph69F6bbLXrtrFwCLcBGAs/s640/Capture.PNG?raw=true\" alt=\"Shamir's Secret Sharing\"/\u003e\u003cbr/\u003e\n\tSource: \u003ca href=\"http://robinsnippet.blogspot.com/2017/12/shamirs-secret-sharing-scheme.html\"\u003eRobin's Snippet blog\u003c/a\u003e\n\u003c/p\u003e\n\n# Demo\n#### Using local store\n![](assets/demo-local.gif)\n\n## Supported stores\n\n| Type              | Description           | Attributes                |\n| ----------------- |-----------------------| --------------------------|\n| `local`      | Store share in a local directory | `directory-path` (string) |\n\nFeel free to contribute your own stores - S3, Google Drive, Twitter, FTP, or anything else you'd like :)\n\n### Adding a new store\n1. Implement the `Store` interface (`pkg/storage/stores/store.go`):\n\n```\n// Store lets you store shares.\ntype Store interface {\n\t// Store type.\n\tType() string\n\n\t// Is store available?\n\t// Useful especially for remote stores, such as ftp servers or s3 buckets.\n\tAvailable() (bool, error)\n\n\t// Puts a share in store.\n\tPut(share *shares.Share) error\n\n\t// Retrieves a share from store.\n\t// If no share with the given File ID exists, returns ErrShareNotExists.\n\tGet(fileID string) (*shares.Share, error)\n\n\t// Deletes a share from store.\n\t// If no share with the given File ID exists, returns ErrShareNotExists.\n\tDelete(fileID string) error\n}\n```\n2. Add it to the stores factory function `FromConfig()` (`pkg/storage/stores/factory.go`), so it can be used out-of-the-box in the CLI.\n3. Enjoy!\n\nFor an example, see `pkg/storage/stores/local.go`.\n\n## Installation\n```\ngo get -u github.com/talhof8/gasper\n```\n\n## Usage\n#### Store\n```\ngasper store --stores-config \u003c/path/to/stores.json\u003e --file \u003cfile\u003e [--encrypt --salt \u003cvalid-aes-salt\u003e --share-count \u003ccount\u003e --shares-threshold \u003cmin-threshold\u003e --verbose]\n```\nOutputs file ID and checksum on success which should be used for retrieval.\n\n#### Retrieve\n```\ngasper retrieve --stores-config \u003c/path/to/stores.json\u003e --file-id \u003cfile-id\u003e --destination \u003csome-destination\u003e [--checksum \u003csome-checksum\u003e --encrypt --salt \u003cvalid-aes-salt\u003e --verbose]\n```\n\n#### Delete\nBest effort deletion.\n```\ngasper delete --stores-config \u003c/path/to/stores.json\u003e --file-id \u003cfile-id\u003e [--verbose]\n```\n\nStores configuration file:\n```\n{\n  \"stores\": [\n    {\n      \"type\": \"\u003ctype\u003e\",\n      \"\u003cattribute\u003e\": \"\u003cvalue\u003e\",\n      \"\u003cattribute\u003e\": \"\u003cvalue\u003e\",\n      \"\u003cattribute\u003e\": \"\u003cvalue\u003e\"\n    },\n    {\n      \"type\": \"\u003ctype\u003e\",\n      \"\u003cattribute\u003e\": \"\u003cvalue\u003e\",\n      ...\n    }\n  ]\n}\n```\n\n## License\nGasper is released under GPL. See LICENSE.txt.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftalhof8%2Fgasper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftalhof8%2Fgasper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftalhof8%2Fgasper/lists"}