https://www.v2ex.com/t/825252 好像也没解决。 今天问 AI 和翻帖子也没找到答案。
我在 wsl 用 sqlcipher 输入密码是可以正常打开数据库的。 然后用 Navicat Premium Lite 打开数据库需要选择 sqlcipher legacy v3 才正常。
问 AI 试了各种方法,也不行,根据 AI 指引,在 win 下用 vcpkg 都安装了 sqlcipher ,也设置了对应的路径。
1
zeromake 70 天前
感觉像是 go 的 sqlcipher 太新了,没有做兼容……
|
2
Felldeadbird OP @zeromake 太难了,我现在还没找到解决方案。等下忙完手头的,我试下把 go 丢到 wsl 跑。看看是不是 win 下 cgo 环境问题。
|
3
zeromake 70 天前
我看了一下发现 https://github.com/mutecomm/go-sqlcipher 用的是 https://github.com/sqlcipher/sqlcipher/tree/v4.4.2 fork 了把 sqlcipher c 代码同步到 go-sqlcipher 看看?
|
4
Felldeadbird OP @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 命令报错,开发任务时间紧迫就暂且放弃了。待日后有时间再回来研究。 |