如何在Java(非Android)中连接加密SQLCipher数据库文件?
Java连接加密SQLCipher数据库解决方案
问题原因
你使用的org.xerial:sqlite-jdbc默认不支持SQLCipher加密算法,因此无法直接连接加密的SQLCipher数据库,需要更换为支持SQLCipher的JDBC驱动。
解决方案步骤
1. 替换Maven依赖
移除原有的sqlite-jdbc依赖,添加SQLCipher官方支持的JDBC驱动:
<dependency> <groupId>net.zetetic</groupId> <artifactId>sqlcipher-jdbc</artifactId> <version>4.5.5</version> </dependency>
2. 加载SQLCipher本地库
SQLCipher依赖本地原生库(Windows对应.dll、Linux对应.so、Mac对应.dylib),多数情况下驱动会自动加载适配系统的库文件。若出现加载失败,可手动指定库路径:
// 示例:将SQLCipher原生库放到项目的native-libs目录下时 System.setProperty("jna.library.path", "src/main/resources/native-libs");
3. 连接并操作数据库的示例代码
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class SQLCipherConnector { public static void main(String[] args) { // 加载SQLCipher驱动 try { Class.forName("net.zetetic.database.sqlcipher.SQLiteDriver"); } catch (ClassNotFoundException e) { e.printStackTrace(); return; } String dbPath = "D:/db.db3"; String dbPassword = "your-db-password"; // 替换为你的数据库密码 String jdbcUrl = String.format("jdbc:sqlite:%s", dbPath); try (Connection conn = DriverManager.getConnection(jdbcUrl, "", dbPassword)) { // 确认加密密钥生效(也可直接在URL中拼接:jdbc:sqlite:%s?key=%s) conn.createStatement().execute(String.format("PRAGMA key='%s';", dbPassword)); // 执行查询示例,替换为你的表名 String querySql = "SELECT * FROM your_table"; try (PreparedStatement pstmt = conn.prepareStatement(querySql); ResultSet rs = pstmt.executeQuery()) { while (rs.next()) { // 示例:获取第一列数据并打印,根据实际表结构调整 System.out.println(rs.getString(1)); } } } catch (SQLException e) { e.printStackTrace(); } } }
4. 常见问题排查
- 确认数据库密码完全匹配,注意大小写、特殊字符的正确性
- 检查文件路径格式:Windows下可使用正斜杠
/或双反斜杠\\ - 若数据库由旧版SQLCipher创建,需执行
PRAGMA cipher_compatibility = 3;指定兼容加密算法 - 确保依赖版本与系统架构(x86/x64)一致,避免原生库加载失败
内容的提问来源于stack exchange,提问作者user25408231
相关产品推荐
相关产品推荐

