2010-07-06 431 views
5

我正在制作一个Web服务,它将为数据库表中的每条记录存储公钥和私钥。将公钥和私钥存储在数据库或密钥库中

这些密钥是使用Java创建的,但我不确定天气如何创建密钥库或将密钥直接放在数据库中的字段内。

你会推荐什么样的选择,每种方法有哪些好处?

回答

5

如果您使用密钥库,则将使用旨在保留加密项目(如密钥和证书)的数据库。

只要有可能,您不应该尝试重新发明轮子。密钥存储是否足以解决您的问题?如果您尝试设计自己的数据库来存储这些工件,那么您将不得不重新解决创建数据库(如Java的密钥存储库)时已经考虑到的问题和问题。

+0

我的表中的每条记录都需要以某种方式链接到密钥库中的密钥。即。我需要一种方法来自动将密钥从密钥库(以及来自数据库的信息)中提取出来并对消息进行加密,然后将其发回给用户。那么我应该将密钥库密码存储在数据库记录中吗?我如何以安全的方式解决这个问题?你看到的不仅仅是每行公钥/私钥,我还有ID,价格,名字等等。 – jax 2010-07-06 09:06:14

1

为什么每个记录都有私钥?这是非常奇怪的设计。私钥通常由实体持有,例如,人员或代表他们的服务器。

+0

每条记录​​代表一个应用程序。所以每个应用程序都有自己的私钥和公钥。 – jax 2010-07-07 05:01:34

0

你可以有一个数据库来存储用户信息而不是密钥,对于密钥,最好使用密钥库。因此userinfo可能包含{name,symmetric pass/hash,...}并使用名称应该能够识别密钥库中的密钥记录。再次记住,不要使用全局(用户,密码)来读取密钥库,而是使用用户授权。

2

您可以提供keystores到现有的通过http发送数据的实现,它将获取密钥库并执行所有必要的操作,所以您不必这样做。 对于服务器端验证,这将是一个keystore = KeyStore.getInstance(“JKS”),它包含所有可信证书。

对于客户端验证(如果适用)(您需要验证自己),此类实现已存在 您只需提供客户端'keystore'=>这一个将包含您的证书并且它的私钥=> KeyStore。 getInstance(“PKCS12”)

然后最后你想把这些东西存储到数据库中,这里有点棘手..密钥库是安全的,所以你不能只是把它写出来..你必须使用密钥库。存储(OutPutstream,密码)..

我觉得最好的是,例如:

@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%正确的,但是它给了我一个好主意,如果你不使用注释,可以用另一种方法来做,但我认为我的观点很清楚;)