是否有命令行工具在Java密钥库中生成对称密钥?

cbl*_*ard 5 java key-management

我正在编写一个关于我的应用程序密钥更新的程序.每隔一年左右,系统管理员将执行此程序.

在我的应用程序中,有一个对称密钥用于在将某些数据存储到数据库之前对其进行加密.此密钥存储在Java密钥库中.

当应用程序必须以加密方式在数据库中存储某些数据时,从配置文件中读取要使用的密钥别名,使用此密钥别名从Java密钥库读取密钥,使用密钥对数据进行加密并存储数据库中的所有内容:密钥别名,初始化向量和加密数据,全部用分号分隔.

所以使用另一个密钥的过程很简单:

  1. 使用另一个别名在Java Keystore中生成新的对称密钥
  2. 更改配置文件以使用此新密钥别名

但我不知道任何可以在Java密钥库中创建对称密钥的命令行工具.java keytool实用程序只能创建密钥对.

是否有命令行工具在Java密钥库中生成对称密钥,还是应该开发自己的工具?

cbl*_*ard 10

密钥工具能够产生自Java 6中的密钥与-genseckey命令.以下是Java 6 keytool文档的摘录:

-genseckey {-alias alias} {-keyalg keyalg}
       {-keysize keysize} [-keypass keypass]
       {-storetype storetype} {-keystore keystore}
       [-storepass storepass]
       {-providerClass provider_class_name {-providerArg provider_arg}}
       {-v} {-protected} {-Jjavaoption}
Run Code Online (Sandbox Code Playgroud)

生成密钥并将其存储在KeyStore.SecretKeyEntry别名标识的新密钥中.

keyalg指定用于生成密钥的算法,keysize指定要生成的密钥的大小.keypass是用于保护密钥的密码.如果未提供密码,则会提示用户输入密码.如果在提示符下按RETURN,则密钥密码将设置为与密钥库使用的密码相同的密码.keypass必须至少6个字符.

因此,以下命令将生成新的AES 128位密钥

keytool -genseckey -alias mykey -keyalg AES -keysize 128 \
    -storetype jceks -keystore mykeystore.jks
Run Code Online (Sandbox Code Playgroud)

keytool命令有一个拼写错误,隐藏有关以下内容的帮助信息-genseckey:

% keytool -help
[...]
-genkeypair  [-v] [-protected]
         [-alias <alias>]
         [-keyalg <keyalg>] [-keysize <taille_clé>]
         [-sigalg <sigalg>] [-dname <nomd>]
         [-validity <joursVal>] [-keypass <mot_passe_clé>]
         [-keystore <keystore>] [-storepass <mot_passe_store>]
         [-storetype <storetype>] [-providername <name>]
         [-providerclass <provider_class_name> [-providerarg <arg>]] ...
         [-providerpath <pathlist>]

-genkeypair  [-v] [-protected]
         [-alias <alias>] [-keypass <keypass>]
         [-keyalg <keyalg>] [-keysize <taille_clé>]
         [-keystore <keystore>] [-storepass <mot_passe_store>]
         [-storetype <storetype>] [-providername <name>]
         [-providerclass <provider_class_name> [-providerarg <arg>]] ...
         [-providerpath <pathlist>] 
Run Code Online (Sandbox Code Playgroud)

-genkeypair命令出现两次.实际上-genkeypair应该阅读第二个-genseckey.这就是我没注意到命令的原因.

我在Java 1.6.0_26中遇到过这个错字错误.我已经检查了最新的Java 6(1.6.0_31)并且它有同样的问题.我还检查了最新的Java 7并修复了文档问题:

% java -version
java version "1.7.0_03"
Java(TM) SE Runtime Environment (build 1.7.0_03-b04)
Java HotSpot(TM) Server VM (build 22.1-b02, mixed mode)
% keytool -help
 [...]
 -genkeypair         Generates a key pair
 -genseckey          Generates a secret key
 [...]
Run Code Online (Sandbox Code Playgroud)