Java 密钥库使用的基本问题
我有一个生成加密密钥的应用程序,每个客户端一个。这些需要保存在我们的数据库中。我真的不熟悉常见的安全模式或实现,我正在寻求建议 KeyStore类似乎被广泛使用,特别是用于保护SecretKeys。然而,我很少提到在数据库中使用KeyStore,我试图弄清楚这是因为它是基本用法(因此没有提到),还是因为这是一种不好的或冗余的方法,我真的应该使用另一种技术 基本设计是每个用户都有自己的密钥库,通过转换为字节(我认为使用load()和store())将密钥库保存/加载到数据库中或从数据库中加载密钥库 到目前为止,这个设计有什么问题吗?我还想知道如何处理密钥库的密码。我们考虑对所有密钥库只使用一个密码,但是在没有密钥库的情况下如何安全地存储这个密码呢Java 密钥库使用的基本问题,java,database,keystore,Java,Database,Keystore,我有一个生成加密密钥的应用程序,每个客户端一个。这些需要保存在我们的数据库中。我真的不熟悉常见的安全模式或实现,我正在寻求建议 KeyStore类似乎被广泛使用,特别是用于保护SecretKeys。然而,我很少提到在数据库中使用KeyStore,我试图弄清楚这是因为它是基本用法(因此没有提到),还是因为这是一种不好的或冗余的方法,我真的应该使用另一种技术 基本设计是每个用户都有自己的密钥库,通过转换为字节(我认为使用load()和store())将密钥库保存/加载到数据库中或从数据库中加载密钥库
这意味着要在后端应用程序中使用,客户端永远不会向我们传输密码,服务器端也没有人工操作员提供密码 在现实世界中,如果要安全地存储密钥,则密钥会安全地存储在一个存储库中,存储时间会延长(从数小时到数年不等)。有一个标准旨在帮助与此类系统进行接口,但我要说的是,大多数HSM都有自己喜欢的与HSM接口的机制,而PKCS#11接口通常是一个残废的接口 密钥也可以安全地存储在智能卡和USB令牌等其他设备中,但这是为了在大众中分发密钥,而不是用于后端系统的密钥存储 然而,并不是每个人都能得到HSMs的预算,并且使用了许多其他不太安全(而且显然更便宜)的替代品。一些系统(我将以Glassfish应用服务器为例)存储主密码,用于保护其他密码。这同样适用于密钥-将有一个主密钥用于保护其他密钥(在某种程度上,这类似于HSMs内部的工作方式)。当然,你会被困在保护主钥匙上。在某些环境中,这很容易,因为您可以将密钥放在一个仅限于系统管理员和应用程序的文件中,而不限于其他人
免责声明:所有这些都不应被视为盲目接受的建议:-)。如果您的密钥需要不惜一切代价进行保护,请投资于HSM。因此您使用的是java和密钥库 你有两个问题我理解正确吗 1) 你需要一些建议 2) 您想知道如何将这些内容存储到数据库中吗 回答问题1: 因此,在使用java时,您需要使用SSL。Java已经实现了通过https进行通信的类,它将为您执行SSL握手和所有操作!您唯一需要做的就是为这个实现提供java.security.KeyStore 基本上有两种类型的密钥存储:
- 第一个是存储您信任的所有证书(多个证书)=>Keystore.getInstance(“JKS”)
- 第二种方法是使用私钥=>Keystore.getInstance(“PKCS12”)保存客户端证书(仅一个)
@Entity
public class MyKeyStoreClass {
private Long id;
@Transient
private KeyStore keystore;
private String passwordForKeyStore;
private Byte[] keyStoreAsBytes;
@PreUpdate
@PrePersist
public void concertKeyStoreToBytes() {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
keystore.store(byteArrayOutputStream,
passwordForKeyStore.toCharArray());
keyStoreAsBytes = byteArrayOutputStream.toByteArray();
}
@PostLoad
public void getKeyStore() {
if (keystore == null && keyStoreAsBytes != null) {
keyStore = KeyStore.getInstance(getKeystoreType().getType());
keyStore.load(new ByteArrayInputStream(keystoreAsBytes), passwordForKeyStore.toCharArray());
}
}
上面的代码可能不是100%正确,因为我是在这里编写的(没有编辑器)。但这通常是你能做到的,我以前做过,而且效果很好;)
注意,我的Spring配置在持久化或更新之前或之后执行带注释的方法。如果不使用注释和spring,可以通过另一种方式实现