用于导出加密密钥的规范方法

时间:2015-09-23 13:11:46

标签: android encryption cryptography

我想知道在Android上使用KDF生成密钥的规范方法是什么。 JCA提供了一个SecretKeyFactory,在this post中概述,该方法看起来像

public byte[] deriveKey(String password, byte[] salt, int keyLen) {
    SecretKeyFactory kf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    KeySpec specs = new PBEKeySpec(password.toCharArray(), salt, 1024, keyLen);
    SecretKey key = kf.generateSecret(specs);
    return key.getEncoded();
}
但是,它并没有指定回合数。这是规范方法吗?

1 个答案:

答案 0 :(得分:1)

在上述方法中,轮数明显为1024。然而,它确实意味着该方法使用太少的轮次。今天通常选择大约10K到40K的任何东西,越高越好。

作为基于密码的密钥派生函数,PBKDF2可能是最好的标准化函数。但它需要配置参数。没有为PBKDF2指定散列函数,字符编码,迭代计数和输出大小。虽然没有规范的方法,但上述功能还有很长的路要走,支持ASCII(UTF-8的子集)和SHA-1。 bcrypt和scrypt也很常见。

请注意,还存在基于密钥的KDF(KBKDF),但它们通常不在库中。如果输入熵足够大以至于不需要迭代计数和可能的哈希,则应该选择它们,例如,在达成密钥协议后。