Может ли Derby / JavaDB _really_ шифроваться с помощью Triple DES, а не (простого) DES? - PullRequest
5 голосов
/ 18 декабря 2009

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

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

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

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 23 декабря 2009

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

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

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;
$ 
1 голос
/ 19 декабря 2009

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

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

1 голос
/ 18 декабря 2009

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

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

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

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

Документация по этому поводу не ясна.

...