Может ли 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 ответа:
Я считаю, что документация неверна, и что на самом деле вам не нужно указывать алгоритм шифрования, который будет использоваться при использовании алгоритма не по умолчанию, так как алгоритм, который должен использоваться, указан в $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. Дерби уже знает, какой алгоритм шифрования был использован.