什么“SecretKeyFactory不可用”的意思?
这有什么问题?
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.(DashoA13*..) at javax.crypto.SecretKeyFactory.getInstance(DashoA13*..) ...
这是一个经过validation的java bug。 请参见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。
你真的不需要使用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,除非这是一个游戏项目,两者都有缺点并被认为是过时的。
并非所有版本的Java都在其默认提供程序中为“AES”提供SecretKeyFactory
。
如果要生成新密钥,请从SecureRandom
实例中选择所需的位数(128,192或256),并使用该随机数初始化SecretKeySpec
实例。
如果您使用基于密码的加密,请为“PBKDF2WithHmacSHA1”算法创建SecretKeyFactory
,并使用它来初始化SecretKeySpec
实例,如此处所示。