本文来自作者
秋山人家
在
GitChat
上分享 「如何配置并使用 Bouncy Castle 密码包」,
「
阅读原文
」
查看交流实录。
「
文末高能
」
编辑 | 哈比
Bouncy Castle 是一款轻量级的密码包,包含的许多常用的密码算法,对 Java 安全体系能够起到很好的补充,同时其支持椭圆曲线密码体系。
Bouncy Castle 配置方式有两种:一种是动态安装的方式,一种是静态配置的方式。无论是哪种配置方式,都需要先把 Bouncy Castle 包下载下来(当然也可以使用 Maven 等方式配置使用)。
最新 Bouncy Castle 下载地址请访问:http://www.bouncycastle.org/latest_releases.html,需要下载两个文件 bcprov-jdk15on-158.jar 和 bcprov-ext-jdk15on-158.jar。
一、动态安装的方式
这种方式是在工程中直接使用 Bouncy Castle,对环境的依赖较小。
example 1:
public class hello {
// 动态使用 provider
static {
Security.addProvider(new BouncyCastleProvider());
}
public static void main(String args[]) {
System.out.println(" 请输入待加密数据:");
Scanner scan = new Scanner(System.in);
while (scan.hasNext()) {
try {
String date = scan.nextLine();
KeyGenerator kg =KeyGenerator.getInstance("AES");
kg.init(256);
SecretKey secretKey = kg.generateKey();
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] enResult = cipher.doFinal(date.getBytes());
System.out.println(" 加密数据:");
String strEnResult = Base64.toBase64String(enResult);
System.out.println(strEnResult);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchProviderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
二、静态配置的方式
静态配置方式是本地 Java 环境中添加 Bouncy Castle 支持,需要使用到的 jar 包是 bcprov-ext-jdk15on-158.jar。
C:\ProgramFiles\Java\jdk1.8.0_144\jre\lib\security\java.security
C:\ProgramFiles\Java\jre1.8.0_144\lib\security\java.security
在 security 文件中找到以下部分:
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=sun.security.ec.SunEC
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
security.provider.10=sun.security.mscapi.SunMSCAPI
在后面添加
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider
注意其中的序号根据自己 security 文件而定。检测安装是否成功,可以使用下面的简单程序进行:
public static void main(String[] args) {
Provider provider = Security.getProvider("BC");
System.out.println(provider);
}
若显示为 null 表示安装失败,若显示为 BC 表示安装成功。
三、Java 进口管制限制解除
由于国外的进出口限制,对 Java 密码算法体系进行了一些限制,为了解除限制,需要覆盖策略文件。
(1)下载策略文件
-
jdk6→http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
-
jdk7→http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
-
jdk8→http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html