我对使用Java库生成密钥时的密钥材料感到困惑,
根据SecretKeySpec文档,
public byte[] getEncoded()
返回此密钥的密钥材料。
究竟什么是关键材料? ,因为如果我尝试打印这样的任何键,
System.out.print(secretKey.getEncoded())
我得到奇怪的输出,如
s[B@541187f9
但是当我使用任何编码方案打印它时,比如Base64,Base16,我得到了实际的密钥。
任何人都可以解释一下真正的关键材料吗?
答案 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可以让你打印密钥,但也会使密钥膨胀。
在文档中,他们可能会讨论关键的材料,因为它返回实际的关键字节,而没有其他信息,例如密钥对应的算法。