2012-04-30 184 views
3

語境:多租戶應用加密輸入的密鑰

特點:加密敏感數據

故事: 作爲租戶的管理員我想敏感的加密數據使用我自己的密碼或密碼短語,以便我和唯一的我完全控制使用的密鑰。

驗收標準:每個租戶的

  1. 管理員應該能夠定義密碼或密碼短語用於加密
  2. 只有佔有者管理員誰提供的原始密碼或密碼短語應該瞭解密鑰
  3. 一旦密碼或密碼短語由租戶管理員提供,應該安全地存儲它

我的問題

  1. 我們迄今已使用對稱密鑰加密與應用廣泛的關鍵硬編碼在應用程序中。如果每個租戶都想使用自己的密鑰,這將不再有用。我們如何讓每個用戶定義自己的密鑰?
  2. 如何以及在哪裏存儲密鑰?
  3. 是否將密碼/密碼短語存儲在證書中有效的選項?如果是這樣,那麼如何保護密鑰庫?
+0

是密碼(或密碼短語),該應用程序提示不是選項? –

+0

當你說「我只有我」時,你的意思是即使你的服務從不解密數據?也就是說,它只是將加密塊返回給用戶,並將其解密爲客戶端(如某些在線備份服務)?或者你的意思是你的應用仍然像現在這樣運行,用戶在沒有額外的努力/配置客戶端看到他們的數據,但幕後租戶1的數據加密與租戶2不同的關鍵? – ckhan

+0

首先你說「管理員應該能夠定義密鑰」和「只有管理員應該知道密鑰」;那麼「我們如何讓每個用戶定義自己的密鑰?」。這些似乎是不相容的。我錯過了什麼? –

回答

3

在不知道密鑰的情況下,不可能加密/解密。否則,對於使用密鑰派生函數(PBKDF2)的PBE來說,這似乎是一個明確的情況。您可以使用非對稱加密,但它只會在您的用例的加密過程中保護私鑰。

+0

+1用於PBE。你能否詳細說明一下「,但它只會在你的用例的加密過程中保護私鑰。」 –

+0

使用公鑰/私鑰最終能夠在不共享私鑰的情況下加密數據。如果你既是加密人員又是解密同一系統上的數據的人(同時)PKI沒有多大意義。它可能在不同的系統和時間框架上有意義。 –

2

這裏的代碼展示瞭如何在你的應用程序,從tutorial採取使用基於密碼的加密(PBE)一個片斷:

PBEKeySpec pbeKeySpec; 
PBEParameterSpec pbeParamSpec; 
SecretKeyFactory keyFac; 

// Salt 
byte[] salt = { 
    (byte)0xc7, (byte)0x73, (byte)0x21, (byte)0x8c, 
    (byte)0x7e, (byte)0xc8, (byte)0xee, (byte)0x99 
}; 

// Iteration count 
int count = 20; 

// Create PBE parameter set 
pbeParamSpec = new PBEParameterSpec(salt, count); 

// Prompt user for encryption password. 
// Collect user password as char array (using the 
// "readPasswd" method from above), and convert 
// it into a SecretKey object, using a PBE key 
// factory. 
System.out.print("Enter encryption password: "); 
System.out.flush(); 
pbeKeySpec = new PBEKeySpec(readPasswd(System.in)); 
keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); 
SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec); 

// Create PBE Cipher 
Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); 

// Initialize PBE Cipher with key and parameters 
pbeCipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec); 

// Our cleartext 
byte[] cleartext = "This is another example".getBytes(); 

// Encrypt the cleartext 
byte[] ciphertext = pbeCipher.doFinal(cleartext); 
+0

Thx但在哪裏以及如何存儲密碼(由readPasswd(System.in)返回)。想法是從租戶管理員那裏獲取密碼並將其存儲在某個地方。 –

+0

通過一些工作,您可以將其存儲在密鑰存儲區中。看看[this](http://kingsfleet.blogspot.com/2008/12/storing-password-somewhere-safe.html)博文。密鑰存儲又由密碼保護;在某些時候你必須在你的系統中存儲一個(散列)密碼或者詢問用戶 –

+0

關於創建散列和存儲它的更好方法的任何好建議 –