2010-07-06 122 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%正確的,但是它給了我一個好主意,如果你不使用註釋,可以用另一種方法來做,但我認爲我的觀點很清楚;)