Golang Go语言中如何直接打开加密的 sqlite3 db 文件
尝试过
- https://pkg.go.dev/github.com/mutecomm/go-sqlcipher#section-readme
- https://stackoverflow.com/questions/66818643/does-gorm-support-working-with-encrypted-sqlite-db
- https://github.com/mutecomm/go-sqlcipher
都失败了
打开 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
<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&_pragma_cipher_page_size=4096", dbname)<br> db, err := sql.Open("sqlite3", dbname)<br> if err != nil {<br> panic(err)<br> }<br>
不需要转,你看我上面的代码,没问题的
hex.EncodeToString([]byte(“dd85344”))
不对我看错了
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
我使用 sqlcipher.exe 执行base<br>sqlcipher.exe F:\testdata\xxx.db<br>sqlite> PRAGMA key = 'dd85344';<br>sqlite> PRAGMA cipher_use_hmac = off;<br>sqlite> PRAGMA cipher_page_size = 1024;<br>sqlite> PRAGMA kdf_iter = 4000;<br>sqlite> .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&_pragma_cipher_use_hmac=off&_pragma_cipher_page_size=1024&_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数据库的基本步骤:
-
安装库:
go get modernc.org/sqlite
-
导入库并打开数据库:
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
部分应替换为你的实际加密密钥。 -
执行数据库操作: 使用
db
对象执行SQL查询和更新操作,与标准database/sql
包的用法类似。
确保你的SQLite3数据库文件是使用支持加密的SQLite版本和工具创建的,因为普通的SQLite数据库文件不能简单地通过添加密钥来加密。