Java的公钥表征与RFC 8410之间存在差异。

问题描述 投票:2回答:1

RFC 8410 这是个Ed25519公钥的例子。MCowBQYDK2VwAyEAGb9ECWmEzf6FQbrBZ9w7lshQhqowtrbLDFw4rXAxZuE=

用ASN. 1解码器解码后,就变成了:

30 2A
  30 05
    06 03 2B6570 // Algorithm Identifier
  03 21 0019BF44096984CDFE8541BAC167DC3B96C85086AA30B6B6CB0C5C38AD703166E1

正如所料,这符合 SubjectPublicKeyInfo RFC中的定义。

使用Java 11+中的Sun密码学提供商,我可以使用这段代码来生成X25519(不是Ed25519--这是下面算法标识符的区别)公钥。

import java.security.KeyPairGenerator;
import java.util.Base64;

public class PrintPublicKey {
    public static void main(String args[]) throws Exception {
        KeyPairGenerator generator = KeyPairGenerator.getInstance("X25519");
        byte[] encodedPublicKey = generator.generateKeyPair().getPublic().getEncoded();
        System.out.println(Base64.getEncoder().encodeToString(encodedPublicKey));
    }
}

这将输出类似的东西。MCwwBwYDK2VuBQADIQDlXKI/cMoICnQRrV+4c//viHnXMoB190/z2MX/otJQQw==

用ASN.1解码器解码后,就变成了:

30 2C
  30 07
    06 03 2B656E // Algorithm Identifier
    05 00        // Algorithm Parameters - NULL
  03 21 00E55CA23F70CA080A7411AD5FB873FFEF8879D7328075F74FF3D8C5FFA2D25043

这个有一个明确的 NULL 在对象标识符之后。根据规范,这是否有效?它说

在这份文件中,我们定义了四个新的OID用于识别不同的曲线算法对: 曲线是curve25519和curve448,算法是ECDH和纯模式的EdDSA。

对于所有的OID,参数必须是不存在的。

java cryptography public-key-encryption x509 asn.1
1个回答
2
投票

你引用的那段话后面是这样说的。

有可能发现系统要求参数必须存在 这有可能是由于1997年原始语法的缺陷,也有可能是由于编程错误,开发人员从来没有得到过不是这样的输入。 最佳的解决方案是修复这些系统;如果无法修复,则需要将问题限制在该子系统中,而不是传播到互联网上。

所以Oracle实现的行为的一个合理解释是,他们希望与需要参数的旧系统互操作。 这是一种为了防止拥有大额支持合同的大客户大声抱怨 "升级到Java 11破坏了我的基础设施 "而做的事情。

© www.soinside.com 2019 - 2024. All rights reserved.