我在我的 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 真的可以即时工作!
问候!