1. 程式人生 > 其它 >Bouncy Castle 密碼包的配置及使用詳解

Bouncy Castle 密碼包的配置及使用詳解

技術標籤:加密與安全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.jarUS_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()註冊。

參考: