Metadata-Version: 2.4
Name: fraza
Version: 0.1.0
Summary: Simple password generator using passphrase in Russian
Author-email: ADspecial <is@dlekontsev.ru>
License: MIT
Project-URL: Homepage, https://github.com/ADspecial/fraza.git
Classifier: Programming Language :: Python :: 3
Classifier: Operating System :: OS Independent
Requires-Python: >=3.8
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: pymorphy2>=0.9.1
Requires-Dist: pyperclip>=1.9.0
Requires-Dist: pyzipper>=0.3.6
Requires-Dist: qrcode-terminal>=0.8
Requires-Dist: zxcvbn>=4.5.0
Requires-Dist: importlib_resources>=5.0
Dynamic: license-file

# fraza

Simple password generator using passphrase in Russian
![preview](media/preview.png)

### Правила формирования пароля:

- Пароль создается на основе **парольной фразы** на русском языке;
- Беруться первые несколько букв из каждого слова в парольной фразе;
- Пароль набирается в ангийской раскладке клавиатуры;
- Дополнительно могут добавлятся числа, спецсимволы, разные регистры.

Идея правил генерации была вдохновлена парольным генератором в продуктах ViPNet.

### Правила генерации парольной фразы:

`password phrase = (attribute)+ subject + (adverbial) + predicate + object`

где:

- subject - подлежащее;
- object - дополнение;
- predicate - сказуемое;
- attribute - определение;
- adverbial - обстоятельство.

Парольная фраза генерируется случайно на основе размеченного [словаря](tagged_words_full.json). Пример структуры словаря представлена ниже:

```
{
  "subject": [
    {
      "word": "цезарь",
      "normal_form": "цезарь",
      "pos": "NOUN",
      "gender": "masc",
      "number": "sing",
      "case": "nomn",
      "inflections": {
        "(nomn, sing, masc)": "цезарь",
        "(accs, sing, masc)": "цезаря",
        ...
      }
    }
  ],
  ...
}
```

**Замечание** - морфологическая связность в фразах не полная. Фразы зачастую генерируются не складно. Например: Конституционного Ларина Повсеместно Нахмурился Имущество.

### Аргументы

```
usage: __main__.py [-h] [-d {1,2,3,simple,standart,complex}] [-w WORD] [-l LETTER] [-n] [-c] [--wc] [-p PASSWORDS] [-a] [-f FILE] [--cp] [--cpall] [--qr] [--sec SEC] [--no-color]

Генератор паролей на основе фраз

optional arguments:
  -h, --help            show this help message and exit
  -d {1,2,3,simple,standart,complex}, --difficulty {1,2,3,simple,standart,complex}
                        Уровень сложности пароля (1|simple, 2|standart, 3|complex)
  -w WORD, --word WORD  Количество слов во фразе (max = 5)
  -l LETTER, --letter LETTER
                        Количество букв из каждого слова (max = 4)
  -n, --number          Добавить числовой префикс (10-99)
  -c, --capitalized     Использовать заглавные буквы в начале слов
  --wc, --wildcard      Использовать спецсимволы в пароле, разграничители между словами в парольной фразе по очереди (!, @, #, $)
  -p PASSWORDS, --passwords PASSWORDS
                        Количество паролей для генерации
  -a, --analyze         Показать анализ сложности
  -f FILE, --file FILE  Путь к файлу сохранения сгенерированных паролей
  --cp, --copy          Скопировать сгенерированные пароли в буфер обмена
  --cpall, --copyall    Скопировать весь вывод в буфер обмена
  --qr                  Вывести QR-код сгенерированных паролей
  --sec SEC             Сохранить сгенерированные пароли в зашифрованный ZIP-файл. Пароль от файла сохраняется в буфер обмена. Нужно указать путь к файлу
  --no-color            Отключить цветовую подсветку вывода
```

По умолчанию генерация одного **simple** пароля.

Генерация паролей трех уровней:
| Уровень | Слова | Буквы | Число | Заглавные | Спецсимволы |
| -------- | ----- | ----- | ----- | --------- | ----------- |
| simple | 4 | 3 | Нет | Нет | Нет |
| standart | 4 | 4 | Да | Да | Нет |
| complex | 5 | 4 | Да | Да | Да |

### Примеры использования

```
> pyhton -m fraza
дверной обком здравствовал контакт -> ldtj,rplhrjy

> pyhton -m fraza -d 3 -p 5 -a
75 Индустриальный Василий Политически Напрягал Багаж -> 75Byle!Dfcb@Gjkb#Yfgh$,fuf | Entropy bits: 85.27, Crack time: centuries
91 Наидлиннейшее Слияние Любезно Разделось Домик     -> 91Yfbl!Ckbz@K.,t#Hfpl$Ljvb | Entropy bits: 86.37, Crack time: centuries
84 Ловкий Привод Аналогично Отсутствовал Неприязнь   -> 84Kjdr!Ghbd@Fyfk#Jnce$Ytgh | Entropy bits: 86.37, Crack time: centuries
76 Некрасивейшее Ружье Налицо Прошло Арест           -> 76Ytrh!He;m@Yfkb#Ghji$Fhtc | Entropy bits: 86.37, Crack time: centuries
77 Согласный Посреди Совместно Изложил Раздел        -> 77Cjuk!Gjch@Cjdv#Bpkj$Hfpl | Entropy bits: 86.37, Crack time: centuries

> pyhton -m fraza -w 5 -l 3 -c -n --wc -a
86 Огненная Смертность Глубоко Оценила Госпиталь -> 86Juy!Cvt@Uke#Jwt$Ujc | Entropy bits: 69.76, Crack time: centuries
```

![Пример вывода в терминале](media/image_1.png)

![alt text](media/image_2.png)

### Оценка сложности пароля

Сложность пароля проверяется с помощью библиотеки [zxcvbn](https://github.com/dropbox/zxcvbn.git).
Энтропия рассчитывается по формуле: `Энтропия (бит) = log₂(guesses)`
Где `guesses` — примерное число попыток подбора.
Энтропия показывает, сколько бит информации содержит пароль с точки зрения сложности перебора — чем выше, тем безопаснее.
| Энтропия (бит) | Примерный уровень безопасности |
| -------------- | --------------------------------------- |
| 20–40 | Слабый |
| 40–60 | Средний |
| 60–80 | Хороший |
| 80+ | Отличный |

Оценка времени взлома берётся из параметра `offline_fast_hashing_1e10_per_second` — оффлайн-атака с быстрым хэшированием, предполагающая 10 миллиардов попыток в секунду.

### Установка

1. Обновление и установка необходимых инструментов:

```
sudo apt update
sudo apt install git python3 python3-pip
```

2. Установка пакета Fraza:

```
pip3 install --user ADspecial/fraza
```

3. Запуск приложения в терминале командой:

```
fraza
```

**Дополнительно** можно сформировать свой словарь с помощью скрипта [gendict.py](gendict.py):

```
python gendict.py [путь_до_списка_слов.txt]
```

### Что стоит сделать

проблема: медленная генерация большого количества паролей

использование параллелизма
При генерации большого количества паролей сделать --no-color
Ограничение количества генерации паролей при выводе в консоль (max = 100)
При сохранении в файл (max = 10000)
При использовании QR (max = 20)
