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,這是一次重大的改進。
發佈了58 篇原創文章 · 獲贊 4 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章