智能卡中Java軟件的開發
文章出處:http://5052h112.com 作者:Admin 人氣: 發表時間:2011年09月27日
如何去開發一個智能卡的java程序并運行它?第1件事是所開發的程序用于文本編輯器時能產生真正的java 源代碼,然后用任何所期望的java編譯器編譯源代碼,它產生與機器無關的字節碼。到此為止,和用java對 pc機編程的過程是一樣的。
現在,字節碼作為類文件被傳送到java虛擬機的卡外部分(卡外vivi),卡外vm檢查其格式、語法、字段 基準和與程序有關的方面。如果所有這些檢查都通過,則卡外vm建立起一個稱為卡的應用cap(card application)文件。如有必要,可以隨應用以數字簽名的方式來提供,數字簽名的提供保證了cap文件已被 卡外vm檢查過并已被鑒明。如果這里不存在可以被驗證的簽名,則就將有可能用一個受操縱的支程序繞過卡 內vm的安全機制,因為在智能卡上沒有足夠的存儲器能使卡內vm本身去進行所有的安全檢查。在此之后,支 程序以cap文件的格式裝入智能卡中。智能卡首先驗證通常會存在的數字簽名,一旦檢驗通過后就把支程序 傳給卡內vm。在此之后所發生的事在很大程度上和pc機里的虛擬機執行程序的情況很相似。卡內vm逐行測試 并解釋字節碼,產生智能卡處理器的機器指令,這一過程如圖1所示。
圖1所產生的目標處理器的本機程序代碼被執行后將產生相應的響應apdu,從命令apdu到響應apdu的數據流 程如圖2所示。
實際的過程,自然要比上面所述的要復雜些。希望程序員在接受到任務后不要立即開始java代碼的編寫, 相反,首先要分析和設計確定真正的需求。然后,才可開始編程。
圖1 從程序開發到智能卡微控制器中的java虛擬機執行程序的過程
圖2 以java智能卡層次模型為參考的命令apdu和相應的響應apdu的數據流程
為了在編碼時或其后能迅速對差錯定位,程序員可用一個智能卡java仿真器,這使其可對代碼的執行逐步跟蹤,去檢驗變量并方便而又迅速做出任何必需的糾正。這種仿真器的樣例,如圖3所示。
與此有關的是,對于比較大型的和那些把安全性作為關鍵的項目要執行一些適當的測試。這些測試對命令和響應的所有成功的結果和最重要的錯誤結果進行檢查。由獨立方對源代碼所做的檢驗也可包括在內。
就像從此例中所看到的,用智能卡的java顯著減少了編程所需時間,作為附帶的效果它還降低了差錯出現的機會。然而,編碼本身僅僅是開發智能卡軟件的許多部分之一。java對智能卡的主要好處是它使得許多不同的程序員可以共同開發智能卡的可執行程序,而不是少量的由卡制造商雇用的軟件開發者。
為了生產智能卡的java支程序,不僅應把操作系統的特殊性能考慮在內,同時還應顧及java卡2.0規范的性能特點,現將它們列舉簡述如下:
1)執行速度
除了其存儲量的要求外,智能卡java的關鍵要點還在于其較低的執行速度。然而,在匯編程序和java之間比較難以做出合理的折中,對此的主要理由是只要程序的行為在對終端的接口處相同并沒 有絕對的必要像在匯編中那樣去在java中建立起同樣的處理過程。例如,對于java程序并不總是需要文件系 統,而且可能不會有任何人會用java來編寫一個加密算法。
另一個普遍的考慮是應當盡可能多的在java架構中使用方法(method),因為它們是部分地使用目標處理 器的本機代碼編碼的,這樣可導致處理速度的明顯加快。作為一條準則,純處理時間,不包括數據傳輸所需 的時間,可以假定為普通匯編程序的2~3倍。
2)應用選擇
在java卡中選擇一特定的應用相當于用其惟一的aid去選擇相關的支程序。支程序在它被選中時就被調用, 所以它能進行任何必需的初始化。此后,支程序自動接收所有從終端發送至智能卡的命令apdu,如果支程序 未被選擇,它就是非活性的并且也不涉及任何數據傳送。
3)防火墻——保持應用間相隔離
從計算的觀點看來,在智能卡中的各個支程序相互間是完全絕緣的,任何可能的相互影響都被java虛擬機 的安全管理器和智能卡操作系統所阻止。然而,一個支程序可以使它自己的數據對象在必要時為另外的支程 序使用,一個典型的例子是pin,它對卡中的所有應用(意即那些支程序)是同樣有效的。
4)交易完整性——原子進程(atomic processes)會話期間的突然斷電必須不致引起支程序的數據處于未規定的狀態。當一對象被修改時,這一點由虛擬機或操作系統隱含地予以保護。然而,如果必須無條件地保證跨越數個對象或過程時的完整性,則支程序的程序員可以采用那些專用的機制,使用這些機制,有可能確切保證所提及的這些對象或是保留在它們原來的狀態,或是采取新狀態。
5)文件系統
對于一個支程序并不強制它必須有自己的文件系統。對于某些應用,它完全合適于建立起與文件無關的數據對象,它們或是可用標準的命令訪問或是用程序員自己定義的命令訪問(私用命令)。沒有文件系統的支程序的好處再次和過去已有的在智能卡中需要節約使用存儲量聯系起來。此外,java的面向對象的特性使得對數據對象的訪問可按照其相關的調用條件來調用對象。在這方面,對某些應用有可能實現滿足非常專門需求的訪問。例如,該應用或用戶有可能提供使其他方面繼承他們的訪問特權。
盡管如此,對pc機和智能卡二者來說,通常現在的應用表明對數據的存儲和管理仍經常采用面向文件的結構。這種選擇并未被java卡規范所排除,因為它提供了它本身的關于iso/iec 7816-4,文件結構的類。這些接口也提供了兼容已有的具有標準文件樹的應用的java智能卡基礎。
6)刪除對象——持久的和暫時的對象
所有的對象當它們是用new()產生時,都一致被建立為EEPROM中的持久對象。持久性指的是一對象保存到會話期結束的能力,它和暫時性是相對的。持久對象在會話期結束和突然掉電兩種情況下都能生存而不會丟失數據或連貫性。任何對象都只有在有指向它的引用時才存在,如果引用去掉了,雖然它仍舊占據著存儲器然而對象實際上就不再存在了。對此的惟一的補救法是用一個具有碎片搜索的文件管理器,但是在java卡2.0規范中沒有提供它,它占用的存儲量太多。
有可能把一個持久對象轉換成暫時對象,然后可以把它放在ram中。轉換只能在這一方向上進行。暫時對象的數據在現行會話期結束時會丟掉,然后用其標準值重新初始化。
7)刪除支程序
java卡2.0規范沒有提供在智能卡中刪除支程序的機制。最多可以做到的是依靠其本身的功能來阻塞支程序,但是它所占用的存儲器將永遠失去,不能為別的支程序使用。
在測試卡時,通常具有可以刪掉存儲區域中的整個支程序的專門功能,這種能力僅在調整和測試的環境中才能見到其存在,而不存在于已發行的供一般使用的“真正”卡中。
如果智能卡java虛擬機的未來版本能夠包括一個碎片收集器,就將有可能從存儲器中刪除支程序。
8)加密算法
現在一般使用的許多加密算法或是做了些修改并在位水平上(諸如des)有所改變,或是使用了長數字(諸如rsa)的算術。目前,有java的智能卡不適合于用java對這些算法編程,這是由于其執行速度較低或存儲容量有限的緣故。
結果,在這些卡中通常有著javacardx,ct)rpto類,它們對用本機代碼編程的算法的實現提供了一個接口(api)。例如,這樣就使得具有三個獨立的56位密鑰的真正的3-des加密算法用相繼三次調用適當的具有56位密鑰的單重des算法得以用java編程。用java這樣實現的3-des所提供的數據保護水平僅僅較用本機匯編代碼所提供的約低30%。
9)密碼術和出口限制
許多國家對具有通用操作系統并經內部接口可自由使用數據加密和解密功能的智能卡的出口是需要許可證的。這就是說,這些類型的智能卡完全不能出口到某些國家,或者必須等待數月之久以取得由負赍機關發給的適當的許可證才能出口。
因此,在java卡中的加密功能的類被構造成它們可直接用于對一般數據的解密和mac計算但卻不能加密。這完全適合于許多應用,因而在許多國家可以使用‘簡化’的出口許可過程。
然而,如果一特定的應用需要把數據加密,則卡制造商可把類…cryptoenc。des3ˉenckev和…cryptoenc.des-enckey包括在內,它使加密成為可能。不過,從純粹的密碼術觀點看來,完全有可能輕而易舉地實現自由地用于加密和解密的處理,而不必使用那些“加密”類。
10)存儲量的使用最少