Собираем
информацию
по крупицам
Проекты / Код

Qt

Описание системы шифрования в MyTetra
30-01-2019
12:42:34

Используемые библиотеки

 

В MyTetra, для шифрования, используется открытая библиотека RC5-Simple.

 

https://webhamster.ru/site/page/index/articles/projectcode/157

 

В Qt-проекте ее файлы просто кладутся в нужную директорию проекта:

 

 

/app/src/libraries/crypt/RC5Simple.cpp

/app/src/libraries/crypt/RC5Simple.h

 

 

Данная библиотека обеспечивает шифрование по схеме RC5-32/12/16 c CBC-режимом сцепления.

 

Еще используется реализация алгоритма хеширования Pbkdf2 для хорошего перемешивания бит пароля и сильного замедления перебора. Файлы Pbkdf2Qt.cpp/Pbkdf2Qt.h лежат в том же каталоге.

 

 

Установка пароля

 

Когда происходит шифрование ветки, если до этого пароль еще не устанавливался, происходит следующее:

 

1. Запрашивается пароль для шифрования и подтверждение этого пароля. Пароль и подтверждение должны совпадать.

 

2. В каталоге базы знаний, рядом с mytetra.xml имеется файл database.ini, и в нем выставляется параметр:

 

 

crypt_mode=1

 

 

3. Для того, чтобы в последствии не пытаться расшифровывать данные из базы данных с помощью неправильного пароля, в файле database.ini, заполняются два параметра:

 

 

crypt_check_salt

crypt_check_hash

 

 

Эти данные могут находиться в открытом виде, и они позволяют только проверить пароль, но не раскрывают сам пароль. Соль crypt_check_salt и хеш crypt_check_hash не используются при формировании ключа шифрования данных, они используется только для проверки пароля.

 

То есть, когда пользователь в следующих сеансах вводит пароль, то берутся символы пароля и берется соль из crypt_check_salt, на основе этих данных высчитывается хеш и сравнивается с crypt_check_hash. Если эти хеши совпадают, значит пароль введен правильно.

 

Поэтому, после того как пользователь ввел новый пароль шифрования:

 

1) Вычисляется 256-битная (т.е. 32 байта) случайная соль (проверочная соль).

 

2) Вычисляется хеш пароля с солью (проверочный хеш) через алгоритм Pbkdif2. На вход этому алгоритму подаются:

 

  • символы пароля в кодировке UTF8
  • 256 байт соли
  • количество раундов 1000
  • итоговая длинна хеша 160 байт

 

3) 32 байта соли записывается в параметр crypt_check_salt

 

4) 160 байт вычисленного Pbkdif2 хеша записывается в параметр crypt_check_hash

 

Следует обратить внимание, что при формировании этих данных, используемых впоследствии для проверки правильности ввода пароля, библиотека RC5Simple не применяется.

 

 

Механизм запоминания пароля

 

В файле database.ini имеется еще один параметр:

 

 

middle_hash_check_data

 

 

Для чего он нужен? В MyTetra есть возможность "запомнить пароль", чтобы не вводить пароль при каждом запуске программы. Это небезопасная возможность, и пользователя об этом предупреждают. Данный параметр используется для проверки "запомненного пароля".

 

Фраза "запомнить пароль" не просто так взята в кавычки. На самом деле, запоминается не пароль, а Pbkdf2 хеш пароля, и запоминается этот хеш в файле конфигурации программы conf.ini, а не в файле конфигурации базы данных database.ini. (Поэтому при синхронизации через открытые хостинги надо синхронизировать только каталог /data, в котором лежат database.ini и mytetra xml, но не каталог выше). Этот хеш пароля записывается в параметр

 

 

passwordMiddleHash

 

 

файла conf.ini. Кроме того, в этом же файле параметр passwordSaveFlag устанавливается в истину:

 

 

passwordSaveFlag=true

 

 

Если похитить файл conf.ini у пользователя, который включил опцию "запомнить пароль", то его данные можно будет расшифровать. Единственное что невозможно будет сделать - это узнать сам пароль, потому что хранится не сам пароль а его хеш. Это страхует пользователя от того, что если он использует такой же пароль для других сервисов, то хотя бы доступ к этим сервисам не будет скомпрометирован.

 

Хеш для параметра passwordMiddleHash высчитывается следующим образом:

 

  • Берутся символы пароля в кодировке UTF8
  • Берется стандартная соль в виде байтового представления UTF-8 строки "^1*My2$Tetra3%_4[5]"
  • количество раундов 1000
  • итоговая длинна хеша 160 байт

 

Эти данные скармливаются алгоритму Pbkdf2.

 

Далее в параметр middle_hash_check_data файла database.ini записывается заранее известная строка "This string is used for checking middle hash", зашифрованная с использованием хеша passwordMiddleHash. Схему шифрации см. ниже.

 

Для использования "запомненного пароля", берется значение хеша passwordMiddleHash из файла conf.ini, на его основе создается ключ шифрования, с помощью него расшифровываются байты из параметра middle_hash_check_data файла database.ini. Если полученная строка совпадает с заранее известной строкой, то значит "запомненный пароль" (а на деле запомненный хеш пароля) правильный. Эта проверка нужна для сохранения консистенции между данными в базе и "запомненным паролем" (т. е. хешем пароля), сохраненном в conf.ini.

 

 

Схема шифрования

 

Шифрация/дешифрация данных происходит с помощью библиотеки RC5Simple. В ней поддерживаются ключи шифрования длинной 128-бит. Для получения ключа шифрования, вышеописанный Pbkdf2 хеш пароля пропускаются через алгоритм MD5.

 

Библиотека RC5Simple реализует шифрацию отдельных строк и файлов. Данная библиотека обеспечивает наличие в каждом зашифрованном элементе уникального инициализирующего вектора длинной 8 байт. Поэтому нет необходимости отдельно вычислять соль в момент шифрования. На шифрацию передается только ключ шифрования, полученный из пароля, и сами шифруемые данные.

 

Фомат хранения зашифрованных данных представлен на странице проекта RC5Simple:

 

https://webhamster.ru/db/data/articles/157/format_3_ru_580.png

 

Следует обратить внимание, что в файлах конфигурации предусмотрено версионирование, поэтому имеется возможность со временем изменить схему шифрования на более криптостойкую.

 

 



К списку проектов

Интересное на сайте


Скейтбординг » Самодельный слаломный скейт. Часть 5: Доска в сборе

Итак, чудом найдя все компоненты, я собрал свой скейт. Доска получилась крепкая и очень удобная. Дека жесткая, не "гуляет". Оказалось, что я зря беспо...


Qt » Нагрузочное тестирование MyTetra 1.42 на 100 000 записей

Введение   Пользователи MyTetra задают мне один и тот же вопрос: насколько много данных можно хранить в MyTetra, и как быстро она будет работать ...


Web - разработка » Первичная настройка TinyMCE. Маленькие хитрости.

Разобъем настройку TinyMCE на несколько шагов. Обычно нужно сделать следующее:   Добиться, чтобы текст внутри редактора TinyMCE отбражался согла...

RSS подписка

Подпишитесь на новости сайта по RSS

Поделиться этой страницей


Статистика



Внимание!


На этом сайте разрабатывается программа MyTetra и её родственные проекты. Доступны к просмотру следующие базы знаний:

 

База Xintrea (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)

База Rarrugas (1, 2)

База Balas

База YellowRaven

База Yurons

База Lesnik757

База Shandor

База Sirrichar

База Anatolean

База Аrmagedec

База SorokinRed

База Deadelf79

База Adgaver (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

База Pipitos1983

База Soxsten

База Silenn

База Shlyapnikova - херомантия и ригидность

База Svoynickname

База Larson227

База Velonski

База BrokeRU

База Mcold

 

Требуют доработки:

 

База Tairesh

База Ivnglkv

База Kolyag87

База Andyk101

База Garik456456

База Harpokrat

База SalexIzyh

База Duwaz

База RuDennn

База Manakaden

База Vitvrn

База Fanrok

 

Подробности на странице MyTetra Share.

 WebHamster.Ru
 Домик любопытного хомячка
Яндекс индекс цитирования
Почтовый ящик