2012-04-30 186 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

关于创建散列和存储它的更好方法的任何好建议 –