win sql/gorm 如何读取一个加密的 sqlite?

12 天前
 Felldeadbird

https://www.v2ex.com/t/825252 好像也没解决。 今天问 AI 和翻帖子也没找到答案。

我在 wsl 用 sqlcipher 输入密码是可以正常打开数据库的。 然后用 Navicat Premium Lite 打开数据库需要选择 sqlcipher legacy v3 才正常。

问 AI 试了各种方法,也不行,根据 AI 指引,在 win 下用 vcpkg 都安装了 sqlcipher ,也设置了对应的路径。

1005 次点击
所在节点    Go 编程语言
4 条回复
zeromake
12 天前
感觉像是 go 的 sqlcipher 太新了,没有做兼容……
Felldeadbird
12 天前
@zeromake 太难了,我现在还没找到解决方案。等下忙完手头的,我试下把 go 丢到 wsl 跑。看看是不是 win 下 cgo 环境问题。
zeromake
12 天前
我看了一下发现 https://github.com/mutecomm/go-sqlcipher 用的是 https://github.com/sqlcipher/sqlcipher/tree/v4.4.2 fork 了把 sqlcipher c 代码同步到 go-sqlcipher 看看?
Felldeadbird
12 天前
@zeromake
@CurChen
我找到解决办法了。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

然后基于这个代码修改:
```
func ConnectDB(path string, key string) *sql.DB {
key = url.QueryEscape(key)
dbname := fmt.Sprintf("%s?_cipher=sqlcipher&_legacy=3&_hmac_use=off&_kdf_iter=4000&_legacy_page_size=1024&_key=%s", path, key)
db, err := sql.Open("sqlite3", dbname)
if err != nil {
log.Fatalf("Open Error %v\n", err)
}
return db
}
```

基本可以读取到加密的 sqlite 。目前我测试加密成功的 db ,需要先用 sqlcipher(3.15.2),创建一个加密数据库。连接方式直接改为:%s?_cipher=sqlcipher&_legacy=3&_key=%s 不用加上面其他的参数。可以稳定读取数据库内容了。


我用 navicat premium lite 创建的加密数据库,sqlcipher 无法打开,golang 也无法读取。原因未知。

本来我打算升级 sqlcipher 最到新版,确认是不是 golang 的 sqlcipher 库和加密的 sqlcipher 库版本存在差异导致连接失败,奈何 wsl 编译不了,执行./config 命令报错,开发任务时间紧迫就暂且放弃了。待日后有时间再回来研究。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1072140

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX