sqlcipher:无法访问提供十六进制密钥的DB

时间:2011-03-25 08:37:15

标签: iphone sqlite encryption sqlcipher

我正在尝试使用sqlcipher创建数据库,然后使用密码密钥的十六进制值来访问它。 根据github(https://github.com/sjlombardo/sqlcipher)的描述,密钥由sha256算法进行哈希处理,然后用于密码数据库。可以通过PRAGMA指令以普通和十六进制形式提供密钥。如果我使用普通版本它都可以正常工作,但我无法访问具有十六进制键值的数据库。 例如,在我的情况下,密钥是'demo',当我使用PRAGMA key='demo'时,所有工作。 我得到sha256:

  

echo -n demo | shasum -a256   2a97516c354b68848cdbd8f54a226a0a55b21ed138e207ad6c5cbb9c00aa5aea

然后根据sqlite3_exec调用中的说明将其提供给PRAGMA指令:

sqlite3_exec(db, "PRAGMA key = x'2a97516c354b68848cdbd8f54a226a0a55b21ed138e207ad6c5cbb9c00aa5aea'", NULL, NULL, NULL);

但这不起作用。

我应该向PRAGMA指令提供什么是密钥的十六进制值?

1 个答案:

答案 0 :(得分:3)

传递文本值与原始十六进制值时,pragma键的结果不可互换。

  • 如果您通过PRAGMA key ='demo'提供文本密钥,SQLCipher使用PBKDF2来获取密钥数据(请参阅http://sqlcipher.net/design)。这默认使用随机的每数据库盐和4000次迭代。
  • 如果您提供十六进制密钥,则SQLCipher直接使用二进制值作为密钥而不进行派生。

因此,实际加密密钥在您提到的两种模式之间会有很大差异。如果您不确定使用哪种方法,则应该默认使用第一种方法,因为密钥派生步骤可以提供更高级别的保护,防止暴力破解和字典攻击。

我将在未来尝试更新自述文件,以便更清楚。