在研究我将使用的KeyStore(JCEKS或PKCS12)时,我得出的结论是Java JRE8的KeyStore接口(以及之前的7)使用SecretKey对象作为输入和输出参数来存储KeyStore中的SecretKey条目(这是有道理的。)
然而,根据这个document of Oracle,在SecretKeyFactory中应该支持AES算法,但是没有。 由于this Oracle Bug report显示其他人在Windows和Linux中检测到此问题,但显然不使用KeyStore的人更喜欢从支持的SecretKeyFactory列表中删除AES,而不是实现AES KeyFactory。
因此,可以使用4个Java实现的KeyStore中的NON,包括我在上面提到的丰富方式。一个是FORCED在刚刚生成时存储SecretKey对象,因为KeyGenerator支持AES算法,但是人们不能对密钥执行某些操作,之后,通过设置正确的SecretKeySpec,从RAW密钥“factor”获取SecretKey一个Keyfactory。
可能很多,我使用SecretKeySpec对象解决其他函数(Mac,Cipher等),因为它有一个getEncoded()方法。
是否有人知道将SecretKeySpec对象转换为SecretKey对象的技巧,然后使用SecretKeyFactory。关于所有这些的STUPID事情是支持单个DES等破碎的算法,但Oracle负责人发现它,我引用“错误”来拥有AES KeyFactory。
例如,可以用BouncyCastle来规避这个问题。我将它用于密码部分和安全随机播种,所以我不妨将它用作AES的KeyFactory。但是,它也拒绝使用AES作为KeyFactory的算法。可能SPI已经过滤掉了它。
也可能是因为我没有完全掌握为什么AES KeyFactory存在错误,并且可能有另一种方法使用SecretKeySpec对象为KeyStore设置对称密钥,但我没有找到它