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