3

上下文:多租户应用程序

功能:加密敏感数据

故事: 作为租户的管理员,我想使用我自己的密码或密码短语加密敏感数据,以便我,并且只有我,可以完全控制所使用的密钥。

验收标准:

  1. 每个租户的管理员应该能够定义用于加密的密码或密码短语
  2. 只有提供原始密码或密码短语的租户管理员才应该知道密钥
  3. 租户管理员提供密码或密码短语后,应安全存储

我的问题

  1. 到目前为止,我们一直在使用对称密钥加密,并在应用程序中硬编码应用程序范围的密钥。如果每个租户都想使用自己的密钥,这将不再有效。我们如何让每个用户定义自己的密钥?
  2. 如何以及在哪里存储密钥?
  3. 将密码/密码短语存储在证书中是否有效?如果是这样,那么如何保护密钥库?
4

2 回答 2

3

如果不知道密钥,就不可能加密/解密。否则,使用密钥派生函数 (PBKDF2) 的 PBE 似乎是一个明确的案例。您可以使用非对称加密,但它只会在您的用例中加密期间保护私钥。

于 2012-05-01T09:16:39.083 回答
2

下面是一段代码,展示了如何在您的应用程序中使用基于密码的加密 (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);
于 2012-05-01T13:06:25.487 回答