【问题标题】:Can Derby / JavaDB _really_ encrypt with Triple DES rather than (plain) DES?Derby / JavaDB _really_ 可以用三重 DES 而不是(普通)DES 加密吗?
【发布时间】:2010-12-27 20:43:11
【问题描述】:

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

我偶然发现了这个discussion forum message about a problem with 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

这不是我期望的行为!!!我应该无法使用错误的加密算法打开它。如何确保它确实使用正确的 (>128bit) 算法对其进行了加密?

Derby 似乎使用了JCECipherProvider.java 中提到的 Java 1.5 的正确函数。我对代码的阅读表明 Derby 处理三重 DES 与普通 DES 不同...我真的可以相信它使用的是强加密吗?

【问题讨论】:

  • 我正在使用 J2SE 1.5.0_18 和 Apache Derby 10.5.3.0(最新版本)。
  • 顶部 URL 实际上有“create=true”,但为了便于比较,此处省略。

标签: java derby encryption-symmetric


【解决方案1】:

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

【讨论】:

  • 感谢您清晰详细的解释和演示。我自己进行了测试,并确信它是安全的。有一个美好的圣诞节(如果你庆祝它)和新年!
【解决方案2】:

根据 Java DB 开发人员指南中的 Working with encryption,第一个 URL 看起来可以在创建时加密数据库(因为它指定了 dataEncryption=true)并且应该生成了 168 位加密密钥.

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

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

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

文档对此并不清楚。

【讨论】:

  • 感谢您的想法。当我在没有“dataEncryption=true”的情况下第二次启动时,它仍然会启动一个据称是使用纯 DES 的三重 DES 加密数据库。
  • 密钥不是包含所有需要的东西吗?
  • 我想确保它是用强 ( >=128bit ) 加密而不是 64 位加密的。虽然引导密码对于 168 位(三重 DES)来说足够大,但我认为它也可以用于 64 位,而忽略多余的字符。密钥大小(encryptionKeyLength 参数)似乎没有得到遵守。请解释一下你的意思?
  • 感谢您的努力,帕斯卡!他们对找到解决方案非常有帮助。 Joyeuse Fêtes et bonne annee!
【解决方案3】:

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

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

【讨论】:

  • 感谢您的澄清,现在我明白 Pascal 想说什么,但我不相信它是正确的:“启动加密数据库:如果创建数据库时使用的算法不是默认算法,还必须指定encryptionAlgorithm属性。Derby使用的默认加密算法是DES/CBC/NoPadding。 db.apache.org/derby/docs/10.5/devguide/tdevdvlp40140.html
  • 看起来在这些领域的文档中肯定存在一些弱点,并且在某些情况下,Derby 悄悄地忽略了您的连接属性,而不是明确警告您它们被忽略了。其中一些已经记录在 Apache JIRA 中(例如,DERBY-4328、DERBY-2409)。如果您能访问 Derby 站点并记录您发现的其他一些问题,那就太好了,这样我们就可以改进 Derby 的文档和错误处理。顺便说一句,我认为下面 Paul Wagland 的回答非常彻底和有帮助。
  • 感谢布莱恩的好话!
  • 感谢您的帮助,布莱恩!我已经提交了一个错误。新年快乐!
猜你喜欢
  • 2011-10-22
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多