Golang Go语言中 win sql/gorm 如何读取一个加密的 sqlite?
https://www.v2ex.com/t/825252 好像也没解决。 今天问 AI 和翻帖子也没找到答案。
我在 wsl 用 sqlcipher 输入密码是可以正常打开数据库的。 然后用 Navicat Premium Lite 打开数据库需要选择 sqlcipher legacy v3 才正常。
问 AI 试了各种方法,也不行,根据 AI 指引,在 win 下用 vcpkg 都安装了 sqlcipher ,也设置了对应的路径。
Golang Go语言中 win sql/gorm 如何读取一个加密的 sqlite?
更多关于Golang Go语言中 win sql/gorm 如何读取一个加密的 sqlite?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
感觉像是 go 的 sqlcipher 太新了,没有做兼容……
更多关于Golang Go语言中 win sql/gorm 如何读取一个加密的 sqlite?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
太难了,我现在还没找到解决方案。等下忙完手头的,我试下把 go 丢到 wsl 跑。看看是不是 win 下 cgo 环境问题。
我看了一下发现 https://github.com/mutecomm/go-sqlcipher 用的是 https://github.com/sqlcipher/sqlcipher/tree/v4.4.2 fork 了把 sqlcipher c 代码同步到 go-sqlcipher 看看?
我找到解决办法了。https://github.com/mattn/go-sqlite3/pull/1109 里面有解决办法。
在 go.mod 中添加 replace github.com/mattn/go-sqlite3 => github.com/jgiannuzzi/go-sqlite3 v1.14.17-0.20230719111531-6e53453ccbd3
然后基于这个代码修改:<br>func ConnectDB(path string, key string) *sql.DB {<br> key = url.QueryEscape(key)<br> dbname := fmt.Sprintf("%s?_cipher=sqlcipher&_legacy=3&_hmac_use=off&_kdf_iter=4000&_legacy_page_size=1024&_key=%s", path, key)<br> db, err := sql.Open("sqlite3", dbname)<br> if err != nil {<br> log.Fatalf("Open Error %v\n", err)<br> }<br> return db<br>}<br>
基本可以读取到加密的 sqlite 。目前我测试加密成功的 db ,需要先用 sqlcipher(3.15.2),创建一个加密数据库。连接方式直接改为:%s?_cipher=sqlcipher&_legacy=3&_key=%s 不用加上面其他的参数。可以稳定读取数据库内容了。
我用 navicat premium lite 创建的加密数据库,sqlcipher 无法打开,golang 也无法读取。原因未知。
本来我打算升级 sqlcipher 最到新版,确认是不是 golang 的 sqlcipher 库和加密的 sqlcipher 库版本存在差异导致连接失败,奈何 wsl 编译不了,执行./config 命令报错,开发任务时间紧迫就暂且放弃了。待日后有时间再回来研究。
在 Go 语言中使用 sql
和 gorm
库读取一个加密的 SQLite 数据库,需要一些额外的步骤,因为 SQLite 本身并不直接支持数据库加密。不过,你可以通过以下方式实现:
-
使用加密的 SQLite 数据库文件:
- 使用第三方工具(如
sqlcipher
)对 SQLite 数据库进行加密。 - 确保你的 SQLite 数据库文件是使用
sqlcipher
或类似工具加密的。
- 使用第三方工具(如
-
配置
sql
和gorm
以使用加密的 SQLite:- 首先,你需要一个支持
sqlcipher
的 SQLite 驱动。在 Go 中,可以使用github.com/mattn/go-sqlite3
库,并确保它包含对sqlcipher
的支持(通常需要编译特定的标签)。 - 安装带有
sqlcipher
支持的go-sqlite3
驱动:go get github.com/mattn/go-sqlite3
- 在代码中,通过 DSN(数据源名称)指定加密密钥:
import ( "github.com/jinzhu/gorm" _ "github.com/mattn/go-sqlite3" ) db, err := gorm.Open("sqlite3", "file:encrypted.db?_key=your-encryption-key") if err != nil { panic("failed to connect database") }
- 首先,你需要一个支持
请注意,上述代码中的 _key=your-encryption-key
部分用于指定解密密钥。确保密钥的安全存储和传输,因为泄露密钥将危及数据库的安全性。
此外,务必确保你使用的 SQLite 库版本与 sqlcipher
兼容,并正确配置编译选项以启用加密支持。