本教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
有关Java SE 9和后续版本中更新的语言特性的概述,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或已弃用选项的信息,请参阅JDK发行说明。
为了能够创建数字签名,您需要一个私钥(相应的公钥将用于验证签名的真实性)。
在某些情况下,密钥对(私钥和相应的公钥)已经存在于文件中。在这种情况下,程序可以导入并使用私钥进行签名,如弱点和替代方案中所示。
在其他情况下,程序需要生成密钥对。可以使用KeyPairGenerator
类生成密钥对。
在本示例中,您将为数字签名算法(DSA)生成一个公钥/私钥对。您将生成长度为1024位的密钥。
生成密钥对需要几个步骤:
创建密钥对生成器
第一步是获取一个用于生成DSA签名算法密钥的密钥对生成器对象。
与所有引擎类一样,获取特定类型算法的KeyPairGenerator
对象的方法是在KeyPairGenerator
类上调用getInstance
静态工厂方法。该方法有两种形式,两者都有一个String algorithm
作为第一个参数;其中一种形式还有一个String provider
作为第二个参数。
调用者可以选择指定提供者的名称,这将确保所请求的算法的实现来自指定提供者。本课程的示例代码始终指定了JDK内置的默认SUN提供者。
在上一步骤准备初始程序结构中创建的文件的
else try {
行之后,添加以下语句:
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA", "SUN");
初始化密钥对生成器
下一步是初始化密钥对生成器。所有密钥对生成器共享密钥长度(以位为单位)和随机性源的概念。KeyPairGenerator
类有一个initialize
方法,接受这两种类型的参数。
DSA密钥生成器的密钥长度(以位为单位)设置为1024。
随机性源必须是SecureRandom
类的实例,它提供了一个密码学强随机数生成器(RNG)。有关SecureRandom
的更多信息,请参阅SecureRandom API规范和Java密码学体系结构参考指南。
以下示例请求使用内置SUN提供者提供的SHA1PRNG算法的SecureRandom
实例,然后将此SecureRandom
实例传递给密钥对生成器的初始化方法。
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN"); keyGen.initialize(1024, random);
有些情况下需要强随机值,比如创建高价值和长期使用的密钥,如RSA公钥和私钥。为了帮助应用程序选择合适的强SecureRandom
实现,在JDK 8及以后的Java发行版中,包含了一个已知强SecureRandom
实现的列表,存储在java.security.Security
类的securerandom.strongAlgorithms
属性中。当创建此类数据时,应考虑使用SecureRandom.getInstanceStrong()
,它会获取一个已知强算法的实例。
生成密钥对
最后一步是生成密钥对并将密钥存储在PrivateKey
和PublicKey
对象中。
KeyPair pair = keyGen.generateKeyPair(); PrivateKey priv = pair.getPrivate(); PublicKey pub = pair.getPublic();