TMyEncryptor

Обсуждение возникших проблем, предложений и ошибок MyDAC компонентов
Закрыто
imobile
Сообщения: 103
Зарегистрирован: Сб 12 ноя 2011 00:12

TMyEncryptor

Сообщение imobile » Вт 05 фев 2013 07:01

Здравствуйте.
Решил зашифровать БД.
Но не всю, а лишь отдельные строки(не столбцы).Я так понял, что основная реализация компонента- шифрование столбцов.
Нашел свойство Encript, а что туда писать не понял.Первое адрес буфера,второе тип данных, последнее длина.Какие типы данных бывают, я не нашел в документации?Хороший компонент, но хорошо бы иметь примерчик на С++.Мне надо зашифровать UnicodeString перед сохранением в БД.

DemetrionQ
Devart Team
Сообщения: 51
Зарегистрирован: Пн 28 янв 2013 11:54

Re: TMyEncryptor

Сообщение DemetrionQ » Чт 07 фев 2013 13:55

Здравствуйте.

Метод TMyEncryptor.Encrypt применяется для внутренних нужд компонентов. Вызывать его на прямую нет необходимости. TMyEncryptor следует использовать в связке с TMyQuery или TMyTable.

Суть работы компонента TMyEncryptor заключается в следующем. Когда вы изменяете данные через TMyQuery или TMyTable с помощью Insert/Edit/Post , то подключённый компонент TMyEncryptor будет шифровать заданные поля только для текущей редактируемой записи. Аналогично, этот компонент будет расшифровывать данные в этих полях при открытии датасета. Перечень полей для шифрования можно задавать в свойстве TMyQuery.Encryption.Fields. Однако заметьте, не все типы данных можно шифровать. Более подробную информацию о применении TMyEncryptor вы можете найти в статье "Data Encryption" в справке по MyDAC.

imobile
Сообщения: 103
Зарегистрирован: Сб 12 ноя 2011 00:12

Re: TMyEncryptor

Сообщение imobile » Вс 10 фев 2013 09:46

Не всегда хватает производительности компьютера для такого решения. Иногда достаточно шифровать самое важное. Мне всего лишь надо знать, какие типы данных нужно передавать во втором параметре и что(где) на выходе.

DemetrionQ
Devart Team
Сообщения: 51
Зарегистрирован: Пн 28 янв 2013 11:54

Re: TMyEncryptor

Сообщение DemetrionQ » Пн 11 фев 2013 10:47

Здравствуйте.

В следующих версиях MyDAC метод Encrypt будет скрыт.
Однако, мы рассматриваем возможность создания целенаправленных компонентов для шифрования данных.

imobile
Сообщения: 103
Зарегистрирован: Сб 12 ноя 2011 00:12

Re: TMyEncryptor

Сообщение imobile » Ср 13 фев 2013 06:42

Жаль.
Нашел решение DCPCrypt.

imobile
Сообщения: 103
Зарегистрирован: Сб 12 ноя 2011 00:12

Re: TMyEncryptor

Сообщение imobile » Ср 20 фев 2013 15:53

DemetrionQ писал(а):Здравствуйте.

Метод TMyEncryptor.Encrypt применяется для внутренних нужд компонентов. Вызывать его на прямую нет необходимости. TMyEncryptor следует использовать в связке с TMyQuery или TMyTable.

Суть работы компонента TMyEncryptor заключается в следующем. Когда вы изменяете данные через TMyQuery или TMyTable с помощью Insert/Edit/Post , то подключённый компонент TMyEncryptor будет шифровать заданные поля только для текущей редактируемой записи. Аналогично, этот компонент будет расшифровывать данные в этих полях при открытии датасета. Перечень полей для шифрования можно задавать в свойстве TMyQuery.Encryption.Fields. Однако заметьте, не все типы данных можно шифровать. Более подробную информацию о применении TMyEncryptor вы можете найти в статье "Data Encryption" в справке по MyDAC.
У меня так не работает.
Кидаю mytable myencryptor в mytable прописываю encriptor кодирование аес256
Таблица с полями: автоинкремент ид беззнаковое инт, уникальное варчар, и техт
Пишу

Код: Выделить всё

MyTable1->Append();
MyTable1->FieldByName("CO_NAME")->AsString="pass";
MyTable1->FieldByName("CO_PASS")->AsString="password";
MyTable1->Post();
Когда вызывается post появляется ошибка, дублирование данных, без пост донные не появляются. Можно пример правильного использования tmyencriptor?

DemetrionQ
Devart Team
Сообщения: 51
Зарегистрирован: Пн 28 янв 2013 11:54

Re: TMyEncryptor

Сообщение DemetrionQ » Чт 21 фев 2013 12:53

Здравствуйте.

Пример использования TMyEncryptor :

Код: Выделить всё

	MyTable1->Encryption->Fields="CO_PASS";
	MyTable1->Encryption->Encryptor->Password=1234;
	MyTable1->Open();
	MyTable1->Append();
	MyTable1->FieldByName("CO_NAME")->AsString="pass";
	MyTable1->FieldByName("CO_PASS")->AsString="password";
	MyTable1->Post();
В базе данных поле CO_PASS будет зашифровано, но через MyTable1 оно будет выглядеть расшифрованным, так как к MyTable1 подключён настроенный TMyEncryptor.

Ошибка "дублирование данных" может возникать из-за того, что вы пытаетесь добавить запись с не уникальным значением в поле CO_NAME (которое в вашей таблице создано как UNIQUE).

imobile
Сообщения: 103
Зарегистрирован: Сб 12 ноя 2011 00:12

Re: TMyEncryptor

Сообщение imobile » Пт 15 мар 2013 15:15

Все работает, только размеры полей надо больше делать, как расчитать размер?

DemetrionQ
Devart Team
Сообщения: 51
Зарегистрирован: Пн 28 янв 2013 11:54

Re: TMyEncryptor

Сообщение DemetrionQ » Ср 20 мар 2013 14:27

Здравствуйте.

Если TMyEncryptor.DataHeader равен ehTagAndHash или ehTag, то длину результирующих данных можно рассчитать по следующей формуле:
ResultLength = (GUIDLength + IVLength + CipherLength) * SymbolSize;
CipherLength = (((8 + DataLength + HashLength) / BlockSize) + 1) * BlockSize;
где
GUIDLength = 16;
IVLength = 8;
DataLength - длина исходных данных;
HashLen - длина хэша, 16 байт для алгоритма MD5 и 20 байт для SHA1, добавляется к результату если TMyEncryptor.DataHeader = ehTagAndHash;
BlockSize - размер блока используемого алгоритма шифрования;
SymbolSize = 2, если данные на сервере хранятся в строковом поле (так как данные дополнительно конвертируются в HEX-строку), = 1 для бинарных полей.

Если TMyEncryptor.DataHeader равен ehNone, то длина результирующих зашифрованных данных равна длине нешифрованных данных.

Закрыто