7

我在我的 Xoom 平板电脑上编写了一个简单的 Android 应用程序,它只是将一些字符串注释存储在 SQLCipher 数据库中。

系统会提示用户输入密码短语,SQLCipher 库将使用该密码短语。到目前为止,这工作正常并且非常顺利。

现在我还实现了一个用于身份验证的小型 PBKDF2 算法(事实上,我想在将来加密一些其他文件,这些文件不能存储在数据库中)。但就目前而言,我只是来检查我的 pbkdf2 算法是否正确。我只使用了 javax.crypto 和 java.security 库。

代码片段如下:

int derivedKeyLength = 128;
int iterations = 500;
KeySpec spec = new PBEKeySpec(passphrase.toCharArray(), salt, iterations, derivedKeyLength);
SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
byte[] derivedKey = f.generateSecret(spec).getEncoded();    

salt 是一个 16 字节的随机数,由 SecureRandom 生成。

所以我硬编码了密钥和盐,并比较了派生密钥进行身份验证(只是一个测试用例!)

我现在的问题是,在我的 Xoom 上,它持续大约 5 秒,直到派生函数完成,尽管迭代只设置为 500。

AFAIK SQLCipher 默认使用 4000 的迭代次数,如果密钥错误或正确,它会立即响应。(如果我将迭代设置为 4000,则至少需要 15 秒)

问题是,我是否实现了效率低下或者是因为 SQLCipher 的性能非常好(本机 NDK 函数等)?

提前谢谢你 ps:对不起,我的英语还不是很好!

编辑:

对不起,我不够清楚:-)

我知道 PBKDF2 应该很慢(特别是迭代量,以减慢蛮力攻击),这正是我要问的原因!我想将迭代次数设置为 5000(这是不可接受的,超过 15 秒)

我只是想知道,因为,就像我说的,SQLCipher 还使用 PBKDF2(迭代 = 4k,而我使用的是500)从给定密码派生密钥。最后我不是在谈论使用 AES 加密,它只是关于派生密钥的区别。

当然,SQLCipher 似乎比自制的密钥导出函数要快得多,但我不认为会有这么大的不同,因为 SCLCipher 的 PBKDF2 真的可以即时工作!

问候!

4

2 回答 2

10

好的,这(见下文)不完全是您的问题,PBKDF2 很慢,但应该没有硬件上的这些参数描述的那么慢。这里有一些关于 Android PBE/KDF 性能的统计数据(和提示):http: //nelenkov.blogspot.com/2012/04/using-password-based-encryption-on.htmlSecretKeyFactory性能问题不是未知数:使用 LVL 和 AESObfuscator 可以解决糟糕的 SecretKeyFactory 性能问题吗?.

SecretKeyFactory很可能使用纯 Java 实现。SQLCipher有两个相关的特性:

  • 它使用 OpenSSL,编译的本机代码(在我的桌面上, OpenSSL 的 PBKDF2 在 2000 次迭代中比 JVM6SecretKeyFactory版本快近 100 倍,不包括 JVM 启动时间。我没有比较 AES 速度,看来其他人在 Android 上也觉得它很慢)
  • 4000 次迭代 PBKDF2 仅在数据库打开时完成,之后页面 HMAC 机密最多有 2 次迭代(假设默认配置,如文档所述)

您的代码似乎是正确的,当您增加迭代时,不应该有如此大的(线性?)性能下降。Xoom应该是用JIT 运行一个非古代的 JVM,你能用其他代码验证性能问题吗?


由于_ _ _ _意键拉伸操作。迭代计数器可让您以速度换取安全性。

AES 始终旨在快速且快速(速度比较 PDF,所选择的 AES 候选者在该论文中以其原始名称Rijndael引用)。

我假设您正在将 PBKDF2 计算时间直接与在 SQLCipher 数据库上执行 SQL 操作所花费的时间进行比较,这几乎肯定会被设计得很快。

您正在有效地比较具有不同要求的两种不同操作,因此速度差异。

于 2013-03-07T10:42:53.187 回答
2

好的,我弄清楚了问题所在。

如果我断开设备与 PC 的连接,它会立即工作。另外,如果我在那之后重新连接它。

现在即使迭代量5000以上,求导函数也只需要不到一秒!!这很棒,因为我的 Xoom 不是所有设备中最新的!

可能是因为调试模式还是什么,我真的不知道!

无论如何,感谢 mr.spuratic。希望这对将来的某人有所帮助:-)

于 2013-03-08T08:09:20.130 回答