1. 程式人生 > >Java加密與解密的藝術-讀書筆記3-4章

Java加密與解密的藝術-讀書筆記3-4章

第3章-Java加密利器 Java安全領域組成部分:Java安全領域總共分為4個部分:JCA(Java Cryptography Architecture,Java加密體系結構)、JCE(Java Cryptography Extension Java加密擴充套件包)、JSSE(Java Secure Sockets Extensions Java安全套接字擴充套件包)、JAAS(Java Authentication and Authentication Service Java鑑別與安全服務) JCA和JCE並不執行任何演算法,他們只是連線應用和實際演算法實現的一組介面。 根據美國出口限制規定,JCA可出口,但JCE對部分國家是限制出口的。第三方的Bouncy Castle JCE就是其中的一個安全提供者。 Bouncy Castle的API是免費的。 JDK1.4版本及其後續版本中包含了上述擴充套件包,無須進行配置。 sun.security.rsa.SunRsaSign是實現RSA演算法的提供者 安全提供者實現了兩個抽象的概念:引擎和演算法。引擎可以理解為操作,如加密、解密等。演算法則實現了操作如何執行,如一個演算法可以理解為一個引擎的具體實現。 關於出口的限制-這種出口與進口的限制主要體現在JCE和JSSE的加密演算法中。DES因受到軍事出口限制,目前僅提供56位的金鑰長度,而實際上,安全要求則至少128位。非軍事加密演算法強度遠不如軍事加密演算法強度高。 本書主要集中在java.security和javax.crypto包。 第4章-他山之石可以攻玉
受出口限制,金鑰長度上不恩能夠滿足要求,部分演算法未能支援,如MD4、SHA-224等演算法; 對於出口限制,SUN通過許可權檔案(local_policy.jar、US_export_policy.jar)做了相應限制。但幸運的是,SUN在官方主頁上提供了替換檔案,可以減少相關的限制。搜尋Java Cryptography Extension(JCE) Unlimited Strength Jurisdiction Policy File。 Bouncy Castle提供了一系列演算法支援實現;Commons Codec並未對Java7提供擴充套件加密演算法。僅僅是對Java7提供的API做了擴充套件。 配置許可權檔案-切換到%JDK_Home%jre\lib\security目錄下,對應覆蓋local_policy.jar和US_export_policy.jar兩個檔案。同時,你可能有必要在%JRE_HOME%lib\security目錄下,也對應覆蓋這兩個檔案。 我們在應用伺服器上安裝的是JRE,而不是JDK。因此有必要在應用伺服器的%JRE_HOME%\lib\security目錄下,對應覆蓋這兩個許可權檔案。 如果不加許可權配置直接使用256位長度的金鑰,就會得到名為“java.security.InvalidKeyException”的異常。 獲得加密元件-我們可以下載Bouncy Castle最新的加密元件包,主要是bcprov-jdk16-149.jar和bcprov-ext-jdk16-149.jar兩個檔案。 擴充演算法支援: 配置%JDK_HOME%\jre\lib\security\java.security檔案 為了加入Bouncy Castle加密元件需要這樣做: #增加BouncyCastleProvider security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider 將bcprov-ext-jdk16-149.jar匯入到%JDK_HOME%\jre\lib\ext目錄下。 使用時需要將bcprov-jdk16-149.jar匯入工程。 最後,我們只需要在初始化金鑰工廠、金鑰生成器等引擎類之前呼叫如下程式碼: //加入BouncyCastleProvider支援 Security.addProvider(new BouncyCastleProvider()); 1-Base64: String
str = "base64編碼";
System.
err.println("原文:\t"+str);
byte[] input = str.getBytes();
//Base64編碼byte[] data = Base64.encode(input);
System.
err.println("編碼後:\t"+new String(data));
//Base64解碼byte[] output = Base64.decode(data);                      System.err.println("解碼後:\t"+new String(output)); 編碼後的內容中,出現”=“符號,這是Base64編碼的標誌性符號。
2-UrlBase64: Base64演算法最初用於電子郵件系統,後經演變成為顯式傳遞URL引數的一種編碼演算法,通常稱為”Url Base64”。他是Base64演算法的變體,將字元對映表中用作補位的”=“換成”.”,並用”-“和”_”分別替換”+”和”/,使得Base64編碼符合URL引數規則。 String str = "Base64 編碼";
System.
err.println("原文:\t"+str);
byte[] input = str.getBytes();
//Base64編碼byte[] data = UrlBase64.encode(input);
System.
err.println("編碼後:\t"+new String(data));
//Base64解碼byte[] output = UrlBase64.decode(data); System.err.println("解碼後:\t"+new String(output)); 編碼後的內容中,出現了”.”符號,替換掉”=“符號,符合了URL引數規則 3-Hex Hex類用於十六進位制轉換。常配合訊息摘要演算法處理摘要值,以十六進位制形式公示。 String str = "Hex 編碼";
System.
err.println("原文:\t"+str);
byte[] input = str.getBytes();
//Hex編碼byte[] data = Hex.encode(input);
System.
err.println("編碼後:\t"+new String(data));
//Hex解碼byte[] output = Hex.decode(data); System.err.println("解碼後:\t"+new String(output)); Common Codec目前提供的加密元件包版本是1.4,這是一次重大的改進。