Bouncy Castle 密碼包的配置及使用詳解
阿新 • • 發佈:2021-01-21
技術標籤:加密與安全bouncycastle密碼演算法加密解密securityjava
1、簡述
BouncyCastle(輕量級密碼術包)是一種用於 Java 平臺的開放原始碼的輕量級密碼術包;Bouncycstle 包含了大量的密碼演算法,其支援橢圓曲線密碼演算法,並提供JCE 1.2.1的實現。
2、為什麼要使用BouncyCastle?
我們知道,Java標準庫提供了一系列常用的雜湊演算法。但如果我們要用的某種演算法,Java標準庫沒有提供怎麼辦?
方法一:自己寫一個,難度很大;
方法二:找一個現成的第三方庫,直接使用。
BouncyCastle就是一個提供了很多雜湊演算法和加密演算法的第三方庫。它提供了Java標準庫沒有的一些演算法,例如,RipeMD160雜湊演算法。
3、如何使用BouncyCastle?
因為 Bouncy Castle 被設計成輕量級的,所以從 J2SE 1.4 到 J2ME(包括 MIDP)平臺,它都可以執行。它是在 MIDP 上執行的唯一完整的密碼術包。接下來,我們來看一下如何使用BouncyCastle這個第三方提供的演算法。
3.1 maven工程下引入依賴包方式
- pom.xml檔案中引入bouncycastle的jar包依賴,把BouncyCastle提供的jar包放到classpath中。這個jar包就是
bcprov-jdk15on-xxx.jar
,可以從官方網站下載。
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.59</version> </dependency>
- Java標準庫的
java.security
包提供了一種標準機制,允許第三方提供商無縫接入。我們要使用BouncyCastle提供的RipeMD160演算法,需要先把BouncyCastle註冊一下:
@Test public void case1(){ // 註冊BouncyCastle: Security.addProvider(new BouncyCastleProvider()); // 按名稱正常呼叫: try { md = MessageDigest.getInstance("RipeMD160"); md.update("HelloWorld".getBytes("UTF-8")); } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) { e.printStackTrace(); } byte[] result = md.digest(); System.out.println(new BigInteger(1, result).toString(16)); }
- 注意:註冊BouncyCastle是通過下面的語句實現的。註冊只需要在啟動時進行一次,後續就可以使用BouncyCastle提供的所有雜湊演算法和加密演算法。
Security.addProvider(new BouncyCastleProvider());
- 計算結果:ecabeaa2eb986c85e6a6ea2c22b248ab6916de35
3.2官方站點下載jar,配置java.security的方式
- 去官方站點下載Bouncy Castle的JCE Provider包 bcprov-ext-jdk15-145.jar
- 把jar檔案複製到 $JAVA_HOME$\jre\lib\ext 目錄下面
- 修改配置檔案\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
#前面是java環境已經提供的,尾部加上這一行即可
security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider
- 舉個栗子檢視本地java系統中安裝的所有的JCE提供者,和一些相應演算法。
@Test
public void case2(){
System.out.println("-------列出加密服務提供者-----");
Provider[] pro=Security.getProviders();
for(Provider p:pro){
System.out.println("Provider:"+p.getName()+" - version:"+p.getVersion());
System.out.println(p.getInfo());
}
System.out.println("");
System.out.println("-------列出系統支援的訊息摘要演算法:");
for(String s:Security.getAlgorithms("MessageDigest")){
System.out.println(s);
}
System.out.println("-------列出系統支援的生成公鑰和私鑰對的演算法:");
for(String s:Security.getAlgorithms("KeyPairGenerator")){
System.out.println(s);
}
}
- 由測試用例結果,我們可以看到列出系統已經安裝的所有的JCE提供者,並且著名的一些的訊息摘要演算法:MD5,生成公鑰和私鑰對的演算法RSA等都在其中。
-------列出加密服務提供者-----
Provider:SUN - version:1.8
SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS & DKS keystores; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, JavaPolicy Policy; JavaLoginConfig Configuration)
Provider:SunRsaSign - version:1.8
Sun RSA signature provider
Provider:SunEC - version:1.8
Sun Elliptic Curve provider (EC, ECDSA, ECDH)
Provider:SunJSSE - version:1.8
Sun JSSE provider(PKCS12, SunX509/PKIX key/trust factories, SSLv3/TLSv1/TLSv1.1/TLSv1.2)
Provider:SunJCE - version:1.8
SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC)
Provider:SunJGSS - version:1.8
Sun (Kerberos v5, SPNEGO)
Provider:SunSASL - version:1.8
Sun SASL provider(implements client mechanisms for: DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5, NTLM; server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5, NTLM)
Provider:XMLDSig - version:1.8
XMLDSig (DOM XMLSignatureFactory; DOM KeyInfoFactory; C14N 1.0, C14N 1.1, Exclusive C14N, Base64, Enveloped, XPath, XPath2, XSLT TransformServices)
Provider:SunPCSC - version:1.8
Sun PC/SC provider
Provider:SunMSCAPI - version:1.8
Sun's Microsoft Crypto API provider
-------列出系統支援的訊息摘要演算法:
SHA-384
SHA-224
SHA-256
MD2
SHA
SHA-512
MD5
-------列出系統支援的生成公鑰和私鑰對的演算法:
RSA
DSA
DIFFIEHELLMAN
EC
4、Java 進口管制限制解除
由於國外的進出口限制,對Java密碼演算法體系進行了一些限制,為了解除限制,需要覆蓋策略檔案。
4.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
下載的策略檔案中需要兩個檔案:local_policy.jar
和US_export_policy.jar
4.2 覆蓋 sdk 和 jre 中的這兩個策略檔案
- sdk 中策略檔案位置→C:\Program Files\Java\jdk1.8.0_144\jre\lib\security
- jre 中策略檔案位置→C:\Program Files\Java\jre1.8.0_144\lib\security
是否生效,可以使用下面的程式檢驗。AES 演算法沒有解除限制之前,金鑰長度只支援128位,其限制解除後,可支援128、192、256位等長度。
@Test
public void case3(){
try {
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(256);
SecretKey secretKey=kg.generateKey();
System.out.println(secretKey.getFormat());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
- 測試結果,已解除限制。若出現 java.security.InvalidKeyException: Illegal key 錯誤,表示限制沒有解除。
小結
BouncyCastle是一個開源的第三方演算法提供商;
BouncyCastle提供了很多Java標準庫沒有提供的雜湊演算法和加密演算法;
使用第三方演算法前需要通過Security.addProvider()
註冊。