Unidac Uniquery шифрование

Обсуждение возникших проблем, предложений и ошибок UniDAC компонентов
Ответить
h9ko
Сообщения: 3
Зарегистрирован: Ср 06 мар 2019 11:24

Unidac Uniquery шифрование

Сообщение h9ko » Ср 06 мар 2019 11:41

Доброе время суток,
Указал в UniEncriptor поле шифрования DateMoment и пароль занес данные через Unitable c привязанным UniEncriptor.
Данные в базе зашифрованы в DBGrid все в расшифрованном виде все хорошо.
При использовании UniQuery1+DBGrid запрос ниже возвращает данные в зашифрованном виде

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

 UnicodeString sz = "SELECT * FROM OPER ";

	  UniQuery1->SQL->Clear();
	  UniQuery1->SQL->Add(sz);
	  UniQuery1->DataTypeMap->AddFieldNameRule ("DateMoment", ftString);
	  UniQuery1->Open();
При использовании UniQuery1+DBGrid запрос ниже не возвращает данные

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

 UnicodeString sz = "SELECT * FROM OPER WHERE DateMoment = '2021-03-05 00:00:00'";

	  UniQuery1->SQL->Clear();
	  UniQuery1->SQL->Add(sz);
	  UniQuery1->DataTypeMap->AddFieldNameRule ("DateMoment", ftString);
	  UniQuery1->Open();
Как делать запрос в Uniqery к зашифрованным столбцам чтобы можно было потом через методы ниже их изменять?

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

 if (!UniQuery1->IsEmpty())
	 {
	  UniQuery1->Edit();
	  UniQuery1->FieldByName("DateMoment")->AsString =  "2020-03-05 00:00:00";
	   UniQuery1->Post();
	 }else
	 {
	   UniQuery1->Insert();
	   UniQuery1->FieldByName("DateMoment")->AsString =  "2021-03-05 00:00:00";
	   UniQuery1->Post();
	  }  

h9ko
Сообщения: 3
Зарегистрирован: Ср 06 мар 2019 11:24

Re: Unidac Uniquery шифрование

Сообщение h9ko » Ср 06 мар 2019 21:51

И еще странное поведение использую пример из справки https://www.devart.com/unidac/docs/encryption.htm
при UniEncryptor->DataHeader=ehTag; или UniEncryptor->DataHeader=ehTagAndHash;
при вводе/выводе данных через подключенный UniTable данные шифруются/дешифруются
как пример настройки :
UniEncryptor->DataHeader=ehTagAndHash;
UniEncryptor->EncryptionAlgorithm=ehBlowfish;
UniEncryptor->HashAlgorithm=haSHA1;
UniEncryptor->InvalidHashAction=ihFail;
UniEncryptor->Password= 12345;
UniTable->Encryption->Fields= "ENAME, HIREDATE, SAL, FOTO";
в Unitable ввожу в поле "ENAME" Hello world в бд отображается:

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

C544E5292C9C42A5B94FE279127029012B0D67570773EDDD92CBDF2B5F4D4AE98356CB8B9D1DFF96BBF0B9924A57C30458C978399BA81A1BB6DE0B08E16C2580A5F660C91B618A341A7E503CD014247C
Если средствами бд внесу изменение в последнем символе например на

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

C544E5292C9C42A5B94FE279127029012B0D67570773EDDD92CBDF2B5F4D4AE98356CB8B9D1DFF96BBF0B9924A57C30458C978399BA81A1BB6DE0B08E16C2580A5F660C91B618A341A7E503CD014247F
При обновление UniTable выдастся ошибка "Encrypted data is corrupt - Invalid hash"
Если средствами бд внесу

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

Hello world
При обновление UniTable он не выдаст никаких ошибок и выдаст Hello world.
в чем подвох? Пробовал разные варианты UniEncryptor->InvalidHashAction, всегда аналогичное поведение
При использовании UniEncryptor->DataHeader=ehNone; хотя бы искажаются данные, но ошибок никаких

ViktorV
Devart Team
Сообщения: 199
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Unidac Uniquery шифрование

Сообщение ViktorV » Ср 13 мар 2019 14:21

h9ko писал(а):
Ср 06 мар 2019 11:41
Доброе время суток,
Указал в UniEncriptor поле шифрования DateMoment и пароль занес данные через Unitable c привязанным UniEncriptor.
Данные в базе зашифрованы в DBGrid все в расшифрованном виде все хорошо.
При использовании UniQuery1+DBGrid запрос ниже возвращает данные в зашифрованном виде

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

 UnicodeString sz = "SELECT * FROM OPER ";

	  UniQuery1->SQL->Clear();
	  UniQuery1->SQL->Add(sz);
	  UniQuery1->DataTypeMap->AddFieldNameRule ("DateMoment", ftString);
	  UniQuery1->Open();
При использовании UniQuery1+DBGrid запрос ниже не возвращает данные

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

 UnicodeString sz = "SELECT * FROM OPER WHERE DateMoment = '2021-03-05 00:00:00'";

	  UniQuery1->SQL->Clear();
	  UniQuery1->SQL->Add(sz);
	  UniQuery1->DataTypeMap->AddFieldNameRule ("DateMoment", ftString);
	  UniQuery1->Open();
Как делать запрос в Uniqery к зашифрованным столбцам чтобы можно было потом через методы ниже их изменять?

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

 if (!UniQuery1->IsEmpty())
	 {
	  UniQuery1->Edit();
	  UniQuery1->FieldByName("DateMoment")->AsString =  "2020-03-05 00:00:00";
	   UniQuery1->Post();
	 }else
	 {
	   UniQuery1->Insert();
	   UniQuery1->FieldByName("DateMoment")->AsString =  "2021-03-05 00:00:00";
	   UniQuery1->Post();
	  }  
При использовании запроса SELECT * FROM OPER WHERE DateMoment = '2021-03-05 00:00:00' UniDAC отправляет SELECT запрос как есть, без преобразования, а на сервере данные находятся в зашифрованном виде. Поэтому, вы получаете пустой рекордсет при выполнении указанного запроса. При использовании UniDAC Data Encryption вам следует использовать SELECT запрос без использования WHERE, тогда вы сможете использовать методы Edit .. Post для изменения данных.

ViktorV
Devart Team
Сообщения: 199
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Unidac Uniquery шифрование

Сообщение ViktorV » Ср 13 мар 2019 14:24

h9ko писал(а):
Ср 06 мар 2019 21:51
И еще странное поведение использую пример из справки https://www.devart.com/unidac/docs/encryption.htm
при UniEncryptor->DataHeader=ehTag; или UniEncryptor->DataHeader=ehTagAndHash;
при вводе/выводе данных через подключенный UniTable данные шифруются/дешифруются
как пример настройки :
UniEncryptor->DataHeader=ehTagAndHash;
UniEncryptor->EncryptionAlgorithm=ehBlowfish;
UniEncryptor->HashAlgorithm=haSHA1;
UniEncryptor->InvalidHashAction=ihFail;
UniEncryptor->Password= 12345;
UniTable->Encryption->Fields= "ENAME, HIREDATE, SAL, FOTO";
в Unitable ввожу в поле "ENAME" Hello world в бд отображается:

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

C544E5292C9C42A5B94FE279127029012B0D67570773EDDD92CBDF2B5F4D4AE98356CB8B9D1DFF96BBF0B9924A57C30458C978399BA81A1BB6DE0B08E16C2580A5F660C91B618A341A7E503CD014247C
Если средствами бд внесу изменение в последнем символе например на

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

C544E5292C9C42A5B94FE279127029012B0D67570773EDDD92CBDF2B5F4D4AE98356CB8B9D1DFF96BBF0B9924A57C30458C978399BA81A1BB6DE0B08E16C2580A5F660C91B618A341A7E503CD014247F
При обновление UniTable выдастся ошибка "Encrypted data is corrupt - Invalid hash"
Если средствами бд внесу

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

Hello world
При обновление UniTable он не выдаст никаких ошибок и выдаст Hello world.
в чем подвох? Пробовал разные варианты UniEncryptor->InvalidHashAction, всегда аналогичное поведение
При использовании UniEncryptor->DataHeader=ehNone; хотя бы искажаются данные, но ошибок никаких
Для хранения зашифрованной информации мы сохраняем, кроме самих данных, дополнительную информацию: the GUID and the hash, когда DataHeader установлено в ehTagAndHash или ehTag. В данном случае, мы пытаемся вычитать GUID, а затем hash, так как вы изменили последний символ, hash измениться и вы получите указанную вами ошибку. В случае записи "Hello world" напрямую, мы пытаемся вычитать GUID и, если это не получиться выводим содержимое поля без попытки дешифрования.

h9ko
Сообщения: 3
Зарегистрирован: Ср 06 мар 2019 11:24

Re: Unidac Uniquery шифрование

Сообщение h9ko » Ср 13 мар 2019 17:03

В случае записи "Hello world" напрямую, мы пытаемся вычитать GUID и, если это не получиться выводим содержимое поля без попытки дешифрования.

Можно как то отловить событие, что не получилось и данные выводятся без попытки дешифрования? Или установить чтобы в данном случае данные не выводились? Цель моего использования шифрования была защита от преднамеренных изменений данных
При использовании запроса SELECT * FROM OPER WHERE DateMoment = '2021-03-05 00:00:00' UniDAC отправляет SELECT запрос как есть, без преобразования, а на сервере данные находятся в зашифрованном виде. Поэтому, вы получаете пустой рекордсет при выполнении указанного запроса. При использовании UniDAC Data Encryption вам следует использовать SELECT запрос без использования WHERE, тогда вы сможете использовать методы Edit .. Post для изменения данных.
То есть у меня нет вариантов выборки необходимой строки, кроме как полного запроса SELECT * FROM OPER , даже если содержится 10000 строк? Может есть какой то оптимальный вариант?

ViktorV
Devart Team
Сообщения: 199
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Unidac Uniquery шифрование

Сообщение ViktorV » Пт 15 мар 2019 15:10

На данный момент UniDAC не поддерживает возможность отловить событие, что данные выводятся без попытки дешифрования и не поддерживает шифрование параметров.
Если Вы хотите, чтобы мы добавили указанную вами функциональность, пожалуйста, напишите об этом на нашем User Voice форуме: https://devart.uservoice.com/forums/104 ... components. Если Ваше предложение наберет достаточно голосов, мы рассмотрим возможность его создания.

Ответить