Java Cardは、 Javaベースのアプリケーション (アプレット)をスマートカード上、さらに一般的には「セキュア エレメント」(SE) と呼ばれる、メモリ使用量の少ない同様の安全なデバイス[1]上で安全に実行できるようにするソフトウェア テクノロジです。今日、セキュア エレメントはスマート カードやその他の取り外し可能な暗号化トークンのフォーム ファクタに限定されません。デバイス ボードにはんだ付けされた組み込み SE や、汎用チップに組み込まれた新しいセキュリティ設計も広く使用されています。Java Card は、Java によってもたらされたコードの移植性を維持しながら、このハードウェアの断片化と特殊性に対処します。
Java Card は、組み込みデバイスを対象とした最小の Java プラットフォームです。Java Card を使用すると、ユーザーはデバイスをプログラムしてアプリケーション固有のものにすることができます。これは、SIM カードと組み込み SIM 内の無線通信、銀行カード[2]内の支払い、NFC モバイル支払い、身分証明書、医療カード、パスポートなど、さまざまな市場で広く使用されています。ゲートウェイなどのいくつかの IoT 製品も、たとえばクラウド サービスとの通信を保護するために Java Card ベースの製品を使用しています。
最初の Java Card は、後にGemplusと合併してGemaltoとなったSchlumbergerのカード部門によって 1996 年に導入されました。Java Card 製品は、 Sun Microsystems (後にOracle Corporationの子会社)の仕様に基づいています。多くの Java Card 製品も、カード上のアプリケーションの安全な管理 (ダウンロード、インストール、パーソナライズ、削除) のために GlobalPlatform 仕様に依存しています。
Java Cardテクノロジーの主な設計目標は、移植性、セキュリティ、下位互換性です。[3]
ポータビリティ
Java Card は、Java アプレットが複数のコンピュータで実行されるのと同じように、同じ Java Card アプレットを複数のスマート カードで実行できるようにする、標準のスマート カードコンピューティング環境を定義することを目的としています。Java と同様に、これは仮想マシン (Java Card 仮想マシン) と明確に定義されたランタイム ライブラリの組み合わせを使用して実現され、スマート カード間の違いからアプレットをほぼ抽象化します。移植性は、メモリ サイズ、パフォーマンス、ランタイム サポート (通信プロトコルや暗号化アルゴリズムなど) の問題によって緩和されます。
安全
Java Card テクノロジは、もともとスマート カードに保存された機密情報を保護する目的で開発されました。セキュリティは、このテクノロジのさまざまな側面によって決まります。
- データのカプセル化
- データはアプリケーション内に保存され、Java Card アプリケーションは、基盤となるオペレーティング システムおよびハードウェアとは別の分離された環境 (Java Card VM) で実行されます。
- アプレットファイアウォール
- 他の Java VM とは異なり、Java Card VM は通常、それぞれが機密データを制御している複数のアプリケーションを管理します。したがって、異なるアプリケーションは、アプレット ファイアウォールによって互いに分離され、アプレット間のデータ要素のアクセスを制限およびチェックします。
- 暗号化
- DES、トリプル DES、AESなどの一般的に使用される対称キー アルゴリズムと、RSA、楕円曲線暗号などの非対称キー アルゴリズムがサポートされており、署名、キー生成、キー交換などのその他の暗号化サービスもサポートされています。
- アプレット
- アプレットは、受信したコマンド要求のみを処理し、データまたは応答ステータス ワードをインターフェイス デバイスに送り返すことで応答するステート マシンです。
デザイン
言語レベルでは、Java Card は Java の正確なサブセットです。Java Card のすべての言語構成要素は Java に存在し、同じように動作します。つまり、標準ビルド サイクルの一部として、Java Card プログラムは Java コンパイラによって Java クラス ファイルにコンパイルされ、クラス ファイルは Java Card プラットフォーム固有のツールによって後処理されます。
ただし、Java Card では多くの Java 言語機能がサポートされていません (特に、char、double、float、long の各型、transient修飾子、列挙型、多次元配列、ファイナライズ、オブジェクトのクローン作成、スレッド)。さらに、多くの実際のスマート カードでは、実行時に Java の一般的な機能の一部が提供されません (特にint、Java 式のデフォルト型である 型、およびオブジェクトのガベージ コレクション)。
バイトコード
Java Card 仮想マシンによって実行される Java Card バイトコードは、標準 Java 仮想マシンによって実行されるJava 2 バイトコードの機能的サブセットですが、サイズを最適化するために異なるエンコーディングが使用されています。したがって、Java Card アプレットは、通常、同じ Java ソース コードをコンパイルして得られる仮想 Java アプレットよりも少ないバイトコードを使用します。これによりメモリが節約されます。これは、スマート カードなどのリソースが制限されたデバイスでは必須です。設計上のトレードオフとして、一部の Java 言語機能 (上記参照) とサイズ制限はサポートされていません。アプリケーションのコードを 64 KiB制限未満のパッケージに分割するなど、サイズ制限を克服するテクニックは存在します。
ライブラリとランタイム
標準の Java Card クラス ライブラリとランタイム サポートは、Java の場合とは大きく異なり、共通のサブセットは最小限です。たとえば、Java セキュリティ マネージャ クラスは、セキュリティ ポリシーが Java Card 仮想マシンによって実装される Java Card ではサポートされていません。また、一時変数 (クラス メンバーになることができる非永続的な高速 RAM 変数) は、Java Card クラス ライブラリを介してサポートされますが、Java ではネイティブ言語でサポートされています。
具体的な特徴
Java Card ランタイムおよび仮想マシンは、Java Card プラットフォームに固有の機能もサポートします。
- 持続性
- Java Card では、オブジェクトはデフォルトで永続メモリに保存されます (スマート カードの RAM は非常に少なく、一時的またはセキュリティ上重要なオブジェクトにのみ使用されます)。そのため、ランタイム環境とバイトコードは永続オブジェクトを管理するために適応されています。
- 原子性
- スマート カードは外部電源で動作し、永続メモリに依存しているため、永続的な更新はアトミックである必要があります。したがって、個々のバイトコード命令と API メソッドによって実行される個々の書き込み操作はアトミックであることが保証され、Java Card Runtime には制限されたトランザクション メカニズムが含まれています。
- アプレットの分離
- Java Card ファイアウォールは、カード上に存在するさまざまなアプレットを互いに分離するメカニズムです。また、アプレットがオブジェクトを他のアプレットで明示的に使用できるようにする共有メカニズムも含まれています。
発達
実際の Java Card プログラムで使用されるコーディング手法は、Java プログラムで使用されるものとは大きく異なります。それでも、Java Card は Java 言語の正確なサブセットを使用するため、学習曲線が短縮され、Java 環境を使用して Java Card プログラムを開発およびデバッグできます (注意: Java バイトコードでデバッグする場合でも、クラス ファイルを Java Card バイトコードに変換して Java Card 言語の制限に適合していることを確認し、早い段階で実際の Java Card スマート カードでテストしてパフォーマンスを把握してください)。さらに、スマート カードに埋め込まれるアプリケーションの Java Card コードと、スマート カードを使用するホストにある Java アプリケーションの両方を実行してデバッグすることができ、すべて同じ環境で共同で動作します。
バージョン
Oracle は Java Card プラットフォーム仕様をいくつかリリースしており、アプリケーション開発用の SDK ツールを提供しています。通常、スマート カード ベンダーは Java Card プラットフォーム ターゲットで指定されたアルゴリズムのサブセットのみを実装しており、どの仕様のサブセットが実装されているかを知る唯一の方法は、カードをテストすることです。[4]
- バージョン3.2(2023年1月30日)[5]
- (D)TLS1.3プロトコルのサポートを導入
- アプリケーション開発者を支援し、複数の実装間での相互運用性のレベルを大幅に向上させるために、APIの明確化を追加しました。
- バージョン3.1(2018年12月17日)[6]
- 構成可能なキー ペア生成サポート、名前付き楕円曲線サポート、新しいアルゴリズムと操作のサポート、追加の AES モードと中国語アルゴリズムが追加されました。
- バージョン 3.0.5 (2015 年 3 月 6 日)
- Oracle SDK: Java Card Classic 開発キット 3.0.5u1 (2015 年 3 月 6 日)
- Diffie-Hellman モジュラー指数、Diffie-Hellman のドメイン データ保存、楕円曲線および DSA キー、RSA-3072、SHA3、プレーン ECDSA、AES CMAC、AES CTR のサポートが追加されました。
- バージョン 3.0.4 (2011 年 6 月 8 日)
- Oracle SDK: Java Card Classic 開発キット 3.0.4 (2011 年 6 月 11 日)
- DES MAC8 ISO9797 のサポートが追加されました。
- バージョン 3.0.1 (2009 年 6 月 15 日)
- Oracle SDK: Java Card 開発キット 3.0.3 RR (2010 年 11 月 11 日)
- すべての署名アルゴリズムに SHA-224、SHA-2 のサポートが追加されました。
- バージョン 2.2.2 (2006 年 3 月)
- Oracle SDK: Java Card 開発キット 2.2.2 (2006 年 3 月)
- SHA-256、SHA-384、SHA-512、ISO9796-2、HMAC、韓国語 SEED MAC NOPAD、韓国語 SEED NOPAD のサポートが追加されました。
- バージョン 2.2.1 (2003 年 10 月)
- Oracle SDK: Java Card 開発キット 2.2.1 (2003 年 10 月)
- バージョン 2.2 (2002 年 11 月)
- AES 暗号化キーのカプセル化、CRC アルゴリズム、楕円曲線暗号化キーのカプセル化、ECC を使用した Diffie-Hellman キー交換、バイナリ多項式曲線および素数整数曲線の ECC キー、可変キー長の AES、ECC、および RSA のサポートが追加されました。
- バージョン 2.1.1 (2000 年 5 月 18 日)
- Oracle SDK: Java Card 開発キット 2.1.2 (2001 年 5 月 4 日)
- パディングなしの RSA のサポートが追加されました。
- バージョン 2.1 (1999 年 7 月 6 日)
Java カード 3.0
Java Card仕様のバージョン3.0(2008年3月にドラフトがリリース)は、クラシックエディションとコネクテッドエディションの2つのエディションに分かれています。[7]
- Classic Edition (現在は 2015 年 6 月にリリースされたバージョン 3.0.5) は、Java Card Platform バージョン 2 (最終バージョン 2.2.2 は 2006 年 3 月にリリース) の進化版であり、スマート カードなどのリソースが制限されたデバイスで従来のカード アプレットをサポートします。古いアプレットは一般に新しい Classic Edition デバイスと互換性があり、新しいデバイス用のアプレットは新しいライブラリ関数を参照しない限り、古いデバイスと互換性があります。Java Card Classic Edition を実装したスマート カードは、複数のベンダーによってセキュリティ認定されており、市販されています。
- Connected Edition(現在は2009年12月にリリースされたバージョン3.0.2)は、ネットワーク指向の機能を備えた新しい仮想マシンと拡張実行環境を提供することを目的としています。アプリケーションは、APDUコマンドによって要求される従来のカードアプレットとして、またはカードとのWebベースの通信スキーム(HTML、REST、SOAP ...)をサポートするためにHTTPを使用するサーブレットとして開発できます。ランタイムは、浮動小数点なしのJava(1.)6バイトコードのサブセットを使用します。揮発性オブジェクト(ガベージコレクション)、マルチスレッド、アプリケーション間通信機能、永続性、トランザクション、カード管理機能などをサポートしています。2021年現在、市販のスマートカードではほとんど採用されておらず、Java Card(現在のWikipediaページを含む)への参照では、暗黙的にConnected Editionが除外されることがよくあります。
Java カード 3.1
Java Card 3.1 は 2019 年 1 月にリリースされました。
新しい CAP ファイル形式とアプレット展開モデル
- アプレットの機能は複数のJavaパッケージに分割できる
- CAP ファイルのサイズは 64KB を超えることがあります
新しい I/O フレームワークと信頼できる周辺機器
- ISO 7816で定義されたスマートカードプロトコルを超えて、さまざまな物理層とアプリケーションプロトコルがサポートされています。
- セキュアエレメントアプリケーションによるデバイス周辺機器への論理アクセスが容易になります
コアプラットフォームの強化
- 配列ビュー(配列のサブセットのビュー)、CAPファイル内に埋め込まれた静的リソース、および改善されたAPI拡張性
セキュリティサービス
- 証明書 API、キー導出 API、モノトニック カウンター API、システム時間 API
新しい暗号化拡張機能
参照
参考文献
- ^ Chen, Z. (2000).スマートカード向け Java Card テクノロジー: アーキテクチャとプログラマーズ ガイド。Addison-Wesley Java シリーズ。Addison- Wesley。ISBN 978-0-201-70329-0. 2019年4月9日閲覧。
- ^ Oracle Learning Library (2013-01-30)、Java Card アプリケーションの開発、2021-12-13 にオリジナルからアーカイブ、2019-04-18 に取得
- ^ Ahmed Patel、Kenan Kalajdzic、Laleh Golafshan、Mona Taghavi (2011)。「Java Card 向けゼロ知識認証フレームワークの設計と実装」。International Journal of Information Security and Privacy。5 ( 3)。IGI: 1–18。doi : 10.4018 /ijisp.2011070101。
- ^ 「JCAlgTest - サポートされている JavaCard アルゴリズムのデータベース」 。2016年1 月 27 日閲覧。
- ^ Ponsini, Nicolas (2023年1月30日). 「Java Card 3.2リリースの発表」. Java Cardブログ. 2023年2月6日閲覧。
- ^ Ponsini, Nicolas. 「Java Card 3.1 の発表: 新しい暗号化拡張機能」。blogs.oracle.com。2019年 4 月 18 日閲覧。
- ^ Samoylov, N. (2018). プログラミング入門: データ構造、アルゴリズム、ロジックを使ってJavaでプログラミングする方法を学ぶ。Packt Publishing。p. 13。ISBN 978-1-78883-416-2. 2019年4月9日閲覧。
外部リンク
- Java Card の概要 (Oracle)
- Defcon 21: YouTubeの SIM カードの秘密の生活
- JavaCards-OpenSC
