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

StackOverflow https://stackoverflow.com/questions/1925134

Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

В моем случае, когда я создавал базу данных с вашими параметрами, мой 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;
$ 

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top