Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 组合多个加密密钥以生成加密密钥_Java_Encryption_Cryptography - Fatal编程技术网

Java 组合多个加密密钥以生成加密密钥

Java 组合多个加密密钥以生成加密密钥,java,encryption,cryptography,Java,Encryption,Cryptography,例如,我们有一个系统,它有几个secretkey,一个给用户,一个给我们。我们希望以一种需要所有这些密钥都可用才能解密的方式对数据进行加密 我认为正确的方法是使用某种密钥派生函数将源SecretKeys合并在一起,并使用结果a作为加密密钥 假设所有源密钥都是使用以下加密方式生成的加密密钥: KeyGenerator generator = KeyGenerator.getInstance("AES"); generator.init(256); return generator.generate

例如,我们有一个系统,它有几个secretkey,一个给用户,一个给我们。我们希望以一种需要所有这些密钥都可用才能解密的方式对数据进行加密

我认为正确的方法是使用某种密钥派生函数将源SecretKeys合并在一起,并使用结果a作为加密密钥

假设所有源密钥都是使用以下加密方式生成的加密密钥:

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的调用中使用生成的mergedSecretKey


这种方法是否存在任何问题或风险?

使用信封加密。最好不要组合哈希或进行双重加密,尤其是后者可能会导致中间攻击。

Stackoverflow是关于编程问题的。这实际上是一个关于国产密码构造的安全问题。因此,我认为它更适合于or。请注意,基于公钥的密钥协商方案可能比单纯的对称加密更适合于此类问题。我从你个人资料页面上的业务链接中了解到你正在尝试做什么,你的安全/威胁模型的详细信息可能对获得正确的解决方案至关重要。谢谢@JamesKPolk,我在Crypto发布了这篇文章,以防万一。我们需要客户能够通过从KMS中撤销DEK有效地终止对其数据库中数据的访问—最终的“被遗忘的权利”——不确定公共/私有密钥对是否有助于此用例,但我当然愿意接受建议。我们使用公钥/私钥对客户的KMS进行身份验证,但字段级加密是通过对称加密完成的。我们有一个系统,该系统具有多个加密密钥。。。我们希望以一种需要所有这些密钥都可用才能解密的方式对数据进行加密。-通常使用Shamir的秘密共享或信息分散算法IDA。该秘密在类似AES的算法下加密,然后AES密钥以共享的形式分发给用户。没有一个用户拥有足够的AES密钥进行解密。要重建AES密钥,必须有一定数量的用户提供他们的共享。您可以设置共享和阈值。例如,3中的2、5中的3、11中的6、12中的10等等。堆栈溢出是一个用于编程和开发问题的站点。这个问题似乎离题了,因为它与编程或开发无关。请参见帮助中心中的。也许或者会是一个更好的提问的地方。