5

似乎将 Triple-DES(>128 位)与普通 DES(64 位)混淆了。我正在尝试使用 Java 1.5 使用 Triple DES(或 DESede)加密 Derby 数据库

我偶然发现这个讨论论坛消息关于 JDK 1.5 的问题,因此检查以确保它确实使用的是 DESede 而不是普通的 DES。当我使用三重 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 与普通 DES 不同……我真的可以相信它使用的是强加密吗?

4

3 回答 3

5

我认为文档是错误的,并且您实际上不需要在使用非默认算法时指定要使用的加密算法,因为应该使用的算法在 $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;
$ 
于 2009-12-22T23:19:22.213 回答
1

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

现在,仍然根据文档,我认为您不应该dataEncryption=trueBooting an encrypted database时使用。我的理解是你只需要使用bootPasswordand encryptionAlgorithm

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

  • 如果您没有在第二个 URL 中指定dataEncryption和使用错误。encryptionAlgorithm
  • 当您指定dataEncryption=true并使用另一个时encryptionAlgorithm(它会重新创建加密数据库吗?)。

文档并不清楚这一点。

于 2009-12-17T23:54:34.800 回答
1

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

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

于 2009-12-18T23:59:57.223 回答