Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 使用SQLCipher将加密数据库附加到未加密数据库_Iphone_Encryption_Sqlite_Sqlcipher - Fatal编程技术网

Iphone 使用SQLCipher将加密数据库附加到未加密数据库

Iphone 使用SQLCipher将加密数据库附加到未加密数据库,iphone,encryption,sqlite,sqlcipher,Iphone,Encryption,Sqlite,Sqlcipher,我正在尝试使用SQLCipher将未加密的sqlite3数据库的内容添加到加密的数据库中。我已经把我想做的事情建立在和的基础上。然而,有几件事我还不清楚 在第行“附加数据库”中,加密数据库是否必须为.db类型?是否可以使用.sqlite来匹配我的原始数据库 所述加密数据库必须已经存在吗?如果是,它应该在应用程序中的什么位置?我是否必须提供文件路径(文档目录等) 在哪里可以找到成功加密的数据库?它将被保存在哪里 这是我的密码: + (void)encryptDB { sqlite3 *un

我正在尝试使用SQLCipher将未加密的sqlite3数据库的内容添加到加密的数据库中。我已经把我想做的事情建立在和的基础上。然而,有几件事我还不清楚

  • 在第
    行“附加数据库”
    中,加密数据库是否必须为
    .db
    类型?是否可以使用
    .sqlite
    来匹配我的原始数据库

  • 所述加密数据库必须已经存在吗?如果是,它应该在应用程序中的什么位置?我是否必须提供文件路径(文档目录等)

  • 在哪里可以找到成功加密的数据库?它将被保存在哪里

  • 这是我的密码:

    + (void)encryptDB
    {
        sqlite3 *unencrypted_DB;
        NSString *path_u = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] 
                      stringByAppendingPathComponent:@"dict.sqlite"];
    
        if (sqlite3_open([path_u UTF8String], &unencrypted_DB) == SQLITE_OK) {
            NSLog(@"Database Opened");
            // Attach empty encrypted database to unencrypted database
            sqlite3_exec(unencrypted_DB, "ATTACH DATABASE 'dict_encrypted.sqlite' AS encrypted KEY '1234';", NULL, NULL, NULL);
    
            // Create new tables within encrypted database to match those in unencrypted database
            sqlite3_exec(unencrypted_DB, "CREATE TABLE encrypted.t1(A,B,C);", NULL, NULL, NULL);
    
            // Copy items from unencrypted database into encrypted database
            sqlite3_exec(unencrypted_DB, "INSERT INTO encrypted.t1 SELECT * FROM t1;", NULL, NULL, NULL);
    
            // Detach encrypted database
            sqlite3_exec(unencrypted_DB, "DETACH DATABASE encrypted;", NULL, NULL, NULL);
    
            NSLog (@"End database copying");
            sqlite3_close(unencrypted_DB);
        }
        else {
            sqlite3_close(unencrypted_DB);
            NSAssert1(NO, @"Failed to open database with message '%s'.", sqlite3_errmsg(unencrypted_DB));
        }
    }
    

    嗯,我从来没有做过附加数据库,我使用的SQLCiper版本可能与您的不同,但是(对于我处理过的SQLCipher的实现),文件打开逻辑是标准的SQLite,其行为方式与没有SQLCipher的情况相同

    因此,您不需要后缀
    .db
    或任何其他特定的名称,您可以使用任何您想要的名称

    在发出
    REKEY
    之前,任何新数据库都是完全“正常”的,并且将以“正常”的方式为SQLite创建/删除

    重新
    ATTACH数据库
    ,我想最好先创建数据库(并
    REKEY
    it),然后再附加它

  • 加密数据库是否必须为.db类型不,你可以使用任何你想要的扩展
  • 所述加密数据库必须已经存在吗?-否数据库不需要已经存在。当您附加一个不存在的数据库时,它将创建一个新的数据库
  • 我是否必须提供文件路径(文档目录等)?-是的,您确实需要提供数据库的路径,否则将使用应用程序的当前工作目录。在iOS上,通常应提供文件名的完整路径,包括应用程序文档目录
  • 在哪里可以找到成功加密的数据库?-加密数据库将位于您让attach放置的任何位置。根据#3,如果您正在构建iOS,请在文件名中包含文档目录的完整路径,然后加密数据库将位于其中

  • 在最新版本的SQLCipher中,我们提供了SQLCipher_export()函数,该函数可以缩短代码,并且不会连接到现有的数据库结构:

    + (void)encryptDB
    {
        sqlite3 *unencrypted_DB;
        NSString *path_u = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] 
                             stringByAppendingPathComponent:@"dict.sqlite"];
    
        if (sqlite3_open([path_u UTF8String], &unencrypted_DB) == SQLITE_OK) {
            NSLog(@"Database Opened");
            // Attach empty encrypted database to unencrypted database
            sqlite3_exec(unencrypted_DB, "ATTACH DATABASE 'dict_encrypted.sqlite' AS encrypted KEY '1234';", NULL, NULL, NULL);
    
            // export database
            sqlite3_exec(unencrypted_DB, "SELECT sqlcipher_export('encrypted');", NULL, NULL, NULL);
    
            // Detach encrypted database
            sqlite3_exec(unencrypted_DB, "DETACH DATABASE encrypted;", NULL, NULL, NULL);
    
            NSLog (@"End database copying");
          sqlite3_close(unencrypted_DB);
        }
        else {
            sqlite3_close(unencrypted_DB);
            NSAssert1(NO, @"Failed to open database with message '%s'.", sqlite3_errmsg(unencrypted_DB));
        }
    }
    

    我想我很好奇,为什么你的第二份参考资料说要使用这种技术,而不仅仅是
    REKEY
    来加密现有的数据库。我们的SQLCipher实现可以很好地处理现有数据库的
    REKEY
    。回答得很好。非常感谢你。我的另一个问题是,我是否应该在单独的程序中加密数据库,并将此数据库添加到我想要使用的应用程序中?
    “将数据库'dict_encrypted.sqlite'作为加密密钥'1234'附加;
    dict_encrypted.sqlite应该替换文档的路径。