sqlcipher:无法访问提供十六进制密钥的数据库

发布于 2024-10-27 04:07:52 字数 648 浏览 0 评论 0原文

我正在尝试使用 sqlcipher 创建数据库,然后使用密码密钥的十六进制值访问它。 根据github(https://github.com/sjlombardo/sqlcipher)的描述,密钥通过sha256算法进行哈希处理,然后用于加密数据库。可以选择通过 PRAGMA 指令以纯格式和十六进制形式提供密钥。如果我使用普通版本,一切正常,但我无法使用十六进制键值访问数据库。 例如,在我的例子中,键是“demo”,当我使用 PRAGMA key='demo' 时,一切正常。 我得到了 sha256:

echo -n 演示 |沙苏姆-a256 2a97516c354b68848cdbd8f54a226a0a55b21ed138e207ad6c5cbb9c00aa5aea

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

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

但这不起作用。

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

I'm trying to create DB using sqlcipher and then access it by using hex value of password key.
According to description from github (https://github.com/sjlombardo/sqlcipher) key is hashed by sha256 algorithm and then used to cipher DB. There is a choice to provide the key in plain and hex form through PRAGMA directive. And if I use plain version it all works correctly, but I unable to access DB with hex key value.
For example in my case key is 'demo' and when I use PRAGMA key='demo' all works.
I got sha256 with:

echo -n demo | shasum -a256
2a97516c354b68848cdbd8f54a226a0a55b21ed138e207ad6c5cbb9c00aa5aea

and then provided it to PRAGMA directive according to instructions in sqlite3_exec call:

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

but this doesn't work.

What is the hex value of key should I provide to PRAGMA directive?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

帝王念 2024-11-03 04:07:52

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

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

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

我将来会尝试更新自述文件以使这一点更加清晰。

The results of pragma key when passed a text value vs a raw hex value are not interchangeable.

  • If you provide a text key via PRAGMA key='demo', SQLCipher uses PBKDF2 to derive the key data (see http://sqlcipher.net/design). This uses a random per-database salt and 4000 iterations by default.
  • If you provide a hex key then SQLCipher uses the binary value as the key directly with no derivation.

Thus, the actual encryption key will be quite different beween the two modes you mentioned. If you are not sure which to use, you should probably default to using the first method, as the key derivation step provides a greater level of protection against brute force and dictionary attacks.

I'll try to update the readme in the future to make this more clear.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文