sqlite3_exec在linux中返回26

时间:2013-12-16 18:43:22

标签: database encryption sqlite sqlcipher

我正在编写一个加密SQLITE3数据库的应用程序。对于加密,我使用过SQLCIPHER.i能够从命令行执行数据库的加密和解密。我正在使用c ++编写客户端应用程序。这是我测试密钥的代码(用于加密)。

int main()
{
    sqlite3 *DataBase;

    if(sqlite3_open("encrypted.db", &DataBase)== SQLITE_OK)
    {

        int result = sqlite3_exec(DataBase, "PRAGMA KEY = 'testkey';", NULL, NULL, NULL); 

        result = sqlite3_exec(DataBase,"SELECT user_id FROM USER;", NULL, NULL, NULL);
        if(result == SQLITE_OK)
        {
            cout<<"sqlite3_exec success"<<endl;
        }        
        else 
        {
                    cout<<"sqlite3_exec failed"<<endl;
                    cout<<"sqlite3_exec returns "<<result<<endl;

            }       

    }
}

我可以使用命令行:

./sqlite3 encrypted.db
PRAGMA key = 'testkey';
SELECT user_id FROM USER;

我使用以下方法加密了我的access.db

./sqlite3 access.db 
sqlite> ATTACH DATABASE 'encrypted.db' AS encrypted KEY 'testkey'; 
sqlite> SELECT sqlcipher_export('encrypted'); 
sqlite> DETACH DATABASE encrypted; 

我不知道为什么我能够使用命令行而不是c ++代码执行相同的操作。如果我做错了,请告诉我。

也请让我知道,如果我必须访问加密数据库然后我应该首先解密它,然后我应该读取明文数据库,有没有我可以直接用于读取加密数据库的API?

感谢任何帮助。

感谢,

2 个答案:

答案 0 :(得分:0)

如果要发出PRAGMA key命令,则必须在C ++应用程序中引用密码短语值。检查您提交的样本,您还没有这样做。或者,您可以拨打sqlite3_key

答案 1 :(得分:0)

最后我能够做到。在执行我的程序时,我还需要包含-lsqlciper。添加成功执行代码。 我使用它构建它 “ g ++ testSQLCipher.cpp -I / usr / local / include -L / usr / local / lib -lsqlcipher -L / usr / lib / i386-linux-gnu -ldl -o testSQL