什么“SecretKeyFactory不可用”的意思?

时间:2011-12-06 08:25:58

标签: java security encryption

这有什么问题?

for (Object obj : java.security.Security.getAlgorithms("Cipher")) {
  System.out.println(obj);
}
javax.crypto.SecretKeyFactory.getInstance("AES");

这是输出(Mac OS 10.6上的JDK 1.6):

BLOWFISH
ARCFOUR
PBEWITHMD5ANDDES
RC2
RSA
PBEWITHMD5ANDTRIPLEDES
PBEWITHSHA1ANDDESEDE
DESEDE
AESWRAP
AES
DES
DESEDEWRAP
PBEWITHSHA1ANDRC2_40

java.security.NoSuchAlgorithmException: AES SecretKeyFactory not available
 at javax.crypto.SecretKeyFactory.<init>(DashoA13*..)
 at javax.crypto.SecretKeyFactory.getInstance(DashoA13*..)
 ...

3 个答案:

答案 0 :(得分:5)

这是经过验证的java错误。见http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7022467

编辑:不同的Java版本支持不同的算法,您也可以使用自定义提供程序扩展它等等。 Oracle在这里有一个java 6的列表http://docs.oracle.com/javase/6/docs/technotes/guides/security/SunProviders.html。对于KeyFactory,这是DSA。

答案 1 :(得分:4)

您实际上不需要使用SecretKeyFactory。您可以使用以下内容创建AES密钥;

byte[] keyData = ........ 
SecretKeySpec key = new SecretKeySpec(keyData, "AES");

如果要进行基于密码的加密(PBE),则只需选择一种安全散列算法,该算法为您提供与所需密钥大小相同的散列。例如,如果您想要一个256位密钥用于AES,这里有一个构建密钥的方法;

private Key buildKey(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException {
  MessageDigest digester = MessageDigest.getInstance("SHA-256");
  digester.update(password.getBytes("UTF-8"));
  byte[] key = digester.digest();
  SecretKeySpec spec = new SecretKeySpec(key, "AES");
  return spec;
}

修改
我建议不要使用MD5和DES,除非这是一个游戏项目,两者都有缺点并被认为是过时的。

答案 2 :(得分:2)

并非所有版本的Java都在其默认提供程序中为“AES”提供SecretKeyFactory

如果要生成新密钥,请从SecureRandom实例中选择所需的位数(128,192或256),并使用该随机数初始化SecretKeySpec实例。

如果您使用的是基于密码的加密,请为“PBKDF2WithHmacSHA1”算法创建SecretKeyFactory,并使用它将SecretKeySpec实例初始化为illustrated here.