密钥材料和实际密钥之间的区别

时间:2014-11-21 15:08:41

标签: java cryptography

我对使用Java库生成密钥时的密钥材料感到困惑,

根据SecretKeySpec文档,

public byte[] getEncoded()
  

返回此密钥的密钥材料。

究竟什么是关键材料? ,因为如果我尝试打印这样的任何键,

System.out.print(secretKey.getEncoded())

我得到奇怪的输出,如

s[B@541187f9

但是当我使用任何编码方案打印它时,比如Base64,Base16,我得到了实际的密钥。

任何人都可以解释一下真正的关键材料吗?

1 个答案:

答案 0 :(得分:3)

SecretKeySpec用于对称算法。那些算法只有一个键是一个字符串。在Java中,它表示为字节数组(byte[])。非对称算法密钥的编码为different

byte[] keyBytes = /* set the key somehow */;
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
Arrays.equals(keyBytes, keySpec.getEncoded()); // true

至于"怪异的"输出,数组不能在Java中打印,因此只打印引用。如果您甚至想要专门打印byte[],这也行不通,因为通常文本应该只使用可打印的字符。这就是为什么将它编码为Base64可以让你打印密钥,但也会使密钥膨胀。

在文档中,他们可能会讨论关键的材料,因为它返回实际的关键字节,而没有其他信息,例如密钥对应的算法。