自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
[...]