Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 密钥库使用的基本问题_Java_Database_Keystore - Fatal编程技术网

Java 密钥库使用的基本问题

Java 密钥库使用的基本问题,java,database,keystore,Java,Database,Keystore,我有一个生成加密密钥的应用程序,每个客户端一个。这些需要保存在我们的数据库中。我真的不熟悉常见的安全模式或实现,我正在寻求建议 KeyStore类似乎被广泛使用,特别是用于保护SecretKeys。然而,我很少提到在数据库中使用KeyStore,我试图弄清楚这是因为它是基本用法(因此没有提到),还是因为这是一种不好的或冗余的方法,我真的应该使用另一种技术 基本设计是每个用户都有自己的密钥库,通过转换为字节(我认为使用load()和store())将密钥库保存/加载到数据库中或从数据库中加载密钥库

我有一个生成加密密钥的应用程序,每个客户端一个。这些需要保存在我们的数据库中。我真的不熟悉常见的安全模式或实现,我正在寻求建议

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”)保存客户端证书(仅一个)

你如何制作你的私钥和证书,我在这里不讨论。我想你已经在那里了。。(如果没有,你可以找到答案)。但是密钥库是受密码保护的。因此,如果没有人能够入侵你的数据库,那么一般来说,它们是安全的。如果您将打开密钥库的密码存储在同一个表中,请注意sql注入! 但我们假设这是安全的。。密钥库使您能够使用将处理SSL握手的现有实现。所以基本上,使用密钥库并不是一件坏事。注意:顺便说一句,只有在需要相互身份验证时(意味着您还需要标识自己),您才会使用PKCS12密钥库

回答问题2: 是的,您可以将密钥存储在数据库中,这有点棘手。因为密钥库只允许它们使用存储和加载方法。但你可以这样做:

@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,可以通过另一种方式实现