java - key Material 与实际 key 之间的差异

标签 java cryptography

使用 Java 库生成 key 时,我对 Key Material 是什么感到困惑,

根据 SecretKeySpec 文档,

public byte[] getEncoded()

Returns the key material of this secret key.

关键 Material 到底是什么? ,因为如果我尝试打印这样的任何键,

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

我得到奇怪的输出,例如,

s[B@541187f9

但是当我使用任何编码方案(例如 Base64、Base16)打印它时,我得到了实际的 key 。

谁能解释一下关键 Material 到底是什么?

最佳答案

SecretKeySpec 用于对称算法。这些算法只有一个 key ,即一位字符串。在 Java 中,它表示为字节数组 (byte[])。非对称算法 key 的编码为different .

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

至于“奇怪”的输出,数组在 Java 中不可打印,因此仅打印引用。如果您甚至想专门打印 byte[] 这也不起作用,因为通常文本应该只使用可打印的字符。这就是为什么将其编码为 Base64 可以让您打印 key ,但也会增加 key 。

在文档中,他们可能会谈论 key Material ,因为它返回实际的 key 字节,而没有附加信息,例如 key 对应的算法。

关于java - key Material 与实际 key 之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27064383/

相关文章:

java - 如何用java分割wmv文件

java - 在浏览器中显示 Sh 脚本输出

java - 为给定的唯一数字列表/集合/数组生成唯一 ID

java - 如何解密 SHA-256 加密字符串?

java - 为什么保存并重新加载 KeyStore 后 Key.getAlgorithm 返回不同的结果

cryptography - 用于 CVC3 生成的 EMV 芯片中存储的应用程序事务计数器是否有最大值?如果是,该值是否会随时重置?

java - Java 接口(interface)通过设计来强制执行其实现者的未知方法的输出类型?

java - Thread.sleep() 的意外行为

java - Spring Security 3 的 AuthenticationSuccessHandler 示例

c - Feige Fiat Shamir 计划不起作用