【发布时间】:2014-08-30 09:57:58
【问题描述】:
我想使用 PBKDF2WithHmacSHA1 生成密钥,但是在 android 上计算需要很长时间。我在 iOS 上使用相同数量的迭代和普通加密,大约需要 6 秒,而在 android 上需要 100 秒。
代码如下:
public static String generateStorngPasswordHash(String password)
{
try
{
char[] chars = password.toCharArray();
byte[] salt = getSalt();
PBEKeySpec spec = new PBEKeySpec(chars, salt, 1010101, 32 * 8);
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
byte[] hash = skf.generateSecret(spec).getEncoded();
return toHex(salt) + ":" + toHex(hash);
} catch (Exception e)
{
Logger.e("Exception: Error in generating password" + e.toString());
}
return "";
}
private static byte[] getSalt() throws NoSuchAlgorithmException
{
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
byte[] salt = new byte[32];
sr.nextBytes(salt);
return salt;
}
如果此代码有任何问题,请告诉我?
编辑
还有一件事,我也在我的应用程序中使用 sqlCipher。他们使用 openssl 来计算 PKDF2,我在某处读到 openssl 实现比 java 实现更快地找到 PKDF2。所以我的问题是:
- openssl 可以在 android 上给我更好的性能,这是真的吗?
- 我可以使用 sqlCipherg 中使用的 openssl 实现吗?
- 如果是,我如何通过 openssl 使用 caclulate PKDF2?
- 如果否,我如何使用 openssl 在 android 中查找 PBKDF2WithHmacSHA1。我有
在网上搜索但没有找到任何示例。
【问题讨论】:
-
该代码没有问题。这是一个小时内关于慢速 android 加密的第二个问题,请查看the first and questions linked to it。
-
您使用什么安卓手机进行测试?希望你不是在谈论模拟器......
-
你确定iOS代码是等价的吗?在 3.6GHz Core i5 上的 J2SE 中执行 generateStorngPasswordHash() 大约需要 2.2 秒...
-
我正在三星 Galaxy S4 上测试这个东西。在 iOS 上,我使用的是 CommonCrypto。有没有其他方法可以加快速度?
标签: android cryptography sqlcipher pbkdf2