V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Felldeadbird
V2EX  ›  Go 编程语言

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

  •  
  •   Felldeadbird · 60 天前 · 1276 次点击
    这是一个创建于 60 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    4 条回复    2024-09-12 13:35:10 +08:00
    zeromake
        1
    zeromake  
       59 天前
    感觉像是 go 的 sqlcipher 太新了,没有做兼容……
    Felldeadbird
        2
    Felldeadbird  
    OP
       59 天前
    @zeromake 太难了,我现在还没找到解决方案。等下忙完手头的,我试下把 go 丢到 wsl 跑。看看是不是 win 下 cgo 环境问题。
    zeromake
        3
    zeromake  
       59 天前
    我看了一下发现 https://github.com/mutecomm/go-sqlcipher 用的是 https://github.com/sqlcipher/sqlcipher/tree/v4.4.2 fork 了把 sqlcipher c 代码同步到 go-sqlcipher 看看?
    Felldeadbird
        4
    Felldeadbird  
    OP
       59 天前
    @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 命令报错,开发任务时间紧迫就暂且放弃了。待日后有时间再回来研究。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3285 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:45 · PVG 08:45 · LAX 16:45 · JFK 19:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.