Может ли Derby / JavaDB действительно шифровать с помощью Triple DES, а не (plain) DES?


Похоже, что он путает Triple-DES (>128 бит) с обычным DES (64 бит). Я пытаюсь зашифровать базу данных Derby с помощью Triple DES (или DESede), используя Java 1.5

Я нашел это сообщение дискуссионного форума о проблеме с JDK 1.5 случайно и поэтому проверил, чтобы убедиться, что он действительно использует DESede, а не простой DES. Когда я создавал базу данных с тройным DES (168bit) URL

jdbc:derby:MySecureDB;dataEncryption=true;encryptionAlgorithm=DESede/CBC/NoPadding;bootPassword=$ecureC@deCanBr@kE0074242

Я все еще мог открыть его и получить доступ к нему с помощью (plain) DES (64bit) URL

jdbc:derby:MySecureDB;dataEncryption=true;encryptionAlgorithm=DES/CBC/NoPadding;bootPassword=$ecureC@deCanBr@kE0074242

Это не то поведение, которого я ожидаю!!! Я не смогу открыть его с помощью неправильного алгоритма шифрования. Как я могу убедиться, что он действительно шифрует его с помощью правильного (>128 бит) алгоритма?

Derby, похоже, использует правильную функцию для Java 1.5, упомянутую в JCECipherProvider.java . Мое прочтение кода показывает, что Derby не обрабатывает Triple DES как отличающийся от обычного DES... Могу ли я действительно доверять тому, что он использует сильное шифрование?

3 5

3 ответа:

Я считаю, что документация неверна, и что на самом деле вам не нужно указывать алгоритм шифрования, который будет использоваться при использовании алгоритма не по умолчанию, так как алгоритм, который должен использоваться, указан в $DERBY_HOME/database/service.свойства

В моем случае, когда я создал базу данных с вашими параметрами мой сервис.свойства имели следующее содержание (среди прочих не относящихся к делу записей):

log_encrypt_algorithm_version=1
encryptionAlgorithm=DESede/CBC/NoPadding
dataEncryption=true
derby.encryptionBlockSize=8
encryptionKeyLength=168-24
encryptedBootPassword=472b7cc5600605333392dd10a46067d2e2935fd4c350d533-43435
data_encrypt_algorithm_version=1

Вы можете проверить, что это используется, изменив алгоритм использованный. Если вы измените указанный алгоритм в этом файле на DES, то вы не сможете перезапустить базу данных.

Например:

$ ../bin/ij
ij version 10.4
ij> connect 'jdbc:derby:testdb;create=true;dataEncryption=true;encryptionAlgorithm=Blowfish/ECB/NoPadding;bootPassword=$ecureC@deCanBr@kE0074242';
ij> quit;
$ sed -i .o 's/Blowfish/DES/' testdb/service.properties 
$ ../bin/ij
ij version 10.4
ij> connect 'jdbc:derby:testdb;bootPassword=$ecureC@deCanBr@kE0074242';
ERROR XJ040: Failed to start database 'testdb', see the next exception for details.
ERROR XBM06: Startup failed. An encrypted database cannot be accessed without the correct boot password.  
ij> quit;
$ sed -i .o 's/DES/Blowfish/' testdb/service.properties 
$ ../bin/ij
ij version 10.4
ij> connect 'jdbc:derby:testdb;bootPassword=$ecureC@deCanBr@kE0074242';
ij> quit;
$ 

Согласно работе с шифрованием из руководства разработчика Java DB, первый URL выглядит нормально для шифрования базы данных при создании (поскольку он указывает dataEncryption=true) и должен был генерировать ключ шифрования 168 бит.

Теперь, все еще согласно документации, я не думаю, что вы должны использовать dataEncryption=true при загрузке зашифрованной базы данных. Я понимаю, что вам просто нужно использовать bootPassword и encryptionAlgorithm.

Я признаю, что не проверял это и, на самом деле, мне действительно интересно, что именно происходит:

  • , Если вы не указываете dataEncryption и используете неправильный encryptionAlgorithm во 2-м URL.
  • Когда вы задаете dataEncryption=true и используете другой encryptionAlgorithm (воссоздает ли он зашифрованную базу данных?).

В документации об этом нет ясности.

Я думаю, что параметр encryptionAlgorithm имеет значение только при первом выполнении шифрования (то есть при первом создании зашифрованной базы данных или при первом шифровании незашифрованной базы данных).

После того, как вы зашифровали базу данных, с этого момента вам просто нужно указать bootPassword. Дерби уже знает, какой алгоритм шифрования был использован.