如何在Java中连接SQLCipher3加密的SQLite数据库?

新手上路,请多包涵

java语言连接sqlcipher3加密过的sqlite数据库

并不是安卓平台,一个网站系统,需要用到sqlite,现在需要将sqlite数据库进行加密然后从pom文件、yml文件当中进行连接获取相关数据;但是一直连不上,很多驱动都已经不兼容了;
请问还有什么能用的连接驱动吗?

驱动:

    <dependency>
        <groupId>org.xerial</groupId>
        <artifactId>sqlite-jdbc</artifactId>
        <version>3.48.0.0</version>
    </dependency>

yml配置:

    slave:
      enabled: true
      url: jdbc:sqlite:D:/xn/base/base.db?cipher=sqlcipher&legacy=3&key=123456
      username:
      password:
      driver-class-name: org.sqlite.JDBC

报错信息:
11:26:14.244 [Druid-ConnectionPool-Create-560240291] ERROR c.a.d.p.DruidDataSource - [run,2948] - create connection SQLException, url: jdbc:sqlite:D:/xn/base/base.db?&key=123456&cipher=sqlcipher&legacy=3, errorCode 0, state null
java.sql.SQLException: opening db: 'D:/xn/base/base1.db?legacy=3&cipher=sqlcipher&key=123456': 文件名、目录名或卷标语法不正确。

已经排除密码错误或者文件名目录名不正确;

阅读 1.4k
avatarAI BotBETA

回答

要在Java中连接SQLCipher3加密的SQLite数据库,你需要使用支持SQLCipher的JDBC驱动。你目前使用的org.xerial:sqlite-jdbc库默认不支持SQLCipher加密。你需要使用xerial/sqlite-jdbc的SQLCipher分支或者类似的库,比如Zetetic/sqlcipher-jdbc

步骤如下:

  1. 更换依赖库
    使用支持SQLCipher的JDBC驱动。在Maven的pom.xml文件中,你可以替换为以下依赖(注意,具体的版本号和仓库地址可能会有更新,请参考最新的官方文档):

    <dependency>
        <groupId>net.zetetic</groupId>
        <artifactId>sqlcipher-jdbc</artifactId>
        <version>YOUR_DESIRED_VERSION</version>
    </dependency>

请注意,YOUR_DESIRED_VERSION需要替换为实际的版本号,并且可能需要添加额外的仓库地址来解析这个依赖。

  1. 调整URL格式
    你的数据库连接URL格式看起来有一些问题。确保URL格式正确,并且参数顺序和编码正确。通常,加密密钥key应该放在URL的查询参数中,但你的错误提示显示文件名解析有问题,可能是因为URL编码不正确。确保URL编码正确,并且没有多余的字符或错误的参数位置。

    正确的URL格式可能看起来像这样(注意,具体格式可能因驱动而异):

    slave:
      enabled: true
      url: jdbc:sqlcipher:D:/xn/base/base.db?mode=rw&cipher=sqlcipher&key=123456
      username:
      password:
      driver-class-name: net.zetetic.sqlcipher.JDBC

注意driver-class-name也需要更新为SQLCipher JDBC驱动的类名。

  1. 确保库文件可用
    确保所有必要的库文件(如本地SQLCipher库)都在类路径中,或者正确配置以便JDBC驱动能够加载它们。
  2. 测试和调试
    在做出更改后,确保重新构建项目并测试数据库连接。如果仍然遇到问题,检查错误日志以获取更多信息,并确保所有配置都是正确的。

通过上述步骤,你应该能够成功连接到SQLCipher3加密的SQLite数据库。如果问题仍然存在,可能需要检查具体的驱动文档或寻求社区支持。

1 个回答

参考这篇文章
SQLite JDBC加密驱动使用教程

可以看下这个
Willena / sqlite-jdbc-crypt

在 pom.xml 文件中添加依赖项:

<dependency>
    <groupId>com.github.willena</groupId>
    <artifactId>sqlite-jdbc-crypt</artifactId>
    <version>3.47.1.0</version>
</dependency>

可以在 application.yml 文件中配置连接信息:

slave:
  enabled: true
  url: jdbc:sqlite-crypt:D:/xn/base/base.db
  username:
  password:
  driver-class-name: org.sqlite.JDBC

在代码中,可以使用以下方式连接到加密的 SQLite 数据库:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class SQLiteConnection {
    public static void main(String[] args) {
        String url = "jdbc:sqlite-crypt:D:/xn/base/base.db";
        Properties props = new Properties();
        props.setProperty("password", "123456");

        try (Connection conn = DriverManager.getConnection(url, props)) {
            if (conn != null) {
                System.out.println("Connection to SQLite has been established.");
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

或者

SQLite3MultipleCiphers
手动下载 SQLite3MultipleCiphers 的 JAR 文件,并将其添加到项目中。然后在 pom.xml 中添加以下依赖项:

<dependency>
    <groupId>com.github.utelle</groupId>
    <artifactId>sqlite-jdbc</artifactId>
    <version>3.39.2</version>
</dependency>

在 application.yml 文件中配置连接信息:

slave:
  enabled: true
  url: jdbc:sqlite:D:/xn/base/base.db
  username:
  password:
  driver-class-name: org.sqlite.JDBC

使用以下方式连接到加密的 SQLite 数据库:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class SQLiteConnection {
    public static void main(String[] args) {
        String url = "jdbc:sqlite:D:/xn/base/base.db";
        Properties props = new Properties();
        props.setProperty("cipher", "sqlcipher");
        props.setProperty("legacy", "3");
        props.setProperty("key", "123456");

        try (Connection conn = DriverManager.getConnection(url, props)) {
            if (conn != null) {
                System.out.println("Connection to SQLite has been established.");
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏