如何让 Java 使用我的安全提供程序?

2022-09-02 22:07:02

我为AES / CBC / PKCS5Padding编写了一个自定义安全提供程序。这工作正常。

我需要向 添加哪些设置才能使 Java 将其识别为上述算法的有效提供程序?我已经有Provider

public class FooBarProvider extends Provider {
  public FooBarProvider() {
    super("FooBar", 1.0, "Provider for AES.");
    put("Cipher.AES", "foo.bar.AESCipher");
  }
}

其中后一个参数是完成工作的实际参数。我在哪里注册它支持CBC和PKCS5Padding的事实?当前请求相关项不会返回我的类的实例:CipherSpiCipher

Security.insertProviderAt(new FooBarProvider(), 1);
Cipher cip = Cipher.getInstance("AES/CBC/PKCS5Padding");
System.out.println(cip.getProvider()); //prints "SunJCE version 1.7"

答案 1

编写代码是该过程中最简单的部分。您已经声明您的类为 AES 提供密码实现。此行:

put("Cipher.AES", "foo.bar.AESCipher");

几乎是完成任务所需的全部内容。另请注意,对于模式填充的所有组合,将自动调用您的实现,因为您已在算法级别注册了密码实现。

话虽如此,编写代码是很容易的部分。您正在创建密码,因此您需要先对 JAR 进行签名,然后才能将其安装并配置为提供程序。由于该过程有些复杂,因此我不会在此处复制所有内容,而是向您推荐有关如何实现提供程序的Oracle指南。这是此任务的绝佳来源。

如果您按照本指南操作后仍遇到问题,则可能需要下载并安装适用于您已安装的 JDK 的 JCE 无限强度策略


答案 2

Java Crypto 文档描述了注册类的机制:Provider

简短的版本是:

  1. 将提供程序 JAR 放在类路径上或 Java 安装的扩展目录中。
  2. 注册提供商:
    • 手动将详细信息编辑到配置文件中 (),或java.security$JAVA_HOME/lib/security/java.security
    • 在运行时,调用 或 .Security.addProviderSecurity.insertProviderAt