Java Keystore——从命令行自定义SecretKey进入Keystore

Java Keystore——从命令行自定义SecretKey进入Keystore,java,encryption,openssl,aes,keytool,Java,Encryption,Openssl,Aes,Keytool,作为加密和保存数据的一部分,我们使用AES算法和openssl生成了密钥 openssl enc -aes-256-cbc -P -nosalt Openssl已经生成了KEY&IV值,这些值存储在一个纯文本文件中。由于将密钥存储在普通文档中是一种不安全的标准,因此考虑将其移动到密钥库 因此,我们通过执行下面的命令,使用keytool生成了一个密钥库 keytool -genseckey -keyalg AES -alias aesstore -keysize 256 -keypass cha

作为加密和保存数据的一部分,我们使用AES算法和openssl生成了密钥

openssl enc -aes-256-cbc -P -nosalt
Openssl已经生成了KEY&IV值,这些值存储在一个纯文本文件中。由于将密钥存储在普通文档中是一种不安全的标准,因此考虑将其移动到密钥库

因此,我们通过执行下面的命令,使用keytool生成了一个密钥库

keytool -genseckey -keyalg AES -alias aesstore -keysize 256 -keypass changeit -storetype jceks -keystore hello.jceks -storepass changeit
此密钥存储库保存一个随机secrey密钥。因此,我们想将KEY&IV值移动到Keystore,这样我们就可以从那里获取并使用它们对数据进行加密。我在下面找到了一个链接,用于将自定义键值存储到Keystore,而不是IV值

因此,如果有人对如何将KEY和IV值存储到keystore有任何想法,请分享

此外,我们正在寻找一种方法,在这种方法中,我们可以从命令行本身将自定义密钥传递到keystore


提前感谢。

每次在操作模式下使用钥匙时,IV应该是唯一的。因此,用钥匙存储IV没有多大意义。如果必须的话,您可以使用散列函数从密钥中提取用于CBC的IV,但是您应该只使用密钥加密一次并生成IV

通常会生成一个随机IV,并在密文前加上前缀。当使用密码时,密码通常与随机密码配对。如果为每个加密操作生成一个新的随机salt,那么指定一个完全随机的IV将是虚假的。在这种情况下,IV可能来自盐。在这种情况下,salt通常在密文前加前缀


因此,您正在寻找一个存储持久IV的选项,而IV已被定义为针对每个加密进行更改。这就是为什么在密钥存储实现中找不到解决方案的原因。

感谢您的回复。我知道IV在密钥存储实现中是一个不断变化的价值。我们目前的问题是,我们一直在使用持久密钥和IV值来加密和保存数据。如果我们将密钥移动到Keystore,我们加密的数据与同一字符串的先前加密数据不匹配,因为IV值不同。所以,要解决这个问题,我认为唯一的解决方案是,从密钥库中提取密钥,并借助persistent IV对数据进行加密。请建议。您应该更改协议,并在最后存储一个密钥。但现在你可以破解它,并将IV存储为例如AES-128密钥。然后使用
aesKey.getEncoded()
返回字节。AES密钥由完全随机的数据组成,只返回放入的字节。