
尝试过
都失败了
打开 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 字节十六进制编码
我觉得问题应该出现在这,但是我不知道该怎么下一步转换了
1 hemingway Dec 30, 2021 ``` _pragma_key=x'%s' ``` %s 前面有 x 你的没有,你改下试试 |
2 chenexe OP @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)) 都不行的 |
3 junnplus Dec 30, 2021 你用的 v4 的包么?好像用 v4 没问题 |
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) } ``` |
5 chenexe OP @junnplus 是 v4 的包 go.mod github.com/mutecomm/go-sqlcipher/v4 v4.4.2 // indirect 我觉得应该是 key 出的问题,不知道该怎么把 7 位字符的 key 转成官方要的 32 字节十六进制编码 |
7 Mitt Dec 30, 2021 hex.EncodeToString([]byte("dd85344")) |
8 Mitt Dec 30, 2021 不对我看错了 |
9 chenexe OP @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 |
10 chenexe OP 我使用 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" |
11 Felldeadbird Sep 11, 2024 @CurChen 楼主最后找到答案了吗? 我也被困扰了好久。 |