go 如何直接打开加密的 sqlite3 db 文件 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
chenexe

go 如何直接打开加密的 sqlite3 db 文件

  •  
  •   chenexe Dec 30, 2021 4579 views
    This topic created in 1586 days ago, the information mentioned may be changed or developed.

    尝试过

    都失败了

    打开 db 代码如下:

     dbname := `***.db` key := "dd85344" dbnameWithDSN := dbname + fmt.Sprintf("?_pragma_key=%s&_pragma_cipher_page_size=4096", key) db, err := gorm.Open(sqlite.Open(dbnameWithDSN), &gorm.Config{}) 

    也尝试过\

     dbname := `***.db` key := "dd85344" dbnameWithDSN := dbname + fmt.Sprintf("?_pragma_key=%s&_pragma_cipher_page_size=4096", key) db, _ := sql.Open("sqlite3", dbname) 

    密码肯定是对的,不过我这边的 key 是 7 位的,官方说的是必须为 32 字节十六进制编码
    我觉得问题应该出现在这,但是我不知道该怎么下一步转换了

    Supplement 1    Dec 31, 2021
    继续看了 sql.open 的源码,发现该接口好像仅支持_pragma_key 、_pragma_cpher_page_size 这两个参数
    但是解密数据库其他两个参数是必须的
    目前的解决方案是用 sqlcipher.exe 做一个解密后的 db 文件备份,然后直接打开这个备份文件。
    不过我觉得这样子不优雅,我想直接 open 加密的数据库文件
    emmm 有大佬知道该怎么做吗
    Supplement 2    Dec 31, 2021
    目前解密 db 需要四个参数
    sqlcipher.exe F:\testdata\xxx.db
    sqlite> PRAGMA key = 'dd85344';
    sqlite> PRAGMA cipher_use_hmac = off;
    sqlite> PRAGMA cipher_page_size = 1024;
    sqlite> PRAGMA kdf_iter = 4000;
    sqlite> .table

    但是 sql.open 好像仅支持 PRAGMA key 、PRAGMA cipher_page_size 这两个
    11 replies    2024-09-11 23:54:53 +08:00
    hemingway
        1
    hemingway  
       Dec 30, 2021
    ```
    _pragma_key=x'%s'
    ```
    %s 前面有 x 你的没有,你改下试试
    chenexe
        2
    chenexe  
    OP
       Dec 30, 2021
    @hemingway
    db, err := sql.Open("sqlite3", fmt.Sprintf("%s?_pragma_key=x'%s'&_pragma_cipher_page_size=4096", dbname, key))
    db, err := sql.Open("sqlite3", fmt.Sprintf("%s?_pragma_key=x%s&_pragma_cipher_page_size=4096", dbname, key))
    db, err := sql.Open("sqlite3", fmt.Sprintf("%s?_pragma_key=%s&_pragma_cipher_page_size=4096", dbname, key))
    都不行的
    junnplus
        3
    junnplus  
       Dec 30, 2021
    你用的 v4 的包么?好像用 v4 没问题
    junnplus
        4
    junnplus  
       Dec 30, 2021
    ```
    dbname = fmt.Sprintf("%s?_pragma_key=passphrase&_pragma_cipher_page_size=4096", dbname)
    db, err := sql.Open("sqlite3", dbname)
    if err != nil {
    panic(err)
    }
    ```
    chenexe
        5
    chenexe  
    OP
       Dec 30, 2021
    @junnplus 是 v4 的包
    go.mod
    github.com/mutecomm/go-sqlcipher/v4 v4.4.2 // indirect

    我觉得应该是 key 出的问题,不知道该怎么把 7 位字符的 key 转成官方要的 32 字节十六进制编码
    junnplus
        6
    junnplus  
       Dec 30, 2021
    @CurChen 不需要转,你看我上面的代码,没问题的
    Mitt
        7
    Mitt  
       Dec 30, 2021
    hex.EncodeToString([]byte("dd85344"))
    Mitt
        8
    Mitt  
       Dec 30, 2021
    不对我看错了
    chenexe
        9
    chenexe  
    OP
       Dec 30, 2021
    @junnplus
    db, err := sql.Open("sqlite3", `xxx.db?_pragma_key=dd85344&_pragma_cipher_page_size=4096`)
    if err != nil {
    t.Fatal(err)
    }
    rows, err := db.Query("SELECT id,value FROM userinfo")
    if err != nil {
    t.Fatal(err)
    }
    最后的 err 会返回:file is not a database
    chenexe
        10
    chenexe  
    OP
       Dec 30, 2021
    我使用 sqlcipher.exe 执行
    ```base
    sqlcipher.exe F:\testdata\xxx.db
    sqlite> PRAGMA key = 'dd85344';
    sqlite> PRAGMA cipher_use_hmac = off;
    sqlite> PRAGMA cipher_page_size = 1024;
    sqlite> PRAGMA kdf_iter = 4000;
    sqlite> .table
    ```
    成功了

    这是我的 golang 代码
    ```golang
    import (
    "database/sql"
    "fmt"
    "testing"

    _ "github.com/mutecomm/go-sqlcipher/v4"
    )

    func TestDecrypt(t *testing.T) {
    dbname := fmt.Sprintf("%s?_pragma_key=%s&_pragma_cipher_use_hmac=off&_pragma_cipher_page_size=1024&_pragma_kdf_iter=4000", `F:\testdata\xxx.db`, "dd85344")
    db, err := sql.Open("sqlite3", dbname)
    if err != nil {
    panic(err)
    }
    _, err = db.Query("SELECT id,value FROM userinfo")
    if err != nil {
    panic(err)
    }
    }
    ```
    最后的 error 会报错 : "file is not a database"
    Felldeadbird
        11
    Felldeadbird  
       Sep 11, 2024
    @CurChen 楼主最后找到答案了吗? 我也被困扰了好久。
    About     Help     Advertise     Blog     API &nbs;   FAQ     Solana     2389 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 05:39 PVG 13:39 LAX 22:39 JFK 01:39
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86