我们有一个具有多个 SecretKey 的系统(例如,一个给用户,一个给我们)。我们希望以一种需要所有这些密钥都可用才能解密的方式加密数据。
我认为正确的方法是使用某种密钥派生函数将源 SecretKeys 合并在一起,并将结果用作加密密钥。
鉴于所有源密钥都是使用以下密码生成的 SecretKey:
KeyGenerator generator = KeyGenerator.getInstance("AES");
generator.init(256);
return generator.generateKey();
仅使用源密钥的加密哈希是否安全,或者是否可能以某种方式引入漏洞?像这样:
SecretKey secretKey1 = ...
SecretKey secretKey2 = ...
SecretKey secretKey3 = ...
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(secretKey1.getEncoded());
md.update(secretKey2.getEncoded());
byte[] digest = md.digest(secretKey3.getEncoded());
SecretKey mergedSecretKey = new SecretKeySpec(digest, "AES");
然后在对 Cipher.init() 的调用中使用生成的 mergeSecretKey。
这种方法是否存在任何问题或风险?