是否可以使用Java Keystore存储密码,尤其是Web服务等? 我找到了有关存储SSL密钥的在线信息,但这对我的需求来说是过度杀戮。
答案 0 :(得分:1)
是的,根据密钥库的类型,您可以在SecretKeyEntry
中创建KeyStore
。 SunJCE提供程序实现了一个“JCEKS”密钥库,可以容纳密钥条目。
static byte[] getPassword(KeyStore ks, String alias, char[] master)
throws GeneralSecurityException, DestroyFailedException
{
if (!ks.entryInstanceOf(alias, KeyStore.SecretKeyEntry.class))
throw new IllegalArgumentException();
KeyStore.PasswordProtection pp = new KeyStore.PasswordProtection(master);
try {
KeyStore.SecretKeyEntry e = (KeyStore.SecretKeyEntry) ks.getEntry(alias, pp);
return e.getSecretKey().getEncoded();
}
finally {
pp.destroy();
}
}
static void setPassword(KeyStore ks, String alias, byte[] password, char[] master)
throws GeneralSecurityException, DestroyFailedException
{
SecretKey wrapper = new SecretKeySpec(password, "RAW");
KeyStore.SecretKeyEntry entry = new KeyStore.SecretKeyEntry(wrapper);
KeyStore.PasswordProtection pp = new KeyStore.PasswordProtection(master);
try {
ks.setEntry(alias, entry, pp);
}
finally {
pp.destroy();
}
}
一旦使用完密码,您应该小心将密码“归零”,就像我在try-finally块中的destroy()
实例PasswordProtection
一样。否则,像Target breach中使用的内存刮板更有可能获取密钥。