尝试过
都失败了
打开 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 2021-12-30 12:05:49 +08:00
```
_pragma_key=x'%s' ``` %s 前面有 x 你的没有,你改下试试 |
2
CurChen 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 2021-12-30 14:19:38 +08:00
你用的 v4 的包么?好像用 v4 没问题
|
4
junnplus 2021-12-30 14:24:42 +08:00
```
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
CurChen OP @junnplus 是 v4 的包
go.mod github.com/mutecomm/go-sqlcipher/v4 v4.4.2 // indirect 我觉得应该是 key 出的问题,不知道该怎么把 7 位字符的 key 转成官方要的 32 字节十六进制编码 |
7
Mitt 2021-12-30 14:56:45 +08:00
hex.EncodeToString([]byte("dd85344"))
|
8
Mitt 2021-12-30 14:58:58 +08:00
不对我看错了
|
9
CurChen 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
CurChen 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 57 天前
@CurChen 楼主最后找到答案了吗? 我也被困扰了好久。
|