Java Card2.0を理解する

この記事は、スマートカードの概要と、スマートカード標準であるISO7816の簡単なレビューから始まります。以前のJavaDeveloperコラムのスマートカードの背景を踏まえて、今回の記事では、「Javaカードとは何ですか?」という質問への回答から始めます。およびJavaCardシステムアーキテクチャの概要。次に、Java Cardのライフサイクルなど、JavaCardに固有の多くの問題に焦点を当てます。Java Card2.0言語サブセットとAPIライブラリクラス。およびJavaCardのセキュリティ。次に、Java Cardランタイム環境について説明し、JavaCardがどのように実行されるかを示します。最後に、JavaCard専用に作成された電子ウォレットアプリケーションというわかりやすい例を示します。

これ以降、Java Cardへのすべての参照は、暗黙的にJava Card2.0を参照します。

スマートカードとは何ですか?

クレジットカードのサイズと同じように、スマートカードは、本体のプラスチック基板のシリコンに埋め込まれた電子回路を介して情報を保存および処理します。スマートカードには2つの基本的な種類があります。インテリジェントスマートカードにはマイクロプロセッサが含まれており、小さなマイクロコンピュータのように、読み取り、書き込み、および計算機能を提供します。メモリカードは、他の一方で、マイクロプロセッサを持っていないとだけ情報を保存するためのものです。メモリカードは、セキュリティロジックを使用してメモリへのアクセスを制御します。

すべてのスマートカードには、次の3種類のメモリが含まれています。永続的な非可変メモリ。永続的な可変メモリ。および非永続的な可変メモリ。ROM、EEPROM、およびRAMは、現在のスマートカードの3つのそれぞれのタイプで最も広く使用されているメモリです。永続メモリは、不揮発性メモリとも呼ばれます。この記事では、永続的および不揮発性という用語を同じ意味で使用します。

国際標準化団体によって定義されたISO7816パート1-7には、スマートカードのさまざまな側面をカバーする一連の標準が含まれています。ISO7816は次のもので構成されています。

  • 物理的特性(パート1)

  • 接点の寸法と位置(パート2)

  • 電子信号と伝送プロトコル(パート3)

  • 交換のための業界間コマンド(パート4)

  • アプリケーション識別子(パート5)

  • 業界間データ要素(パート6)

  • SCQLの業界間コマンド(パート7)

次の図は、ISO7816のパート1で定義されているスマートカードの物理的特性を示しています。

ISO 7816およびスマートカードの詳細については、「スマートカード:入門書」を参照してください。

通常、スマートカードには、電源、ディスプレイ、またはキーボードは含まれていません。8つの接点を介してシリアル通信インターフェースを使用して外界と相互作用します。接点の寸法と位置は、ISO 7816のパート2で説明されています。この図は、スマートカードの接点を示しています。

スマートカードがカード受け入れデバイス(CAD)に挿入され、別のコンピューターに接続される場合があります。カード受け入れデバイスに使用されるその他の用語は、端末リーダー、およびIFD(インターフェイスデバイス)です。これらはすべて同じ基本機能を提供します。つまり、カードに電力を供給し、データ伝送接続を確立します。

2台のコンピューターが相互に通信するとき、それらは一連のプロトコルに従って構築されたデータパッケージを交換します。同様に、スマートカードは、APDU(Application Protocol Data Units)と呼ばれる独自のデータパッケージを使用して外界と通信します。APDUには、コマンドまたは応答メッセージのいずれかが含まれています。カードの世界では、スマートカードが常に受動的な役割を果たすマスタースレーブモデルが使用されます。つまり、スマートカードは常に端末からのコマンドAPDUを待機します。次に、APDUで指定されたアクションを実行し、応答APDUで端末に応答します。コマンドAPDUと応答APDUは、カードと端末の間で交互に交換されます。

次の表に、コマンドと応答のAPDU形式をそれぞれ示します。APDU構造は、ISO7816のパート4で説明されています。

コマンドAPDU
必須ヘッダー 条件付きボディ
CLA INS P1 P2 Lc データフィールド

ヘッダーは、選択したコマンドをコード化します。これは、クラス(CLA)、命令(INS)、およびパラメーター1と2(P1とP2)の4つのフィールドで構成されています。各フィールドには1バイトが含まれます。

  • CLA:クラスバイト。多くのスマートカードでは、このバイトはアプリケーションを識別するために使用されます。

  • INS:命令バイト。このバイトは命令コードを示します。

  • P1-P2:パラメータバイト。これらは、APDUコマンドにさらなる資格を提供します。

Lcは、コマンドAPDUのデータフィールドのバイト数を示します。Leは、次の応答APDUのデータフィールドで予想される最大バイト数を示します。

応答APDU
条件付きボディ 必須の予告編
データフィールド SW1 SW2

ステータスバイトSW1およびSW2は、カード内のコマンドAPDUの処理ステータスを示します。

Java Cardとは何ですか?

Java Cardは、Javaプログラムを実行できるスマートカードです。Java Card 2.0仕様は、// www.javasoft.com/javacardで公開されました。スマートカードでJavaCard仮想マシンとアプリケーションプログラミングインターフェイス(API)を構築するための詳細情報が含まれています。最小システム要件は、16キロバイトの読み取り専用メモリ(ROM)、8キロバイトのEEPROM、および256バイトのランダムアクセスメモリ(RAM)です。

次の図に、JavaCardのシステムアーキテクチャを示します。

図に示すように、Java Card VMは、特定の集積回路(IC)とネイティブオペレーティングシステムの実装の上に構築されています。 JVM層は、共通の言語とシステムインターフェイスを使用して、製造元独自のテクノロジを隠します。 Java Cardフレームワークは、Java Cardアプリケーションを開発し、それらのアプリケーションにシステムサービスを提供するための一連のアプリケーションプログラミングインターフェイス(API)クラスを定義します。特定の業界または企業は、サービスを提供したり、セキュリティおよびシステムモデルを改良したりするためのアドオンライブラリを提供できます。JavaCardアプリケーションはアプレットと呼ばれます。 1枚のカードに複数のアプレットを配置できます。各アプレットは、ISO 7816、パート5で定義されているように、そのAID(アプリケーション識別子)によって一意に識別されます。

覚えておくべき重要な点は、スマートカードがそうではないことです:それらはパーソナルコンピュータではありません。それらは限られたメモリリソースと計算能力を持っています。ユーザーは、Java Card2.0を単にJDKの簡略版と考えるべきではありません。

JavaCardの寿命

Java Cardの有効期間は、ネイティブOS、Java Card VM、APIクラスライブラリ、およびオプションでアプレットがROMに書き込まれるときに始まります。着信コマンドを実行するためにチップの可変でないメモリに永続的なコンポーネントを書き込むこのプロセスは、マスキングと呼ばれます。

ウォレットに到達する前に、JavaCardは初期化とパーソナライズを行う必要があります。初期化とは、一般的なデータをカードの不揮発性メモリにロードすることです。このデータは多数のカードで同一であり、個人に固有のものではありません。例としては、発行者または製造元の名前があります。

次のステップであるパー​​ソナライズには、カードを人に割り当てることが含まれます。これは、物理的なパーソナライズまたは電子的なパーソナライズによって発生する可能性があります。物理的なパーソナライズとは、カードのプラスチック面に名前とカード番号をエンボス加工またはレーザー彫刻することです。電子パーソナライズとは、カードの不揮発性メモリに個人データ(個人キー、名前、PIN番号など)をロードすることです。

初期化とパーソナライズは、ベンダーごと、発行者ごとに異なります。どちらの場合も、EEPROM(不揮発性メモリの一種)はデータの保存によく使用されます。

この時点で、JavaCardを使用する準備ができています。Java Cardは、発行者から入手するか、小売業者から購入できます。小売業者が販売するカードは汎用であり、その場合、パーソナライズは省略されることがよくあります。

これで、Java Cardをリーダーに挿入して、カード上にあるアプレットにAPDUコマンドを送信したり、カードにさらにアプレットやデータをダウンロードしたりできます。

Java Cardは、回復不能なエラーのために期限切れになるかブロックされるまでアクティブのままです。

JavaCard仮想マシンの寿命

PCまたはワークステーションのJava仮想マシン(JVM)とは異なり、JavaCard仮想マシンは永久に実行されます。

カードに保存されている情報のほとんどは、電源を切ったとき、つまりカードをリーダーから取り外したときでも保持する必要があります。Java Card VMは、永続情報を保持するためにEEPROMにオブジェクトを作成します。Java Card VMの実行ライフタイムは、カードのライフタイムです。電源が供給されていない場合、VMは無限のクロックサイクルで実行されます。

JavaCardアプレットとオブジェクトの存続期間

アプレットの寿命は、システムのレジストリテーブルに正しくインストールおよび登録されたときに始まり、テーブルから削除されたときに終わります。ただし、ガベージコレクションがカードに実装されているかどうかによって、削除されたアプレットのスペースが再利用される場合とされない場合があります。カード上のアプレットは、端末によって明示的に選択されるまで非アクティブな段階にあります。

オブジェクトは永続メモリ(EEPROMなど)に作成されます。他の永続オブジェクトがそれらを参照しない場合、それらは失われるか、ガベージコレクションされる可能性があります。ただし、EEPROMへの書き込みはRAMよりも1000倍遅くなります。

一部のオブジェクトは頻繁にアクセスされ、それらのフィールドの内容は永続的である必要はありません。Java Cardは、RAM内の一時的な(一時的な)オブジェクトをサポートします。オブジェクトが一時的であると宣言されると、その内容を永続メモリに戻すことはできません。

Java Card2.0言語サブセット

もちろん、JavaCardプログラムはJavaで書かれています。これらは、一般的なJavaコンパイラを使用してコンパイルされます。メモリリソースと計算能力が限られているため、Java LanguageSpecificationで定義されているすべての言語機能がJavaCardでサポートされているわけではありません。具体的には、JavaCardは以下をサポートしていません。

  • 動的なクラスの読み込み

  • 保安管理者

  • スレッドと同期

  • オブジェクトのクローニング

  • ファイナライズ

  • 大きなプリミティブデータ型(float、double、long、およびchar)

これらの機能をサポートするキーワードも言語から省略されているのは当然のことです。VMの実装者は、より多くのメモリを備えたより高度なスマートカードで作業している場合、発行後のアプレットに対して32ビット整数型またはネイティブメソッドをサポートすることを決定する場合があります。発行後アプレットは、カードがカード所有者に発行された後にJavaCardにインストールされるアプレットです。

Java Card2.0フレームワーク

スマートカードは20年間市場に出回っており、それらのほとんどは一般にISO7816パート1-7および/またはEMVと互換性があります。ISO 7816についてはすでに見てきました。EMVとは何ですか?Europay、MasterCard、およびVisaによって定義されたEMV標準は、金融業界の特定のニーズを満たすための追加の独自機能を備えたISO7816シリーズの標準に基づいています。Java Card Frameworkは、スマートカードシステムとアプリケーションを簡単にサポートするように設計されています。スマートカードインフラストラクチャの詳細を隠し、JavaCardアプリケーション開発者に比較的簡単でわかりやすいプログラミングインターフェイスを提供します。

Java Cardフレームワークには、次の4つのパッケージが含まれています。

パッケージ名 説明
javacard.framework これはカードのコアパッケージです。これは、Java Cardプログラムの基本的な構成要素であるandなどのクラスを定義し、APDU処理やオブジェクト共有などのJavaCardプログラムにランタイムおよびシステムサービスを提供する、および、
javacardx.framework このパッケージは、ISO7816-4互換ファイルシステムのオブジェクト指向設計を提供します。ISO7816で指定されているように、エレメンタリファイル(EF)、専用ファイル(DF)、およびファイル指向のAPDUをサポートします。
javacardx.cryptoおよびjavacardx.cryptoEnc これらの2つのパッケージは、スマートカードに必要な暗号化機能をサポートしています

Java命名規則に準拠して、JavaCardxパッケージはJavaCardフレームワークの拡張機能です。カードでそれらをサポートする必要はありません。

JavaCardのセキュリティ

JavaアプレットにはJavaセキュリティ制限が適用されますが、JavaCardシステムのセキュリティモデルは多くの点で標準Javaとは異なります。

Security Managerクラスは、JavaCardではサポートされていません。言語セキュリティポリシーは、仮想マシンによって実装されます。

Javaアプレットは、データを格納および操作するオブジェクトを作成します。オブジェクトは、それを作成するアプレットによって所有されます。アプレットにオブジェクトへの参照がある場合でも、アプレットがオブジェクトを所有しているか、オブジェクトが明示的に共有されていない限り、アプレットはオブジェクトのメソッドを呼び出すことができません。アプレットは、そのオブジェクトを特定のアプレットまたはすべてのアプレットと共有できます。

アプレットは、JavaCard内の独立したエンティティです。その選択、実行、および機能は、同じカードにある他のアプレットの影響を受けません。

JavaCard内で物事がどのように連携するか

Java Card内では、JCRE(Java Cardランタイム環境)は、JavaCard仮想マシンとJavaCardFrameworkのクラスを指します。Java Card内の各アプレットは、JCREによって割り当てられた一意のAIDに関連付けられています。

アプレットがカードの永続メモリに正しくロードされ、Java Card Frameworkおよびカード上の他のライブラリとリンクされた後、JCREはアプレットのインストールプロセスの最後のステップとしてアプレットのinstallメソッドを呼び出します。パブリック静的メソッド、installは、アプレットのインスタンスを作成してJCREに登録するために、アプレットクラスによって実装される必要があります。メモリが限られているため、この時点で、アプレットの存続期間中に必要となるオブジェクトを作成して初期化することをお勧めします。