【发布时间】:2013-02-22 12:22:27
【问题描述】:
我在我的 Xoom 平板电脑上编写了一个简单的 Android 应用程序,它只是将一些字符串注释存储在 SQLCipher 数据库中。
提示用户输入密码短语,SQLCipher 库将使用该密码短语。到目前为止,这工作正常且非常顺利。
现在我还实现了一个用于身份验证的小型 PBKDF2 算法 (事实上,我想在将来加密一些其他文件,这些文件不能存储在数据库中)。 但就目前而言,我只是来检查我的 pbkdf2 算法是否正确。 我只使用了 javax.crypto 和 java.security 库。
代码sn-p如下:
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 函数等)?
提前谢谢你 p.s: 对不起,我的英语还不是很好!
编辑:
对不起,我不够清楚:-)
我知道 PBKDF2 应该很慢(特别是迭代量,以减慢蛮力攻击),这正是我要问的原因!我想将迭代次数设置为 5000(这是不可接受的,超过 15 秒)
我只是想知道,因为正如我所说,SQLCipher 还使用 PBKDF2(迭代 = 4k,而我使用 500)从给定密码派生密钥。最后我不是在谈论使用 AES 加密,它只是关于派生密钥的差异。
当然,SQLCipher 似乎比自制的密钥导出函数快得多,但我不认为会有这么大的不同,因为 SCLCipher 的 PBKDF2 确实可以即时运行!
您好!
【问题讨论】:
-
欢迎来到 IT 安全 StackExchange!我投票结束了这个问题,因为它似乎是一个编程问题而不是安全问题!如果某个模组同意我的观点,它将为您迁移到 StackOverflow。
-
好吧,谢谢你,对不起! :)