15.2.3 利用SATSA高級API進行加解密
除了SATSA定義的兩個可選包可用于連接加密硬件外,還有兩個包能夠實現如今的許多移動應用程序所需的常見加密操作。SATSA-CRYPTO包 包含java.security包、java.security.spec包、javax.crypto包以及javax.crypto.spec包的一 個子集,提供了用于公私鑰管理、消息摘要、簽名驗證以及數字加密的API。SATSA-PKI安全包包含javax.microedition.pki和 javax.microedition. securityservice,定義了支持基本用戶證書管理的類。
使用SATSA-CRYPTO API,讓我們看一下兩個常見操作,在應用程序開發期間可能會用到它們。這兩個操作是:創建消息摘要和加密(或解密)消息。
1. 使用SATSA-CRYPTO API創建消息摘要
移動應用程序可能需要執行的最常見的密碼操作就是創建消息摘要。如今,許多Web服務API使用消息摘要作為一種阻止篡改Web服務請求或響應的有 效負荷(payload)的方式;消息摘要可以是HTTP的頭部或Web服務的參數,也可以簡單地附加到Web服務頭部之后。這就像使用SATSA- CRYPTO API一樣簡單,如代碼清單15-3所示。
代碼清單15-3 創建消息摘要
![]() |
SATSA-CRYPTO API提供了MessageDigest類,該類提供了一個用于創建消息摘要算法實現的靜態工廠,以及一個該消息摘要算法的一個接口。通過調用 MessageDigest的getInstance函數并傳入想要其實現的摘要函數("MD5"或"SHA-1")的名稱,可以獲得 MessageDigest的一個具體實例。生成的MessageDigest對象調用其update方法來使用你傳給它的字節數組,當調用該對象的 digest方法時,它將提供生成的消息摘要并重置算法。
這段代碼假設你擁有一個Web請求,并且想在webRequest中為該請求生成一個MD5摘要。由于MessageDigest接口處理字節數 組,所以這段代碼首先獲取Web請求的字節數組表現形式,然后聲明變量來包含生成的摘要。完成之后,將生成MD5 MessageDigest實現的一個實例,并調用md.update,將組成webRequest的字節傳遞給它。對于較長的文檔,可以多次調用 md.update。當使用update將消息提供給MessageDigest實例之后,代碼將要求該實例使用digest方法計算摘要,這會使用一個 字節數組來存儲輸出和數組中的字節數。
SATSA-CRYPTO提供的MessageDigest實現通常包括MD5和SHA-1算法,但是無法保證每種算法都可用。因此,應用程序應該準備好處理NoSuchAlgorithmExecption。
也可以使用SATSA-CRYPTO API來驗證消息摘要,創建源文檔的一個消息摘要并將其與提供的消息摘要進行比較。沒有用于比較消息摘要的API;可以對每個摘要中的字節進行循環,并逐字節進行比較,以確定每個消息摘要是否相等。
2. 使用SATSA-CRYPTO API加密和解密
在大多數環境下,只有在將數據從設備發送出并在網絡上傳輸時才對其進行加密。在這種情況下,HTTPS通常就能滿足數據安全需求了;有時還需要以一 種加密格式在將數據存儲在本地,或者使用除HTTPS之外的協議交換數據。SATSA-CRYPTO API提供了用于加密和解密數據的接口,但帶有一個局限性:盡管可以,采用公鑰(也稱為對稱)密碼算法加密使用SATSA-CRYPTO API的數據,但是無法解密使用公鑰密碼算法加密的數據。
最好將密碼的SATSA-CRYPTO API想作一個接口,而不是一個具體實現。對于給定的目標,無法確切地知道將會遇到哪種密碼實現;一種設備可能支持DES(Data Encryption Standard,數據加密標準)、RC4(Rivest Cipher 4)以及AES(Advanced Encryption Standard,高級加密標準),而另一種設備可能僅支持DES。無論支持哪種實現,使用SATSA-CRYPTO密碼接口的一般方法都是一樣的。
(1) 以字節數組的形式生成想要加密的明文。
(2) 同樣以字節數組的形式生成要用于加密明文的密鑰。
(3) 生成期望的密碼實現的一個實例,這將是java.security.Cipher的一個實例。
(4) 初始化密碼。
(5) 使用Cipher's update方法逐步加密明文,或者使用Cipher's doFinal方法通過一步操作執行加密。
你可能已經預料到,解密是加密的逆過程;指定密碼實現并指明應該在解密模式下使用它,而無須像步驟3中那樣指定一個密碼實現。傳遞加密的文本,而不是傳遞步驟5中的明文。考慮代碼清單15-4,其中演示了加密消息的過程。
代碼清單15-4 加密消息
![]() |
這段代碼按照上面列出的每步算法編寫;尤其注意,當初始化Cipher實例時,使用ENCRYPT_MODE作為選定模式。解密將是加密的逆過程, 解密算法的代碼只需將相應參數的DECRYPT_MODE傳遞給init。運行此代碼之后,如果沒有異常,字節數組cipherTextBytes將包含 加密的文本。
各種密碼算法在處理輸入的方式上可能不盡相同;一些算法(比如DES)是塊密碼,它要求以大小均勻的塊的形式提供輸入,比如64字節的塊。當使用塊 密碼時,必須將輸入填充為與塊的邊界一致;更復雜的是,一些塊密碼還是非對稱的,也就是說輸入塊的大小與輸出塊的大小不同。其他密碼算法(比如RC4)都 是流密碼:它們獲取一個字節流(明文或加密的文本),然后進行加密或解密。當使用塊密碼時,一定要確保將所有塊都傳遞給了update和doFinal方 法。
當使用Cipher接口加密或解密時,可能會發生一些事情;針對各種事情,API會分別拋出以下異常。
當輸入未被正確填充或塊的大小錯誤時,API為塊密碼拋出BadPaddingException或Illegal- BlockSizeException。
當密碼算法使用了一個無效的密鑰時,API拋出InvalidKeyException。
當你嘗試在初始化消息之前,使用密碼算法對其加密或解密時,API拋出Illegal- StateException。
如果你試圖獲取一個不受支持的算法的Cipher實例,API將拋出NoSuchAlgorithmException。
注意? 在真實世界中,你不應該隨便將密碼算法的私鑰嵌入到源代碼或其他易于讀取的資源中,比如JAR文件的組成部分。惡意用戶可能通過反編譯應用程序或JAR找 到密鑰。相反,應該在分發時創建密鑰,每個應用程序使用不同的密鑰,并且僅適用安全的HTTP分發應用程序JAD。但是,這將意味著應用程序不能由 Java Verified Program的參與者進行簽名和驗證。也可以提供一個Web服務來安全地生成密鑰,并通過HTTPS傳遞給你的應用程序。
?
原文地址:http://book.51cto.com/art/200908/145122.htm[轉載]
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
