Собираем
информацию
по крупицам

RSS подписка

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

Проекты / Код

MyTetra

Описание системы шифрования в 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) Вычисляется хеш пароля с солью (проверочный хеш) через алгоритм Pbkdf2. На вход этому алгоритму подаются:

 

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

 

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

 

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

 

Другими словами, в параметрах crypt_check_salt и crypt_check_hash сохраняются такие же данные, которые хранятся в базах данных на WEB-форумах о пользователях и их паролях. Отличие в том, что в данном случае хранится только одна "запись БД" - для пользователя MyTetra. Попадание таких данных в открытый доступ совершенно некритично. Хранение хеша пароля не раскрывает сам пароль. Хранимая в данном месте соль используется только для процедуры проверки правильности ввода пароля, и нигде больше.

 

Следует обратить внимание, что при формировании этих данных, используемых впоследствии для проверки правильности ввода пароля, библиотека 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

 

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

 

 



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

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



Внимание!


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

 

База Xintrea (стр. 1)

База Rarrugas (стр. 1)

База Balas

База YellowRaven

База Yurons

База Lesnik757

База Shandor

База Sirrichar

База Anatolean (стр. 1)

База Аrmagedec

База SorokinRed

База Deadelf79

База Adgaver (стр. 1)

База Pipitos1983

База Soxsten (стр. 1)

База Silenn (стр. 1)

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

База Svoynickname (стр. 1)

База Larson227 (стр. 1)

База Velonski (стр. 1)

База BrokeRU (стр. 1)

База Mcold (стр. 1)

База Alensav (стр. 1)

База Consp11 (стр. 1)

База Kozlov-AE (стр. 1)

База Wwwlir (стр. 1)

База Duwaz (стр. 1)

 

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

 

База Tairesh

База Ivnglkv

База Kolyag87

База Andyk101

База Garik456456

База Harpokrat

База SalexIzyh

База RuDennn (Bunny-Hop)

База Manakaden

База Vitvrn

База Fanrok

База Grimar

База_Juryak

База Nicolasomsk

База Azatserikbaev

База Shut913

 

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

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