生成公钥和私钥
原文: https://docs.oracle.com/javase/tutorial/security/apisign/step2.html
为了能够创建数字签名,您需要一个私钥。 (为了验证签名的真实性,将需要相应的公钥。)
在某些情况下,密钥对(私钥和相应的公钥)已在文件中可用。在这种情况下,程序可以导入和使用私钥进行签名,如弱点和替代所示。
在其他情况下,程序需要生成密钥对。使用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 密码体系结构参考指南。
以下示例请求使用 SHA1PRNG 算法的SecureRandom
实例,由内置 SUN 供应器提供。然后,该示例将此SecureRandom
实例传递给密钥对生成器初始化方法。
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
keyGen.initialize(1024, random);
某些情况需要强大的随机值,例如在创建 RSA 公钥和私钥等高价值和长期密码时。为帮助指导应用程序选择合适的强SecureRandom
实现,从 JDK 8 Java 发行版开始,在java.security.Security
类的securerandom.strongAlgorithms
属性中包含已知的强SecureRandom
实现列表。在创建此类数据时,应考虑使用SecureRandom.getInstanceStrong()
,因为它获取了已知强算法的实例。
生成一对密钥
最后一步是生成密钥对并将密钥存储在PrivateKey
和PublicKey
对象中。
KeyPair pair = keyGen.generateKeyPair();
PrivateKey priv = pair.getPrivate();
PublicKey pub = pair.getPublic();