Архиватор паролей с CLI-интерфейсом

Архиватор паролей с 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

Report Page