文档

Java™ 教程
隐藏目录
生成公钥和私钥
指南:Java SE中的安全特性
课程:生成和验证签名
部分:生成数字签名

生成公钥和私钥

为了能够创建数字签名,您需要一个私钥(相应的公钥将用于验证签名的真实性)。

在某些情况下,密钥对(私钥和相应的公钥)已经存在于文件中。在这种情况下,程序可以导入并使用私钥进行签名,如弱点和替代方案中所示。

在其他情况下,程序需要生成密钥对。可以使用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(),它会获取一个已知强算法的实例。

生成密钥对

最后一步是生成密钥对并将密钥存储在PrivateKeyPublicKey对象中。

KeyPair pair = keyGen.generateKeyPair();
PrivateKey priv = pair.getPrivate();
PublicKey pub = pair.getPublic();

上一页:准备初始程序结构
下一页:签署数据