我使用 sqlcipher.exe 执行
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 代码
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"
继续看了sql.open的源码,发现该接口仅支持_pragma_key、_pragma_cipher_page_size这两个参数
但是解密数据库其他两个参数是必须的
目前的解决方案是用sqlcipher.exe做一个解密后的db文件备份,然后直接打开这个备份文件。
不过我觉得这样子不优雅,我想直接open加密的数据库文件
emm 我在该怎么做?
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。
因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。