Архиватор паролей с CLI-интерфейсом
pip install cryptography click
import click
import json
from cryptography.fernet import Fernet
import os
KEY_FILE = 'key.key'
DB_FILE = 'vault.enc'
# Генерация ключа (однократно)
def generate_key():
key = Fernet.generate_key()
with open(KEY_FILE, 'wb') as f:
f.write(key)
# Получение ключа
def load_key():
if not os.path.exists(KEY_FILE):
generate_key()
with open(KEY_FILE, 'rb') as f:
return f.read()
fernet = Fernet(load_key())
# Загрузка базы
def load_db():
if not os.path.exists(DB_FILE):
return {}
with open(DB_FILE, 'rb') as f:
data = fernet.decrypt(f.read())
return json.loads(data)
# Сохранение базы
def save_db(data):
encrypted = fernet.encrypt(json.dumps(data).encode())
with open(DB_FILE, 'wb') as f:
f.write(encrypted)
@click.group()
def cli():
"""🔐 Простое хранилище паролей"""
pass
@cli.command()
@click.option('--site', prompt='Сайт')
@click.option('--login', prompt='Логин')
@click.option('--password', prompt='Пароль', hide_input=True)
def add(site, login, password):
"""Добавить новую запись"""
db = load_db()
db[site] = {"login": login, "password": password}
save_db(db)
click.echo(f"✅ Добавлено: {site}")
@cli.command()
@click.option('--site', prompt='Сайт')
def get(site):
"""Получить логин и пароль"""
db = load_db()
if site in db:
click.echo(f"🔎 Логин: {db[site]['login']}")
click.echo(f"🔐 Пароль: {db[site]['password']}")
else:
click.echo("❌ Не найдено")
@cli.command()
@click.option('--site', prompt='Сайт')
def delete(site):
"""Удалить сайт из базы"""
db = load_db()
if site in db:
del db[site]
save_db(db)
click.echo(f"🗑️ Удалено: {site}")
else:
click.echo("❌ Не найдено")
@cli.command()
def list():
"""Показать все сайты"""
db = load_db()
if db:
click.echo("🌐 Сайты:")
for s in db:
click.echo(f"- {s}")
else:
click.echo("📭 Пусто")
if __name__ == "__main__":
cli()
# Пример использования
python vault.py add
python vault.py get
python vault.py delete
python vault.py list