【问题标题】:Why does the Java KeyStore fail at loading an OpenPGP key?为什么 Java KeyStore 在加载 OpenPGP 密钥时失败?
【发布时间】:2016-05-03 10:19:03
【问题描述】:

我愿意花一些时间为桌面 Java 应用程序开发另一个许可证管理器。环顾四周后,我发现了 Iakin 的 JCPUID,它可以免费使用,并且应该可以在大多数带有我发现 here 的本机库的操作系统上运行。

我的想法是做两个模块:将显示带有 CPU ID 和验证文本字段的弹出窗口的主应用程序和密钥生成器应用程序。用户将 CPU ID 传递给注册机所有者,注册机所有者将验证码(由注册机生成)返回给用户。用户提交正确的验证码后,将在文件系统中创建带有该验证码的许可证文件。应用程序每次启动时,都会检查该文件的存在和正确性,然后加载主应用程序屏幕。

关于代码验证,我认为最好的选择是使用非对称加密,尤其是 RSA。公钥将内置在应用程序中,秘密将内置在密钥生成器中。因此 CPUID 将被传递给密钥生成器所有者,然后使用 RSA 签名。该签名将被传回给用户,用户将使用内置公钥验证其有效性。

我使用 Kleopatra 和 gpg Linux 命令行工具本身生成了 gpg 密钥对。然后我尝试使用这种方法签署一些东西:

    private byte[] createSignature(byte[] file) {
    byte[] signature = null;

    try {
        java.security.KeyStore keyStoreFile = java.security.KeyStore
                .getInstance("PKCS12");
        keyStoreFile.load(getClass().getClassLoader().getResourceAsStream("/secret.asc"),
        "******".toCharArray());

        PrivateKey privateKey = (PrivateKey) keyStoreFile.getKey(
                "My Name Here", "******".toCharArray());

        Signature dsa = Signature.getInstance("SHA1withRSA");
        dsa.initSign(privateKey);
        dsa.update(file, 0, file.length);
        signature = dsa.sign();

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return signature;
}

但是privateKey初始化会抛出异常:

java.security.InvalidKeyException: Key must not be null

我猜是因为这里的实例格式错误:

java.security.KeyStore keyStoreFile = java.security.KeyStore
            .getInstance("PKCS12");

我想知道:

  1. 这种方法到底有多好?

  2. 不同的 OpenPGP 密钥格式之间存在什么区别,在这种情况下哪种最适合使用?如何知道现有OpenPGP文件的格式?

【问题讨论】:

    标签: java encryption rsa public-key openpgp


    【解决方案1】:

    Java 加密框架不支持 OpenPGP。 X.509 密钥(例如 PKCS12 格式)与 OpenPGP 不兼容——尽管它们(大部分)依赖于相同的加密算法。

    要么使用 X.509 证书(您也可以为此创建自己的 CA),或者依赖 OpenPGP for Java 的实现。在开源库方面,您可以选择原生 Java 实现 BouncyCastle(MIT 许可)或接口 GnuPG(GPL)到 Java GPGME binding(LGPL)。

    BouncyCastle 可能是更好的选择,因为您只需添加另一个 Java 库,而不是在系统中安装其他软件。

    【讨论】:

      猜你喜欢
      • 2020-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      相关资源
      最近更新 更多