5

我正在为我的应用程序编写一个关于密钥更新的程序。此过程将由系统管理员每年左右执行一次。

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

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

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

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

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

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

4

1 回答 1

10

自 Java 6 以来, keytool能够使用-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}

生成密钥并将其存储在由aliasKeyStore.SecretKeyEntry标识的新密钥中。

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

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

keytool -genseckey -alias mykey -keyalg AES -keysize 128 \
    -storetype jceks -keystore mykeystore.jks

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>] 

-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
 [...]
于 2012-03-08T17:09:00.550 回答