Golang Go语言中 win sql/gorm 如何读取一个加密的 sqlite?

发布于 1周前 作者 sinazl 来自 Go语言

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

5 回复

感觉像是 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&amp;_legacy=3&amp;_hmac_use=off&amp;_kdf_iter=4000&amp;_legacy_page_size=1024&amp;_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 语言中使用 sqlgorm 库读取一个加密的 SQLite 数据库,需要一些额外的步骤,因为 SQLite 本身并不直接支持数据库加密。不过,你可以通过以下方式实现:

  1. 使用加密的 SQLite 数据库文件

    • 使用第三方工具(如 sqlcipher)对 SQLite 数据库进行加密。
    • 确保你的 SQLite 数据库文件是使用 sqlcipher 或类似工具加密的。
  2. 配置 sqlgorm 以使用加密的 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 兼容,并正确配置编译选项以启用加密支持。

回到顶部