Derby / JavaDB _really_可以使用Triple DES而不是(普通)DES进行加密吗?

时间:2009-12-17 22:47:57

标签: java derby encryption-symmetric

使用普通DES(64位)似乎令Triple-DES(> 128bit)感到困惑。 我正在尝试使用Java 1.5

使用Triple DES(或DESede)加密Derby数据库

我偶然发现了这个discussion forum message about a problem with 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位)算法真正加密它?

Derby似乎使用JCECipherProvider.java中提到的Java 1.5的正确函数。我对代码的阅读表明Derby不像普通DES那样处理Triple DES ......我真的相信它正在使用强加密吗?

3 个答案:

答案 0 :(得分:5)

我认为文档是错误的,并且您实际上不需要指定在使用非默认算法时要使用的加密算法,因为应该使用的算法在$ 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 :(得分:1)

根据Java DB Developer's Guide中的Working with encryption,第一个URL看起来很好在创建时加密数据库(因为它指定了dataEncryption=true)并且应该生成了一个168位加密密钥。

现在,仍然根据文档,我认为在引导加密数据库时不应该使用dataEncryption=true。我的理解是您只需要使用bootPasswordencryptionAlgorithm

我承认我没有对此进行测试,实际上,我真的很想知道究竟会发生什么:

  • 如果您未指定dataEncryption并在第二个网址中使用了错误的encryptionAlgorithm
  • 指定dataEncryption=true并使用其他encryptionAlgorithm时(它是否会重新创建加密数据库?)。

文档不清楚。

答案 2 :(得分:1)

我认为encryptionAlgorithm参数仅在您第一次执行加密时(即,您第一次创建加密数据库时,或者您第一次加密未加密的数据库时)。

一旦加密了数据库,从那时起,您只需要指定bootPassword。 Derby已经知道使用了什么加密算法。