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