为什么我的pbkdf2实现如此缓慢(与SQLCipher相比)?

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

系统将提示用户input将由SQLCipher库用于数据库的密码。 这工作得很好,非常顺利。

现在我还实现了一个小的PBKDF2algorithm用于身份validation(事实上,我想在将来encryption一些其他文件,这些数据库不能存储)。 但就目前而言,我只是来检查我的pbkdf2algorithm是否正确。 我只使用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(); 

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

所以我硬编码密钥和盐,并比较derivedKey进行身份validation(只有一个testing用例!)

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

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

问题是,我是否实现了效率低下,还是因为SQLCipher在性能上很好(原生NDK函数等)?

先谢谢你ps:对不起,我的英文不是那么棒!

编辑:

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

我知道PBKDF2应该是缓慢的(在具体的迭代量,减缓蛮力攻击),这正是我问的原因! 我想设置迭代数字可以说5000(这是不可接受的,超过15秒)

我只是想知道,因为,正如我所说,SQLCipher也使用PBKDF2(Iteration = 4k,而我使用500 )从一个给定的密码派生密钥。 我不是最后谈到用AESencryption,只是关于推导密钥的区别。

当然,SQLCipher比自制的keyderivingfunction要快得多,但是我不认为它会有这么大的差别,因为SCLCipher的PBKDF2真的能够立即工作!

问候!

Solutions Collecting From Web of "为什么我的pbkdf2实现如此缓慢(与SQLCipher相比)?"

那么(见下文)并不完全是你的问题,PBKDF2是慢的,但应该是在这个硬件上的那些参数所描述的缓慢 。 这里有一些关于Android PBE / KDF性能的统计(和技巧): http : //nelenkov.blogspot.com/2012/04/using-password-based-encryption-on.html 。 SecretKeyFactory性能问题不是未知的: LVL和AESObfuscator可怕的SecretKeyFactory性能的任何方式? 。

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

  • 它使用OpenSSL编译的本地代码(在我的桌面上, OpenSSL的PBKDF2比JVM6 SecretKeyFactory版本快2000倍,不包括JVM启动时间,我还没有比较AES的速度,看起来其他人也觉得它在Android上慢)
  • 4000次迭代PBKDF2仅在数据库打开时完成,此后页面HMAC秘密至多有2次迭代(假设默认configuration,如logging)

你的代码似乎是正确的,当你增加迭代时,不应该有这么大的(线性的)性能下降。 Xoom应该使用JIT运行一个非古老的JVM,可以用其他代码来validation性能问题吗?


PBKDF2被devise得很慢(见这个问题的答案https://security.stackexchange.com/questions/7689/clarification-needed-for-nists-whitepaper-recommendation-for-password-based-ke )由于预期的关键拉伸操作。 迭代计数器可以让你安全的交换速度。

AES总是希望速度更快 ,速度更快( 速度比较PDF ,选定的AES候选者在该论文中被称为Rijndael )。

我假设你将PBKDF2的计算时间直接与SQLCipher数据库上执行SQL操作所用的时间进行比较,该数据库几乎肯定会devise得很快。

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

好吧,我想清楚是什么问题。

如果我从我的电脑断开设备,它即刻工作。 另外如果我之后重新连接。

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

可能是因为debugging模式或者其他原因,其实我真的不知道!

无论如何,多亏了先生。 希望这有助于未来的人:-)