【问题标题】:Reading from an encrypted Access .mdb using Java / Jackcess使用 Java / Jackcess 从加密的 Access .mdb 中读取
【发布时间】:2015-12-16 08:44:09
【问题描述】:

我需要从加密的 Access 97 数据库中读取数据并试用 Jackcess 和 UCanAccess。

我正在使用来自 bouncycastle.org 的 jackcess-2.1.2.jar、jackcess-encrypt-2.1.0 和 bcprov-jdk15on-152.jar

由于 UCanAccess 在内部使用 Jackcess,我在所有其他尝试中都遇到了同样的错误。

import com.healthmarketscience.jackcess.CryptCodecProvider;
import com.healthmarketscience.jackcess.Database;
import com.healthmarketscience.jackcess.DatabaseBuilder;
import java.io.File;

File fi = new File("test/access/data.mdb"); 
CryptCodecProvider cryptProvider = new CryptCodecProvider();
cryptProvider.setPassword("mypassword");
DatabaseBuilder dbb = new DatabaseBuilder(fi);
dbb.setFileFormat(Database.FileFormat.V1997);
dbb.setAutoSync(false);
dbb.setCodecProvider(cryptProvider);
dbb.setReadOnly(true);
Database dbc = dbb.open();

最后一行调用了一个错误,这里是堆栈跟踪:

Exception in thread "main" java.lang.NoSuchMethodError: org.bouncycastle.crypto.StreamCipher.processBytes([BII[BI)V
at com.healthmarketscience.jackcess.impl.BaseCryptCodecHandler.streamDecrypt(BaseCryptCodecHandler.java:91)
at com.healthmarketscience.jackcess.impl.BaseJetCryptCodecHandler.decodePage(BaseJetCryptCodecHandler.java:62)
at com.healthmarketscience.jackcess.impl.PageChannel.readPage(PageChannel.java:224)
at com.healthmarketscience.jackcess.impl.UsageMap.read(UsageMap.java:130)
at com.healthmarketscience.jackcess.impl.PageChannel.initialize(PageChannel.java:117)
at com.healthmarketscience.jackcess.impl.DatabaseImpl.<init>(DatabaseImpl.java:516)
at com.healthmarketscience.jackcess.impl.DatabaseImpl.open(DatabaseImpl.java:389)
at com.healthmarketscience.jackcess.DatabaseBuilder.open(DatabaseBuilder.java:248)
at ACCESS.ACCESSTest.main(ACCESSTest.java:84)

【问题讨论】:

  • 仔细检查库版本是否兼容
  • 我正在使用 Java 版本 1.8.0_25 和用于 JDK 1.5 到 1.8 的最新 Bouncy Castle 库,但也尝试了用于 JDK 1.4 的那些。在 Jackcess 主页上只有此信息与 Bouncy Castle 的链接:“加密支持需要一个额外的库 (Bouncy Castle)。将此支持与主要的 Jackcess 库分开允许用户避免包含不必要的库。”我无法获得有关依赖项或所需/兼容版本的任何信息。
  • 澄清一下:您说的是受数据库密码保护的 Access 97 文件。换句话说,如果您在 Access 中打开数据库,系统只会提示您输入密码,而不是用户名和密码。对吗?
  • 密码存储在用户/组权限中。如果我使用 msaccess/user 打开文件,我只需要输入用户名并且必须将密码留空。

标签: java encryption ucanaccess jackcess ms-access-97


【解决方案1】:

事实证明,虽然 jackcess-encrypt source 与 bouncycastle 1.52 兼容,但它与 binary 不兼容。有关更多详细信息,请参阅此feature request。基本上(目前),您需要使用 bouncycastle 1.50 或更低版本。

更新:从 jackcess-encrypt 的 2.1.1 版本开始,bouncycastle 的旧版本(1.52 之前)和新版本(1.52+)都应该可以正常工作。

【讨论】:

  • 非常感谢。它工作:-)
猜你喜欢
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多