使用Java/JackAccess从加密的Access.mdb读取

使用Java/JackAccess从加密的Access.mdb读取,java,encryption,ucanaccess,jackcess,ms-access-97,Java,Encryption,Ucanaccess,Jackcess,Ms Access 97,我需要从加密的Access 97数据库中读取数据,并试用JackAccess和UCanaAccess 我正在使用bouncycastle.org上的jackcess-2.1.2.jar、jackcess-encrypt-2.1.0和bcprov-jdk15on-152.jar 由于UCanAccess在内部使用Jackcess,我在所有其他尝试中都会遇到相同的错误 import com.healthmarketscience.jackcess.CryptCodecProvider; import

我需要从加密的Access 97数据库中读取数据,并试用JackAccess和UCanaAccess

我正在使用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)
线程“main”java.lang.NoSuchMethodError中出现异常:org.bouncycastle.crypto.StreamCipher.processBytes([BII[BI)V 位于com.healthmarketscience.jackcess.impl.BaseCryptCodeHandler.streamDecrypt(BaseCryptCodeHandler.java:91) 位于com.healthmarketscience.jackcess.impl.BaseJetCryptCodecHandler.decodePage(BaseJetCryptCodecHandler.java:62) 在com.healthmarketscience.jackcess.impl.PageChannel.readPage(PageChannel.java:224)上 请访问com.healthmarketscience.jackcess.impl.UsageMap.read(UsageMap.java:130) 在com.healthmarketscience.jackcess.impl.PageChannel.initialize(PageChannel.java:117)上 在com.healthmarketscience.jackcess.impl.DatabaseImpl。(DatabaseImpl.java:516) 位于com.healthmarketscience.jackcess.impl.DatabaseImpl.open(DatabaseImpl.java:389) 位于com.healthmarketscience.jackcess.DatabaseBuilder.open(DatabaseBuilder.java:248) 位于ACCESS.ACCESSTest.main(ACCESSTest.java:84)
事实证明,虽然jackcess encrypt与bouncycastle 1.52源代码兼容,但它与二进制文件不兼容。有关更多详细信息,请参见此。基本上(目前),您需要使用bouncycastle 1.50或更低版本


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

仔细检查库版本是否兼容我正在使用java 1.8.025版本和JDK 1.5到1.8的最新Bouncy Castle库,但也尝试了JDK 1.4的版本。在Jackcess主页上,只有以下信息和Bouncy Castle的链接:“加密支持需要一个额外的库(Bouncy Castle)。将此支持与主Jackcess库分离使用户可以避免包含不必要的库。"我无法获取有关依赖项或必需/兼容版本的任何信息。请澄清:您指的是受数据库密码保护的Access 97文件。换句话说,如果您在Access中打开数据库,则只会提示您输入密码,而不是用户名和密码。是否正确?密码存储在User/Grou中p权限。如果我使用msaccess/user打开文件,我只需输入用户名,密码为空。非常感谢。它可以工作:-)