我为 AES/CBC/PKCS5Padding 编写了一个自定义安全提供程序。效果很好。
我需要向
Provider
添加哪些设置才能让 Java 将其识别为上述算法的有效提供者?我已经有了
public class FooBarProvider extends Provider {
public FooBarProvider() {
super("FooBar", 1.0, "Provider for AES.");
put("Cipher.AES", "foo.bar.AESCipher");
}
}
其中后一个参数是实际完成工作的
CipherSpi
。我在哪里注册它支持 CBC 和 PKCS5Padding?目前请求相关的 Cipher
不会返回我的类的实例:
Security.insertProviderAt(new FooBarProvider(), 1);
Cipher cip = Cipher.getInstance("AES/CBC/PKCS5Padding");
System.out.println(cip.getProvider()); //prints "SunJCE version 1.7"
编写代码是该过程中最简单的部分。您已经声明您的类提供了 AES 的 Cipher 实现。这一行:
put("Cipher.AES", "foo.bar.AESCipher");
几乎就是完成任务所需的一切。另请注意,由于您已在算法级别注册了密码实现,因此将自动为 mode 和 padding 的所有组合调用您的实现。
话虽如此,编写代码是最容易的部分。您正在创建一个密码,因此您需要先对您的 JAR 进行签名,然后才能将其安装并配置为提供程序。因为这个过程有些复杂,所以我不会在这里全部复制,而是请您参考《Oracle 如何实现提供者指南》。这是完成这项任务的绝佳来源。 如果您按照指南操作但仍然遇到问题,您可能需要下载并安装适合您安装的 JDK 的
JCE Unlimited Strength PolicyProvider
、
KeypairGenerator
、KeyGenerator
和相关的 service-spi-s 可以通过子类化进行集成,而无需注册提供者。对于 Cipher
类,Java 安全框架内没有旁路,并且接受的答案中的步骤是强制性的。没有什么可以阻止您为您的密码类提供公共构造函数并在没有框架的情况下实例化它。