Skip to content

Latest commit

Β 

History

29 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ” PyVault

PyVault is a local password and secrets manager written in Python.

The goal of this project is to build a simple, private and secure way to store sensitive information locally while learning how encryption, databases and application architecture work.

⚠️ PyVault is currently under development.


✨ Features

Currently available

  • πŸ”‘ Generate Fernet encryption keys
  • πŸ” Encrypt and store passwords using Fernet
  • πŸ’Ύ Store each password in a dedicated file per website
  • πŸ”“ Decrypt and retrieve stored passwords
  • πŸ“‹ List all saved entries
  • πŸ”Ž Search stored passwords
  • πŸ—‘οΈ Delete passwords
  • πŸ“€ Export passwords
  • πŸ–₯️ Simple CLI interface
  • πŸ§ͺ Unit tests
  • πŸ“Š Encryption / decryption benchmark

Planned

  • πŸ—„οΈ SQLite database
  • πŸ”‘ Master password
  • πŸ”’ Vault locking
  • 🌐 Local API
  • πŸ–₯️ Web interface

🧠 Why PyVault?

I wanted to create a project that was more than a simple Python script.

PyVault is also a way for me to learn how different parts of a real application work together:

  • Python
  • Cryptography
  • Databases
  • APIs
  • Authentication
  • Security
  • Software architecture
  • Performance testing

Instead of only following tutorials, I want to build the project myself, encounter problems, research solutions and document the entire process.


πŸ—οΈ Architecture

The architecture below shows both the current project and the features planned for the future.

flowchart TD

    User["πŸ‘€ User"]

    PyVault["πŸ” PyVault"]

    CLI["πŸ–₯️ CLI<br/>CURRENT"]

    GenerateKey["πŸ”‘ Generate Key<br/>CURRENT"]

    AddPassword["πŸ” Add Password<br/>CURRENT"]

    ListPasswords["πŸ“‹ List Passwords<br/>CURRENT"]

    DecryptPassword["πŸ”“ Decrypt Password<br/>CURRENT"]

    Fernet["πŸ”’ Fernet Encryption<br/>CURRENT"]

    KeyFile["πŸ“„ key.txt<br/>CURRENT"]

    SecretFolder["πŸ“ secret/<br/>CURRENT"]

    Search["πŸ”Ž Search Passwords<br/>CURRENT"]

    Delete["πŸ—‘οΈ Delete Password<br/>CURRENT"]

    Export["πŸ“€ Export Passwords<br/>CURRENT"]

    Tests["πŸ§ͺ Unit Tests<br/>CURRENT"]

    Benchmark["πŸ“Š Benchmark<br/>CURRENT"]

    MasterPassword["πŸ”‘ Master Password<br/>PLANNED"]

    Vault["πŸ” Vault System<br/>PLANNED"]

    SQLite["πŸ—„οΈ SQLite Database<br/>PLANNED"]

    API["🌐 Local API<br/>PLANNED"]

    FastAPI["⚑ FastAPI<br/>PLANNED"]

    Web["πŸ–₯️ Web Interface<br/>PLANNED"]

    User --> PyVault

    PyVault --> CLI

    CLI --> GenerateKey
    CLI --> AddPassword
    CLI --> ListPasswords
    CLI --> DecryptPassword

    GenerateKey --> Fernet
    GenerateKey --> KeyFile

    AddPassword --> Fernet
    Fernet --> SecretFolder

    DecryptPassword --> SecretFolder
    ListPasswords --> SecretFolder

    CLI --> Search
    CLI --> Delete
    CLI --> Export

    Search -.-> SQLite
    Delete -.-> SQLite

    MasterPassword -.-> Vault
    Vault -.-> SQLite

    API -.-> FastAPI
    FastAPI -.-> Vault
    Web -.-> API

    Tests -.-> PyVault
    Benchmark -.-> Fernet
Loading

CURRENT = already implemented

PLANNED = planned for a future version


πŸ“ Current Project Structure

PyVault/

β”‚
β”œβ”€β”€ commands/
β”‚   β”œβ”€β”€ add.py
β”‚   β”œβ”€β”€ decrypt.py
β”‚   β”œβ”€β”€ delete.py
β”‚   β”œβ”€β”€ export.py
β”‚   β”œβ”€β”€ generate_key.py
β”‚   β”œβ”€β”€ list.py
β”‚   └── search.py
β”‚
β”œβ”€β”€ secret/               ← stores encrypted password files
β”‚
β”œβ”€β”€ tests/                ← unit tests
β”‚
β”œβ”€β”€ images/
β”‚   └── benchmark.png     ← encryption/decryption benchmark
β”‚
β”œβ”€β”€ notebooks/
β”‚   └── benchmark.ipynb   ← Jupyter benchmark
β”‚
β”œβ”€β”€ main.py
β”œβ”€β”€ system_info.py
β”œβ”€β”€ key.txt
β”œβ”€β”€ .gitignore
β”œβ”€β”€ LICENSE
└── README.md

πŸ” Current Encryption System

PyVault currently uses Fernet from the cryptography library.

A key is generated with:

key = Fernet.generate_key()

The key is currently stored locally in:

key.txt

When adding a password, PyVault encrypts it before storing it:

fernet = Fernet(key.encode())

encrypted = fernet.encrypt(passwd.encode())

The encrypted password is then stored in a dedicated file inside the secret/ folder, one file per website:

secret/

└── github.txt

Example content of secret/github.txt:

gAAAAAB...

The password itself is not stored directly in the file.

⚠️ This is an early prototype. The current key management system is not considered secure enough for production use.


πŸ“Š Benchmark

PyVault includes a benchmark using Jupyter Notebook to measure the performance of Fernet encryption and decryption.

The benchmark tests multiple data sizes, from a few bytes up to 1 MB, and performs multiple iterations for each size.

The results are visualized in the following graph:

PyVault Encryption / Decryption Benchmark

The benchmark helps measure how encryption and decryption performance changes as the amount of data increases.

The benchmark notebook is located at:

notebooks/benchmark.ipynb

It can be used to experiment with PyVault's encryption system and compare future implementations.


πŸš€ Installation

Clone the repository:

git clone https://github.com/KirobotDev/PyVault.git

cd PyVault

Create a virtual environment:

Windows

python -m venv .venv

.venv\Scripts\activate

Linux / macOS

python3 -m venv .venv

source .venv/bin/activate

Install dependencies:

pip install -r requirements.txt

▢️ Usage

Start PyVault:

python main.py

You will see:

S. [Stars Project]      0. [Generate Key (Obliged)] Q. [Leave]

        1. [Add Password]   4. [Export (Zipfiles)]
        2. [List Pswd]      5. [Delete Passwd]
        3. [Decrypt Pswd]   6. [Search Website]

        Choices :

Generate a key

Choose:

0

PyVault will generate a Fernet key and save it to:

key.txt

Add a password

Choose:

1

PyVault will ask for:

Enter your key please thanks... :

Enter name your website Example (github) :

Enter your password :

The password will be encrypted and stored in:

secret/<website>.txt

List saved entries

Choose:

2

PyVault will display all files stored in the secret/ folder, one per website.

Decrypt a password

Choose:

3

PyVault will ask for:

Enter your key :
Enter the file name example (github.txt) :

It will then display:

Your Password is [ your_password_here ]

πŸ§ͺ Running Tests

Unit tests are available in the tests/ folder.

Run them with:

python -m unittest discover tests

πŸ“Š Running the Benchmark

The benchmark is available as a Jupyter Notebook.

Install Jupyter if necessary:

pip install jupyter

Start Jupyter:

jupyter notebook

Then open:

notebooks/benchmark.ipynb

The benchmark measures:

  • Encryption speed
  • Decryption speed
  • Different data sizes
  • Average execution time
  • Performance scaling

πŸ› οΈ Roadmap

Phase 1 β€” Prototype

  • Generate Fernet key
  • Save key locally
  • Encrypt passwords
  • Save encrypted passwords (one file per website in secret/)
  • Store website information
  • Basic CLI
  • Decrypt passwords
  • List saved entries

Phase 2 β€” Vault

  • Search passwords
  • Delete passwords
  • Export passwords
  • Load existing key automatically
  • Better data structure

Phase 3 β€” Security

  • Master password
  • Better key management
  • Vault locking
  • Failed attempt protection
  • Security tests
  • Threat model

Phase 4 β€” Database

  • SQLite
  • Database models
  • Encrypted database fields
  • Data validation
  • Database migrations

Phase 5 β€” API

  • Local API
  • FastAPI
  • Authentication
  • API documentation

Phase 6 β€” Interface

  • Web interface
  • Vault dashboard
  • Password manager UI
  • API integration

Phase 7 β€” Open Source

  • Complete documentation
  • Automated tests
  • CI/CD
  • Security review
  • PyPI package

πŸ“š Development Story

PyVault isn't only a software project.

I also want to document the process of building it.

The documentation will cover:

Idea

  ↓

First prototype

  ↓

Encryption

  ↓

Problems

  ↓

Research

  ↓

Solutions

  ↓

Security

  ↓

Testing

  ↓

Benchmarking

  ↓

Final application

The objective is to show what I learned, what went wrong and how the project evolved over time.


πŸ§ͺ Status

Current version: 0.2.0-dev

PyVault is currently an experimental project.

The project is actively being developed and its architecture may change significantly.


🀝 Contributing

Contributions, suggestions and bug reports are welcome.

If you find a problem, feel free to open an issue.

For larger changes, please open an issue first to discuss the idea.


πŸ“„ License

PyVault is released under the MIT License.

See LICENSE for more information.


πŸ‘€ Author

xql

GitHub: https://github.com/KirobotDev


Built with Python 🐍

Learning by building.

Releases

Packages

Contributors

Languages