8.2. 从 vault 消耗值
库包含敏感数据,红帽单点登录会相应地对待 secret。在访问机密时,该 secret 仅从 JVM 内存中获取并保留在 JVM 内存中。然后,所有可能都尝试从 JVM 内存丢弃其内容。这可以通过在 try
-with-resources 语句中使用 vault secret 来实现,如下所示:
char[] c; try (VaultCharSecret cSecret = session.vault().getCharSecret(SECRET_NAME)) { // ... use cSecret c = cSecret.getAsArray().orElse(null); // if c != null, it now contains password } // if c != null, it now contains garbage
这个示例使用 KeycloakSession.vault ()
作为用于访问 secret 的入口点。直接使用 VaultProvider.obtainSecret
方法也可以直接使用。但是 vault ()
方法具有能够解释原始 secret (通常是字节阵列)的功能,作为字符数组(via vault ().getCharSecret ()
)或一个 String
(via vault ().getStringSecret
()),除了获取原始未中断的值(通过 vault ().getRawSecret ()
方法)。
请注意,由于 String
对象是不可变的,因此无法通过使用随机垃圾回收来覆盖其内容丢弃。虽然在默认的 VaultStringSecret
实现中已采取措施以防止内部使用字符串,但
对象中存储的 secret 至少将变为下一个 GC 轮流。因此,最好使用纯字节和字符数组和缓冲区。
String