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

我找到了这个 有关 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 似乎使用了 Java 1.5 中提到的正确函数 JCECipherProvider.java. 。我对代码的阅读表明,Derby 不处理与普通 DES 不同的 Triple DES...我真的可以相信它正在使用强加密吗?

有帮助吗?

解决方案

我相信,文件是错误的,你实际上并不需要指定加密算法使用非默认的算法时使用,因为在$ DERBY_HOME /数据库/服务指定要使用的算法。特性

在我的情况下,当我创建了一个数据库,你的参数我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 什么时候 启动加密数据库. 。我的理解是你只需要使用 bootPasswordencryptionAlgorithm.

我承认我没有对此进行测试,实际上,我真的想知道到底发生了什么:

  • 如果你不指定 dataEncryption 并使用错误的 encryptionAlgorithm 在第二个网址中。
  • 当您指定 dataEncryption=true 并使用另一个 encryptionAlgorithm (它会重新创建加密数据库吗?)。

文档对此并不清楚。

我认为当你正在做的第一加密(即,当你首先创建加密数据库时,或首先被加密未加密的数据库)。

的encryptionAlgorithm参数唯一重要的

一旦你已经加密的数据库,从那时候开始,你只需要指定bootPassword。德比已经知道使用了什么加密算法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top