java常见的开源算法支持以及java默认支持的provider

本文详细解析了Java 6支持的加密算法,包括BouncyCastle、commonscodec等开源项目的贡献,并介绍了如何在java.security配置文件中添加额外算法实现。同时,指导读者如何在代码中显式指定使用特定类的加密算法。

java6支持了很多的加密算法,各大机构提供了很多的实现。但是大部分收费。
1、这里Bouncy Castle(http://www.bouncycastle.org)提供了一系列的算法实现,可以跻身于JCE的框架下,以提供者的方式纳入java安全实现的开源项目。
2、commons codec这个apache的项目对java6的api做了易用性改进,但是没有对java6提供扩展加密算法。

这里我们可以看到jdkhome下的jre/lib/security/java.security默认的支持的算法

security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=com.sun.net.ssl.internal.ssl.Provider
security.provider.4=com.sun.crypto.provider.SunJCE
security.provider.5=sun.security.jgss.SunProvider
security.provider.6=com.sun.security.sasl.Provider
security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.8=sun.security.smartcardio.SunPCSC
security.provider.9=sun.security.mscapi.SunMSCAPI

如果想把Bouncy Castle支持的算法加上去,也可以直接进行配置

security.provider.<n>=<classname>

但是这么做需要将Bouncy Castle的jar包放到jdk下的jre/lib/ext目录,最好jre home下的ext也放一个

写法雷同上边1-9的提供者

 

不过就算我们不在jdk的环境中配置上边的东东也没问题

我们直接在调用算法的时候显式指明我们用什么类的哪个算法即可


转载于:https://my.oschina.net/biezhi/blog/394590

<think>我们正在讨论如何在Java中自定义Bouncy Castle(BC)Provider。Bouncy Castle是一个开源的加密库,提供了Java Cryptography Architecture (JCA)和Java Cryptography Extension (JCE)的轻量级API。自定义Provider通常是为了添加新的加密算法或者使用已有的算法实现。 在Java中,我们可以通过以下步骤来注册和使用Bouncy Castle Provider: 1. 添加Bouncy Castle依赖 2. 在代码中注册Provider 3. 使用注册后的Provider进行加密操作 但是,用户的问题是关于“实现或自定义”一个Provider。这通常意味着用户可能想要扩展Bouncy Castle,添加自己的算法实现,或者修改现有的算法。然而,请注意,Bouncy Castle是一个成熟的加密库,通常我们不需要去修改它的内部实现,而是使用它提供的接口。如果用户确实需要添加新的算法,那么需要按照JCA/JCE的规范来实现。 下面分两种情况讨论: ### 情况1:仅仅使用Bouncy Castle Provider 如果用户只是想使用Bouncy Castle提供的加密功能,那么只需要将Bouncy Castle作为依赖添加到项目中,并在运行时注册即可。 步骤: 1. 添加依赖(以Maven为例): ```xml <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.68</version> <!-- 请使用最新版本 --> </dependency> ``` 2. 在Java代码中注册Provider: ```java import org.bouncycastle.jce.provider.BouncyCastleProvider; import java.security.Security; public class RegisterProvider { public static void main(String[] args) { // 注册Bouncy Castle Provider Security.addProvider(new BouncyCastleProvider()); } } ``` 3. 使用注册的Provider进行加密操作,例如使用AES加密: ```java import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.security.Security; public class AesExample { public static void main(String[] args) throws Exception { Security.addProvider(new BouncyCastleProvider()); // 确保已注册 byte[] keyBytes = new byte[16]; // 128位密钥 // 填充密钥,这里只是示例,实际应用中应从安全源获取密钥 SecretKeySpec key = new SecretKeySpec(keyBytes, "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC"); // 指定使用BC provider cipher.init(Cipher.ENCRYPT_MODE, key); byte[] plaintext = "Hello, World!".getBytes(); byte[] ciphertext = cipher.doFinal(plaintext); System.out.println("加密结果: " + new String(ciphertext)); } } ``` ### 情况2:自定义Provider(扩展Bouncy Castle) 如果用户想要添加自己的算法实现,那么需要按照JCA的规范,实现自己的Provider。这通常包括以下步骤: 1. 创建一个类继承自`java.security.Provider`。 2. 在构造方法中,将算法名称和对应的实现类进行关联。 3. 实现对应的算法引擎类(如`CipherSpi`、`KeyGeneratorSpi`等)。 但是,Bouncy Castle本身已经是一个Provider,我们通常不建议直接修改它的源代码。而是通过实现JCA接口,然后将自己实现的算法注册到Bouncy Castle中,或者注册为独立的Provider。 然而,Bouncy Castle提供了扩展点,允许我们添加新的算法。这需要了解Bouncy Castle的内部结构。例如,要添加一个新的密码算法,我们需要: - 实现`org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher`(用于分组密码)或相应的SPI类。 - 在`org.bouncycastle.jce.provider.BouncyCastleProvider`的构造方法中添加新算法的注册信息(但这样就需要修改Bouncy Castle的源代码并重新打包)。 由于修改Bouncy Castle的源代码并重新打包可能带来维护的困难,通常建议将自己的算法实现为一个独立的Provider。 因此,更常见的做法是创建一个新的Provider,而不是修改Bouncy Castle。例如: ```java public class MyCustomProvider extends java.security.Provider { public MyCustomProvider() { super("MyCustomProvider", 1.0, "My Custom Security Provider"); // 注册算法实现,例如一个名为"MyCipher"的密码算法 put("Cipher.MyCipher", "com.example.MyCipher"); // 还可以注册其他算法,如KeyGenerator, Mac等 } } // 然后实现com.example.MyCipher类,它需要继承自javax.crypto.CipherSpi ``` 然后像注册Bouncy Castle一样注册这个自定义的Provider。 但是,如果用户确实希望将新的算法添加到Bouncy Castle中,那么需要: 1. 下载Bouncy Castle的源代码。 2. 在相应的包中添加新算法的实现(例如,对称加密算法放在`symmetric`包下)。 3. 在`BouncyCastleProvider`类的构造方法中添加新算法的注册,例如: ```java put("Cipher.MyCipher", "org.bouncycastle.jcajce.provider.symmetric.MyCipher$ECB"); ``` 4. 重新编译并打包Bouncy Castle。 由于这个过程比较复杂,并且需要深入理解Bouncy Castle的内部结构,所以一般只有在贡献新算法到Bouncy Castle项目时才这样做。 总结: - 如果只是使用Bouncy Castle,则通过添加依赖和注册Provider即可。 - 如果要添加自定义算法,建议实现独立的Provider(继承`java.security.Provider`),而不是修改Bouncy Castle。 - 如果确实需要扩展Bouncy Castle(例如为了贡献代码),则需要修改其源代码并重新构建。 引用说明:关于Provider的注册和使用,可以参考Java官方文档[JCA](https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html)和Bouncy Castle的[官方文档](https://www.bouncycastle.org/documentation.html)。[^1] §§相关问题§§ 1. 如何在Java中注册多个加密服务提供者(Provider)? 2. 如何实现一个自定义的加密算法并将其注册为JCA Provider? 3. Bouncy Castle支持哪些加密算法? 4. 在Java中使用Bouncy Castle进行AES加密的完整示例是什么? 5. 如何为Bouncy Castle贡献新的加密算法实现?</think>### 如何在Java中自定义Bouncy Castle (BC) ProviderJava中自定义Bouncy Castle Provider主要涉及两种场景:**注册标准BC Provider**和**扩展自定义算法实现**。以下是具体步骤: --- #### 一、注册标准BC Provider(最常见场景) 1. **添加依赖** ```xml <!-- Maven --> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk18on</artifactId> <version>1.77</version> <!-- 使用最新版本 --> </dependency> ``` 2. **静态注册(推荐)** 在`java.security`文件中添加: ```bash security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider ``` 3. **动态注册(运行时)** ```java import org.bouncycastle.jce.provider.BouncyCastleProvider; import java.security.Security; public class ProviderSetup { public static void main(String[] args) { // 检查是否已注册 if (Security.getProvider("BC") == null) { Security.addProvider(new BouncyCastleProvider()); // 注册为"BC" } } } ``` 4. **使用Provider** ```java Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC"); // 显式指定BC ``` --- #### 二、扩展自定义算法(高级场景) 若要添加自定义算法实现(如新密码算法): 1. **实现算法引擎** ```java public class MyCipherSpi extends CipherSpi { // 实现init(), update(), doFinal()等抽象方法 @Override protected void engineInit(int opmode, Key key, SecureRandom random) { // 自定义初始化逻辑 } } ``` 2. **创建自定义Provider** ```java public class MyCustomProvider extends Provider { public MyCustomProvider() { super("MyCrypto", 1.0, "Custom Cryptographic Provider"); // 注册自定义算法实现 put("Cipher.MyCipher", MyCipherSpi.class.getName()); // 可添加更多算法:KeyGenerator, Mac等 } } ``` 3. **注册与使用** ```java Security.addProvider(new MyCustomProvider()); Cipher myCipher = Cipher.getInstance("MyCipher", "MyCrypto"); ``` --- ### 关键注意事项 1. **Provider优先级** Java按注册顺序检查Provider,使用`Security.insertProviderAt()`调整优先级: ```java Security.insertProviderAt(new BouncyCastleProvider(), 1); // 最高优先级 ``` 2. **算法覆盖** 自定义Provider可覆盖BC的默认实现,但不建议修改BC核心代码(应通过扩展实现)。 3. **安全策略** 若使用JCE受限算法(如AES-256),需安装[JCE Unlimited Strength Jurisdiction Policy](https://www.bouncycastle.org/documentation.html)。 4. **服务类型** 支持的JCA服务类型包括: - `Cipher`, `KeyAgreement`, `Signature` - `KeyGenerator`, `Mac`, `KeyStore` - `CertificateFactory`, `AlgorithmParameters` --- ### 典型应用场景 1. 添加国家商用密码算法(如SM2/SM4) 2. 集成硬件安全模块(HSM)的PKCS#11接口 3. 替换默认算法的实现(如使用硬件加速RSA) 4. 支持新式后量子密码算法 > 引用说明:Bouncy Castle的模块化设计允许通过标准JCA接口扩展自定义算法,而无需修改核心库[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值