有没有一个命令行工具可以在Java密钥库中生成对称密钥?

5
我正在写一篇有关应用程序密钥更新的操作流程。该流程将由系统管理员每年或更长时间执行一次。
在我的应用程序中,使用对称密钥对某些数据进行加密,然后将其存储在数据库中。该密钥存储在Java keystore中。
当应用程序必须以加密方式将某些数据存储在数据库中时,从配置文件中读取要使用的密钥别名,使用该密钥别名从Java keystore中读取密钥,使用密钥对数据进行加密,并将所有内容分别存储在数据库中:密钥别名、初始化向量和加密数据,所有内容都用分号分隔。
因此,使用另一个密钥的过程很简单:
1. 使用其他别名在Java Keystore中生成新的对称密钥 2. 更改配置文件,使用这个新的密钥别名
但我不知道是否有任何命令行工具可以在Java keystore中创建对称密钥。Java keytool实用程序只能创建密钥对。
是否有命令行工具可以在Java keystore中生成对称密钥,还是我应该开发自己的工具?
1个回答

10

自Java 6以来,keytool能够使用-genseckey命令生成密钥。以下是Java 6 keytool文档的摘录:

keytool可以使用-genseckey命令生成密钥。

-genseckey命令有多个选项,用于指定要使用的加密算法、密钥大小和其他密钥参数。

要生成秘密密钥,请使用以下命令格式:

keytool -genseckey [选项]

请参阅-genseckey命令文档 ,以获取有关如何使用该命令以及可用选项的更多详细信息。

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

生成一个密钥并将其存储在新的KeyStore.SecretKeyEntry,可通过alias标识。

keyalg指定用于生成密钥的算法,keysize指定要生成的密钥大小。 keypass是用于保护密钥的密码。如果未提供密码,则会提示用户输入密码。如果在提示符处按回车键,则密钥密码设置为与密钥库使用的密码相同的密码。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 中遇到了这个拼写错误的 bug。我已经检查了最新的可用 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
 [...]

你是不是在第二个块中意图重复使用“-alias mykey”? - Christian
@Christian:感谢您注意到了这一点。它不会产生任何错误,但也不是必要的。我已经编辑了答案以将其删除。 - cbliard
1
顺便提一下,重要的一点是使用JCEKS存储类型(就像答案中所使用的),默认的JKS存储类型不支持私钥。 - Drunix
Keytool现在建议使用PKCS12密钥库而不是JCEKS。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接