SQLCipher:验证打开数据库的密钥

时间:2016-06-04 22:35:11

标签: c sqlcipher

是否可以检查给定密钥对于已打开和未锁定的数据库是否是正确的解密?

#define SQLITE_HAS_CODEC
#include <sqlcipher/sqlite3.h>
#include <assert.h>

sqlite3 *open_db(void)
{
    sqlite3 *dbh;

    sqlite3_open_v2("test.db", &dbh, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
    sqlite3_key(dbh, "xxxx", 4);

    return dbh;
}

int key_is_valid(sqlite3 *dbh, const char *key)
{
    /* ??? */
    return 1;
}

int main(int argc, char *argv[])
{
    sqlite3 *dbh = open_db();

    assert(key_is_valid(dbh, "test"));
    assert(!key_is_valid(dbh, "foobar"));

    return 0;
}

我知道我可以存储传递给sqlite3_key的解密密钥以供日后验证,但我想避免使用它。

我需要这样做的原因是我想允许用户更改密码,在此之前我希望他们提供旧密码。

1 个答案:

答案 0 :(得分:0)

通过尝试从sqlite_master表中读取,您可以在键入数据库后验证提供的密码是否有效:

SELECT count(*) FROM sqlite_master;

在更改密码之前,库需要提供正确的密码。正确键入数据库后,可以使用以下API更改密码:

int sqlite3_rekey(sqlite3 *db, const void *pKey, int nKey);