Golang Go语言中如何直接打开加密的 sqlite3 db 文件

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

尝试过

都失败了

打开 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 字节十六进制编码
我觉得问题应该出现在这,但是我不知道该怎么下一步转换了


Golang Go语言中如何直接打开加密的 sqlite3 db 文件

更多关于Golang Go语言中如何直接打开加密的 sqlite3 db 文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

12 回复

<br>_pragma_key=x'%s'<br>
%s 前面有 x 你的没有,你改下试试

更多关于Golang Go语言中如何直接打开加密的 sqlite3 db 文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html



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))
都不行的

你用的 v4 的包么?好像用 v4 没问题

<br> dbname = fmt.Sprintf("%s?_pragma_key=passphrase&amp;_pragma_cipher_page_size=4096", dbname)<br> db, err := sql.Open("sqlite3", dbname)<br> if err != nil {<br> panic(err)<br> }<br>

是 v4 的包
go.mod
github.com/mutecomm/go-sqlcipher/v4 v4.4.2 // indirect

我觉得应该是 key 出的问题,不知道该怎么把 7 位字符的 key 转成官方要的 32 字节十六进制编码

不需要转,你看我上面的代码,没问题的

hex.EncodeToString([]byte(“dd85344”))

不对我看错了


db, err := sql.Open(“sqlite3”, xxx.db?_pragma_key=dd85344&amp;_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

我使用 sqlcipher.exe 执行
base<br>sqlcipher.exe F:\testdata\xxx.db<br>sqlite&gt; PRAGMA key = 'dd85344';<br>sqlite&gt; PRAGMA cipher_use_hmac = off;<br>sqlite&gt; PRAGMA cipher_page_size = 1024;<br>sqlite&gt; PRAGMA kdf_iter = 4000;<br>sqlite&gt; .table<br>
成功了

这是我的 golang 代码
golang<br>import (<br> "database/sql"<br> "fmt"<br> "testing"<br><br> _ "<a target="_blank" href="http://github.com/mutecomm/go-sqlcipher/v4" rel="nofollow noopener">github.com/mutecomm/go-sqlcipher/v4</a>"<br>)<br><br>func TestDecrypt(t *testing.T) {<br> dbname := fmt.Sprintf("%s?_pragma_key=%s&amp;_pragma_cipher_use_hmac=off&amp;_pragma_cipher_page_size=1024&amp;_pragma_kdf_iter=4000", `F:\testdata\xxx.db`, "dd85344")<br> db, err := sql.Open("sqlite3", dbname)<br> if err != nil {<br> panic(err)<br> }<br> _, err = db.Query("SELECT id,value FROM userinfo")<br> if err != nil {<br> panic(err)<br> }<br>}<br>
最后的 error 会报错 : “file is not a database”

楼主最后找到答案了吗? 我也被困扰了好久。

在Golang中直接打开加密的SQLite3数据库文件,你需要使用一个支持加密功能的SQLite3驱动。标准库中的database/sql包和github.com/mattn/go-sqlite3驱动本身并不直接支持加密功能。不过,你可以使用modernc.org/sqlite这个库,它提供了对SQLite加密扩展的支持。

以下是使用modernc.org/sqlite库打开加密SQLite3数据库的基本步骤:

  1. 安装库

    go get modernc.org/sqlite
    
  2. 导入库并打开数据库

    package main
    
    import (
        "fmt"
        "log"
        "modernc.org/sqlite"
    )
    
    func main() {
        connStr := "file:encrypted.db?mode=rw&_journal_mode=WAL&_busy_timeout=5000&key=your-encryption-key"
        db, err := sqlite.Open(connStr)
        if err != nil {
            log.Fatal(err)
        }
        defer db.Close()
    
        fmt.Println("Database opened successfully")
        // 在这里进行数据库操作
    }
    

    注意:key=your-encryption-key部分应替换为你的实际加密密钥。

  3. 执行数据库操作: 使用db对象执行SQL查询和更新操作,与标准database/sql包的用法类似。

确保你的SQLite3数据库文件是使用支持加密的SQLite版本和工具创建的,因为普通的SQLite数据库文件不能简单地通过添加密钥来加密。

回到顶部