Java中的SecretKey
和SecretKeySpec
类有什么区别?为什么从Java中的密码派生密钥时需要SecretKeySpec?
的SecretKeySpec
文档说:
它可以用来从一个字节数组
构造生成SecretKey在该代码中,如果我打印secretKey.getEncoded()
或secret.getEncoded()
,在十六进制则两个给相同的输出。那么为什么我们需要SecretKeySpec
?
final String password = "test";
int pswdIterations = 65536 ;
int keySize = 256;
byte[] ivBytes;
byte[] saltBytes = {0,1,2,3,4,5,6};
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
PBEKeySpec spec = new PBEKeySpec(
password.toCharArray(),
saltBytes,
pswdIterations,
keySize
);
SecretKey secretKey = factory.generateSecret(spec);
SecretKeySpec secret = new SecretKeySpec(secretKey.getEncoded(),"AES");
这里是这两个调用的输出到getEncoded()
:
00367171843C185C043DDFB90AA97677F11D02B629DEAFC04F935419D832E697
实现“每SecretKey的具有相关联的算法的名称。” ,这不会使加密不太安全吗?不应该密钥应该是独立的算法?例如,如果某人获得了密钥,他们是不是可以识别用于加密的算法? – 2014-11-21 13:13:54
强大的密码学基于每个人都知道的一切,*除了*密钥的价值。一旦有人拥有了你的密钥,搞清楚你如何加密数据是一项微不足道的任务。所以不,你的算法不需要保密。 – 2014-11-21 14:15:40