Сегодня на работе попробовал новую версию IBDac - 4.2.7 с нужной мне функцией шифрования данных. Прочитал справку с примером шифрования, также нашел топик, где человек просит объяснить, как работает шифрование данных (http://forums.devart.com/viewtopic.php?f=28&t=24452). Там есть код (хотя он и относится к UniDac, я думаю, что в IBDac будет тоже самое):
Код: Выделить всё
UniQuery.SQL.Text := 'SELECT * FROM EMP';
UniQuery.Encryption.Encryptor := UniEncryptor;
UniQuery.Encryption.Fields := 'ENAME, SAL, FOTO';
UniEncryptor.Password := '11111';
UniQuery.DataTypeMap.AddFieldNameRule ('ENAME', ftString);
UniQuery.DataTypeMap.AddFieldNameRule ('SAL', ftFloat);
UniQuery.Open;
TCREncryptor supports encryption of string or binary fields only (ftString, ftWideString, ftBytes, ftVarBytes, ftBlob, ftMemo, ftWideMemo).
--
Therefore, to have the possibility to encrypt other data types (such as date, number, etc.), it is necessary to create a field of the binary or BLOB type in the table, and then convert it into the desired type on the client side with the help of data mapping.
Т.е. TCREncryptor поддерживает шифрование для строковых либо двоичных полей. Для остальных используйте Data Type Mapping.
1. Подскажите пожалуйста, обязательно ли использовать Data Type Mapping, как написано в коде:
Код: Выделить всё
...
ENAME VARCHAR(2000) CHARACTER SET OCTETS COLLATE OCTETS
...
Код: Выделить всё
...
UniQuery.DataTypeMap.AddFieldNameRule ('ENAME', ftString);
...
2. CHARACTER SET OCTETS COLLATE OCTETS указаны просто для того, чтобы сервер не делал никаких преобразований или есть какой-либо другой смысл использования этой кодировки и порядка сортировки?
3. Процедура SetKey. Из справки:
Use SetKey to set a key, using which data is encrypted.
Эта процедура необходима для смены пароля? Можно ли просто при IBQuery.BeforeOpen написать как в примере:
Код: Выделить всё
UniEncryptor.Password := 'мой пароль';
4. TCRInvalidHashAction. Из справки:
ihFail: The EInvalidHash exception is raised and further data reading from the server is interrupted.
ihIgnoreError: In spite of the fact that the data is not valid, the value is set in the field. No exception is raised.
ihSkipData: The value of the field for this record is set to Null. No exception is raised..
То есть, это метод обработки ошибок, когда, как написано, hash data is invalid.
Я попробовал записать данные (с ehTagAndHash) с алгоритмом eaAES128 (свойство InvalidHashAction установил в ihIgnoreError), затем поменял алгоритм на eaBlowfish, перекомпилировал приложение, и при открытии запроса "вылетают" ошибки. Так должно быть?
Заранее благодарен за ответы.