(57)【要約】【課題】  オープンソースの耐タンパソフトウェアを書き込むプロセスを容易にして、アプリケーションとその秘密のインテグリティを保証する方法を提供する。【解決手段】  トラステッドＪａｖａ（登録商標）仮想マシンにより耐タンパ・アプリケーションをサポートする方法を提供し、アプリケーションと、鍵といったようなその秘密とのインテグリティを確実にする。トラステッドＪａｖａ仮想マシンはＪａｖａアプリケーションのインテグリティを検証し、Ｊａｖａアプリケーションのデバッグを回避し、Ｊａｖａアプリケーションが安全に秘密を記憶、検索するのを可能にする。トラステッドＪａｖａ仮想マシン環境は、トラステッドディクショナリ、トラステッドバンドル、バイトコードを暗号化および復号する任意の暗号化方法、及び、基となるトラステッドＪａｖａ仮想マシンにより構成される。暗号化されたトラステッドディクショナリがデータを保護する一方で、トラステッドバンドルはプログラミングコードを保護し、アプリケーションによる秘密データの記憶、およびカウンタの保護を可能にする。アプリケーション設計者は、アプリケーション設計者が明示的にエキスポートするインターフェースにのみトラステッドバンドルのアクセスを制限することができる。オープンソースコードは任意に暗号化され得る。アプリケーションのオープンソース・プログラミングコードにより要求される秘密はトラステッドディクショナリにおいて暗号化される。【選択図】  図２【特許請求の範囲】
【請求項１】
データを保護するトラステッドディクショナリを含むトラステッド仮想マシン環境を定義して、アプリケーションのインテグリティを検証することからなる、信頼できる環境において耐タンパ・アプリケーションを動作する方法であって、前記アプリケーションが改ざんされている場合、前記トラステッド仮想マシン環境が、前記アプリケーションによる前記トラステッドディクショナリにおける秘密へのアクセスを防止して、前記アプリケーションの通常のオペレーションを無効にする方法。
【請求項２】
前記アプリケーションの前記インテグリティが確認される場合、前記トラステッド仮想マシン環境は、前記トラステッドディクショナリにおける前記秘密への該アプリケーションによるアクセスを可能にして、前記アプリケーションの前記通常のオペレーションを可能にする請求項１に記載の方法。
【請求項３】
前記トラステッド仮想マシン環境を定義することは、前記アプリケーションのプログラミングコードを保護するトラステッドバンドルを定義することからなる請求項２に記載の方法。
【請求項４】
前記プログラミングコードを保護することは、前記プログラミングコードを暗号化することからなる請求項３に記載の方法。
【請求項５】
前記トラステッド仮想マシン環境は、前記アプリケーションに関連するメディア鍵ブロックからの復号鍵を用いて、暗号化された前記プログラミングコードを復号する請求項４に記載の方法。
【請求項６】
前記トラステッド仮想マシン環境を定義することは、セキュリティチップを用いることからなる請求項１に記載の方法。
【請求項７】
前記トラステッドバンドルを定義することは、前記トラステッドバンドルの命令コードへのアクセスを制限することからなる請求項３に記載の方法。
【請求項８】
さらに、前記トラステッドディクショナリを暗号化することからなる請求項１に記載の方法。
【請求項９】
前記トラステッド仮想マシン環境を定義することは、少なくとも２つのトラステッドバンドルを定義することからなり、また、前記トラステッドディクショナリは、前記の少なくとも２つのトラステッドバンドルのうちの少なくともいくつかの間で共有されて、前記の少なくとも２つのトラステッドバンドル間において通信インテグリティを維持する請求項１に記載の方法。
【請求項１０】
前記アプリケーションはコピープロテクトされたメディアを再生するプレイヤから成る請求項１に記載の方法。
【請求項１１】
前記トラステッドディクショナリは、前記のコピープロテクトされたメディアを復号するための１つ以上の復号鍵を含んでいる請求項１０に記載の方法。
【請求項１２】
アプリケーションのいずれかのアスペクトが耐タンパである必要があるかどうかを判断して、該アプリケーションのいずれかのアスペクトが耐タンパである必要がある場合、アプリケーションファンクションの所定のセットへのアクセスを制限するよう、１つ以上のトラステッドバンドルを定義して、非トラステッド仮想マシン環境における１つ以上のトラステッドバンドルを動作させてアプリケーションをデバッグして、そして、前記トラステッド仮想マシン環境において該アプリケーションを展開することから成るトラステッド仮想マシン環境において耐タンパ・アプリケーションを生成する方法。
【請求項１３】
前記アプリケーションの前記アスペクトは、前記アプリケーションのインテグリティ、アプリケーションの秘密鍵、秘密データ、及び秘密コードのうちいずれか１つ以上から成る請求項１２に記載の方法。
【請求項１４】
前記アプリケーションのいずれかのアスペクトが耐タンパである必要があるかどうか判断することは、トラステッド仮想マシン環境において動作する別のアプリケーションにおけるトラステッドバンドルに前記アプリケーションがアクセスを行う必要があるかどうかを判断することからなる請求項１２に記載の方法。
【請求項１５】
さらに、前記アプリケーションからの前記トラステッドバンドルと前記の他のバンドル間において共有されるべきトラステッドディクショナリを定義することからなる請求項１４に記載の方法。
【請求項１６】
前記アスペクトが秘密鍵もしくは秘密データのいずれかである場合、その秘密鍵もしくは秘密データにより少なくとも１つのトラステッドディクショナリを生成するツールを構築する請求項１３に記載の方法。
【請求項１７】
前記アプリケーションの前記アスペクトは、前記アプリケーションがコピーされるのを防止することからなる請求項１２に記載の方法。
【請求項１８】
さらに、前記アプリケーションがコピーされているかを判断するためのレジストレーションプロセスを設計することからなる請求項１７に記載の方法。
【請求項１９】
前記アプリケーションの前記アスペクトは、前記アプリケーションのアクティビティのカウントをユーザがリセットするのを防ぐことからなる請求項１２に記載の方法。
【請求項２０】
さらに、前記アクティビティのカウントを含むためのトラステッドディクショナリを設計することからなる請求項１９に記載の方法。
【請求項２１】
実行時に前記請求項１〜２０記載の方法ステップを履行する命令コードを有するコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は一般的に、仮想コンピューティングマシン上で動作するアプリケーションに関する。より詳細には、本発明は、アプリケーションを耐タンパにする方法を提供するトラステッド環境において動作するアプリケーションに関する。
【背景技術】
【０００２】
エンタテイメント業界はデジタル革命の真っ只中にある。音楽、テレビ、そして映画は、ますますデジタル化しており、その品質とフレキシビリティにおいて顧客に新たな利点を提供している。同時に、デジタルデータのコピーが完全かつ迅速に行えることから、デジタル革命は脅威もはらんでいる。顧客が自由にエンタテイメントのコンテンツをコピーし、インターネット上でそのコンテンツを提供することになると、エンタテイメントコンテンツのマーケットは消滅しうる。
【０００３】
こうした脅威を低減するため、中でも、デジタル権利管理（ＤＲＭ）システム、ＤＶＤビデオのコンテンツスクランブル（ＣＳＳ）システム、およびＤＶＤオーディオのプリレコードされたメディアのコンテンツ保護（ＣＰＰＭ）といったようなコンテンツ保護スキームが考案されている。これらのシステムは次のフューチャを共有する。すなわち、それらを実行するソフトウェアは「ロバスト」であることが求められる。つまり、ソフトウェアからの秘密（鍵）を注出するか、あるいはソフトウェアの挙動を修正するかのいずれかによって不正な機能を得るハッカーによるアタックに耐性を有するソフトウェアである。そのようなアタックに耐性のある技術は耐タンパソフトウェアと呼ばれる。
【０００４】
ハッカーがオープンソースプログラムをより簡単にコンプロマイズしうる前提においての耐タンパ性ソフトウェアは「オープンソース」のコンセプトに矛盾するというのが共通の認識である。しかし、オープンソースのコンテンツ保護スキームは明らかな優位性をもたらす。オープンスタンダードはマーケットの崩壊を防ぎ、独自の解決が競争から締め出されるのを防ぐ。加えて、オープンソースのコンテンツ保護スキームは実際にハッカーのアタックレベルを減じるのに役立っている。内部関係者からの情報漏れにより、少なからずＤＶＤビデオＣＳＳスキームへの周知の破壊が可能となった。これらの内部関係者は明らかに、オープンソースプラットフォームリナックス（Ｌｉｎｕｘ）上にてＤＶＤプレイヤを有したいという願望に動機があった。
【０００５】
一方、多くのアプリケーションにおいてコンピュータ言語ＣはＪａｖａ（登録商標）言語に置き換わった。Ｊａｖａ（登録商標）仮想マシンと称される仮想（ｈｙｐｏｔｈｅｔｉｃａｌ）コンピュータ、すなわちＪａｖａ（登録商標）仮想マシン（「ＪＶＭ」）の命令（バイトコードと呼ばれる）に、ソースプログラムを変換することによってＪａｖａ（登録商標）言語が実行される。
【０００６】
Ｊａｖａ（登録商標）仮想マシンは現実に存在するハードウェアのコンピュータではく、バイトコードを解釈するプログラムであり、所定の物理コンピュータ上においてそのファンクションを実行する。このアプローチはＪａｖａ（登録商標）に移植性を与えた。すなわち、この言語はあらゆるタイプのコンピュータにおいて、かつ、携帯電話、ステレオ、及びＴＶセットトップボックスといったような埋め込み装置においてさえも使用可能である。
【０００７】
Ｊａｖａ（登録商標）仮想マシンとその命令セットが同一であるコンピュータを複数の会社が製造している。このような場合、Ｊａｖａ（登録商標）仮想マシンは実在のものであり、仮想ではない。しかし、慣例から、そうした実在のコンピュータも依然「Ｊａｖａ（登録商標）仮想マシン」と呼ばれ、実行がこれに導入される。
【０００８】
コンテンツ保護のその１つのアプローチにおいて、コンテンツ保護スキームのロバスト性要求を満たすＪａｖａ（登録商標）仮想マシンを使用する。このアプローチにおいて、全ての秘密データおよびアルゴリズムがＪａｖａ（登録商標）において実行されるのではなく、これらはＪａｖａ（登録商標）仮想マシン自体につながって（ｗｉｒｅ  ｉｎ）いる。さらに、Ｊａｖａ（登録商標）仮想マシンは、「サンドボックス」環境を提供することから、不正なアクションが防止される。例えば、Ｊａｖａ（登録商標）仮想マシンが保護されたコンテンツを処理すると、Ｊａｖａ（登録商標）の通常のファイル書込みメカニズムが無効となる。好都合に、Ｊａｖａ（登録商標）コードそれ自体のインテグリティを検証する必要はない。
【０００９】
「サンドボックス」はＪａｖａ（登録商標）コードによる不正な挙動を防止する。各コンテンツ保護スキームの重要ロジックは、Ｊａｖａ（登録商標）仮想マシンそれ自体の耐タンパ環境において隠蔽される。この技術が有益であると分かっているが、秘密データおよびアルゴリズムがＪａｖａ（登録商標）仮想マシンにおいて実行される必要がなく、それらがＪａｖａ（登録商標）において実行可能である場合の解決策を提示することが望ましい。そのような解決策は、それが「オープンソース」のコンセプトをサポートし得るというさらなる長所を有する。
【００１０】
ほとんどのコンテンツ保護アプリケーションは、秘密アルゴリズムとは対照的に秘密データ（鍵）を必要とする。電子透かしスキームといったような、いくつかのコンテンツ保護スキームもまた秘密アルゴリズムを必要とする。ハッカーにとってバイトコードから元のＪａｖａ（登録商標）プログラムを推定することは比較的容易なことである。伝統的な「バイトコード難読化」プログラムは、単に変数、方法、及びクラスのネームを難読化するだけで、実際にはこれをほとんど回避しない。必要なのは、必要に応じてバイトコードの強力な暗号保護を含む解決法である。
【００１１】
いくつかのコンテンツ保護スキームでは「セキュアカウンタ」を使用する。例えば、ＤＶＤオーディアユーザは特定数のみのコピーの作成が許可される。ユーザは、彼のハードディスクにいくつかのファイルを単にセーブし、回復することによってこれらのカウンタをリセットするかもしれない。また、ユーザは彼の保護ファイルを友人にコピーしようとして、元のユーザが購入したコンテンツを複製するかもしれない。必要なのは、こうしたコンテンツ保護の基本的な違反を解決する解決策である。
【００１２】
Ｊａｖａ（登録商標）言語は「パブリック」対「プライベート」のコンセプトを提示する。各メソッドあるいはサブルーチンは、パブリック、プライベートか、もしくはこのどちらでもないかを明らかにする。パブリックメソッドは、元々は、Ｊａｖａ（登録商標）アプリケーションの外部インターフェースが意図されていた。プライベートメソッドは、外部とはみなされないＪａｖａ（登録商標）アプリケーション内の全ファンクションが意図されていた。パブリックでもプライベートでもないメソッドは「パッケージ」、つまり関連するＪａｖａ（登録商標）クラスのグループ内での使用が意図されていた。
【００１３】
しかし、大きなＪａｖａ（登録商標）アプリケーションは多くのＪａｖａ（登録商標）「パッケージ」から成り、従ってほとんど、いずれのファンクションもパブリックであらねばならない。ハッカーはこれらのパブリックメソッドを「ハッカードア」として不当に利用し、アプリケーションを不正な方法で挙動させうる。単一のパッケージ内でさえ、ハッカーは彼自身のクラスをパッケージに単に加えることにより簡単にパッケージ保護を破ることができる。ハッカーが不当に利用する、ある内部の、しかし「パブリック」であるインターフェースを、Ｊａｖａ（登録商標）アプリケーション設計者である彼あるいは彼女が、不用意に公にしていないことを検証するのはアプリケーション設計者にとっては困難なことある。必要なのは、セキュリティ問題をアプリケーションから仮想マシン言語へと移行し、メソッドとファンクションの露呈を回避する仮想マシン言語である。
【００１４】
近年、ソフトウェアにおける秘密の記憶、およびインテグリティの検証を助けるハードウェアのプロポーザルがいくつか作られている。例えば、トラステッド・コンピュータプラットフォーム・アライアンスがそうしたハードウェアのオープンスタンダードを定義している。類似の独自開発の技術もまた展開されている。こうしたアプローチはオール・オア・ナッシングアスペクトを用いる。信頼されるアプリケーションにおいて、オペレーティングシステムは信頼性を必要とする。信頼されるオペレーティングシステムにおいて、オペレーティングカーネルは信頼性を必要とする。信頼されるオペレーティングカーネルにおいて、オリジナルのブートコードは信頼性を必要とする。いずれのレベルへの良性変更であっても信頼の連鎖を壊す。
【００１５】
１つの解決法ではオペレーティングシステムにおいて新しい特権レベルを定義する。この特権レベルにおいて、カーネルのサブセット、オペレーティングシステムのサブセット、及び全ての信頼できるアプリケーションが備わる。しかし、このプロプリエタリアプローチは、信頼できるアプリケーション構築において、この技術の所有者にかなり優位な長所を与え、「オープンソース」のコンセプトを無効にする。必要なのは、特別なセキュリティハードウェアを依然効果的に生かすことのできる「オープンソース」アプリケーションの発展を可能にする解決策である。
【００１６】
多くのＪａｖａ（登録商標）設計者は、特定のユーザもしくはデバイスに対して書かれたアプリケーションが、他のユーザあるいはデバイスへの可搬性がないようにという要望を表明している。Ｊａｖａ（登録商標）設計者は、そのアプリケーションを別のユーザに与えるかあるいは販売できるユーザではない、シングルユーザにそのアプリケーションを販売することを望んでいる。必要なのは、アプリケーション設計者あるいは所有者の許可なく、アプリケーションを共有することを防ぐ解決策である。
【特許文献１】米国特許第５，９７８，４８２号
【特許文献２】米国特許第６，０３８，３１６号
【特許文献３】米国特許出願第０９／６０９，８０９号
【特許文献４】米国特許第６，１１８，８１３号
【特許文献５】米国特許出願第２００２・０１１４７９０６Ａ１号
【特許文献６】米国特許出願第０９／７５４，３９６号
【発明の開示】
【発明が解決しようとする課題】
【００１７】
本発明は、耐タンパ・トラステッドＪａｖａ（登録商標）仮想マシンの、モデル、コンピュータプログラム、および関連方法（本文において集約的に「システム」あるいは「本システム」と称する）を提示する。トラステッドＪａｖａ（登録商標）仮想マシンは耐タンパ・アプリケーションの方法を提供する。オープンソースの耐タンパソフトウェアを書き込むプロセスを容易にして、アプリケーションとその秘密のインテグリティを保証する方法を提供する。
【課題を解決するための手段】
【００１８】
トラステッドＪａｖａ（登録商標）仮想マシンは耐タンパを実行する。トラステッドＪａｖａ（登録商標）仮想マシンはアプリケーションのインテグリティを検証し、アプリケーションのデバッグを防ぎ、また、アプリケーションが安全に秘密を記憶かつ検索することを可能にする。トラステッドＪａｖａ（登録商標）仮想マシンはオープンソースではない。しかし、多くの異なるオープンソースアプリケーションをサポートし得る１つのみのトラステッドＪａｖａ（登録商標）仮想マシンが必要とされる。「オープンソース」の値はアプリケーションにおいて実現される。
【００１９】
本システムは、単一のトラステッドＪａｖａ（登録商標）仮想マシンを必要として、コンテンツ保護ロジックはこのトラステッドＪａｖａ（登録商標）仮想マシンにおいて実行される。伝統的なＪａｖａ（登録商標）セキュリティは、インターネットからダウンロードされたＪａｖａ（登録商標）アプレットもしくはアプリケーションが、ユーザのコンピュータにダメージを与えるのを防ぐよう働く。対照的に、本システムはアプリケーションがユーザによってダメージを受けるのを回避する。すなわち、アプリケーションは修正または秘密露呈から保護される。本システムは、アプリケーションが知っていることが信頼され、アプリケーションが動作可能な信頼できる環境を提供する。
【００２０】
ほとんどのコンテンツ保護アプリケーションは秘密アルゴリズムとは対照的に秘密データ（鍵）を必要とする。本システムは、これらの秘密を作成して安全に記憶するアプリケーション方法を提供する。電子透かしスキームといったいくつかのコンテンツ保護スキームも秘密アルゴリズムを必要とする。本システムは、必要に応じて、バイトコードの強力な暗号保護を含む。
【００２１】
本システムは、鍵といったようなアプリケーションの秘密への、アプリケーションによるアクセスを可能にする。しかし、同一マシンで２つのアプリケーションが動作している場合であっても、アプリケーションは他のアプリケーションの秘密へのアクセスを有しない。
【００２２】
加えて、本発明は、アプリケーションが無傷であることを保証するメカニズムを有する。そのままの修正されていないアプリケーションがその秘密へのアクセスを有する。アプリケーションは修正されていると本システムが判断すると、修正されたアプリケーションはもはやその秘密へのアクセスを有しない。アプリケーションにより使用される秘密を本システムは定めず、アプリケーション設計者がこれらの秘密を定める。
【００２３】
本システムは、プログラミングコードもしくは仮想マシン命令を暗号化することにより、アプリケーションのプログラミングコードを保護するメカニズムも提供する。本システムは実際のコードとして同一ファイル内にメディア鍵ブロックを有する。Ｊａｖａ（登録商標）仮想マシンは、メディア鍵ブロックの処理に使用可能なデバイス鍵のセットを有して、メディア鍵を注出する。メディア鍵はそのファイルのプログラミングコードの復号に用いられる。プログラミングコードは、ハッカーに気付かれるような方法では決して公にならない。プログラミングコードは、メモリにロードされているとき、あるいはＪａｖａ（登録商標）仮想マシンによって実行されているときにのみ公にされる。
【００２４】
いくつかのコンテンツ保護スキームでは「セキュアカウンタ」を要求する。例えば、ユーザはＤＶＤオーディオの特定数のみのコピー作成が許可される。ユーザはハードディスクにいくつかのファイルを単にセーブし、回復することによって彼あるいは彼女のカウンタのリセットを試みるかもしれない。また、ユーザは彼の保護ファイルを友人にコピーしようとして、元のユーザが購入したコンテンツを複製するかもしれない。本システムは、コンテンツ権利のこうした基本的な抜け道を解消する方法を提供する。
【００２５】
本システムは、トラステッドディクショナリ、トラステッドバンドル、バイトコードを暗号化および復号する任意の暗号化方法、及び、基となるトラステッドＪａｖａ（登録商標）仮想マシンにより構成される。トラステッドディクショナリがデータを保護する一方、トラステッドバンドルはプログラミングコードを保護する。
【００２６】
アプリケーションによる秘密データの記憶、およびカウンタの保護を可能にして、トラステッドディクショナリが暗号化される。アプリケーションによるトラステッドディクショナリの使用によって、アプリケーションが信頼できる環境で動作していることを暗黙的に検証する。トラステッドバンドルによって、アプリケーション設計者がアプリケーションを構成するＪａｖａ（登録商標）パッケージ全てを一緒にグループ化することが可能となり、アプリケーション設計者が明示的にエキスポートするインターフェースのみにアクセスを制限する。
【００２７】
トラステッドバンドルはアプリケーションによるリクエスト時に任意に暗号化される。例えば、トラステッドバンドルにおけるプログラミングコードがオープンソースであるのを可能にしながら、本システムはトラステッドディクショナリを使用してアプリケーションにより秘密を保護する。オープンソースコードは暗号化されない。しかし、アプリケーションのオープンソースプログラミングコードによりリクエストされた秘密はトラステッドディクショナリにおいて暗号化される。
【００２８】
この暗号化方法は、アプリケーション設計者が、秘密のままであるべきこれらのクラスファイル（バイトコードのシーケンス）を暗号化するのを可能にする。この暗号化方法において、クラスファイルが実行されている間、これらのクラスファイルを復号する、本システムの更新可能な方法も提供する。トラステッドＪａｖａ（登録商標）仮想マシンは、トラステッドディクショナリとトラステッドバンドルとの実行を結びつける。言い換えると、実行（あるいはそれの重要部分）は、仮想マシンのバイトコードにではなく、所定のプロセッサの「ネイティブ」コードにある。トラステッドＪａｖａ（登録商標）仮想マシンは、標準ソフトウェア耐タンパ技術により保護されている。
【００２９】
トラステッドディクショナリとトラステッドバンドルは次のように関連する。すなわち、アプリケーションがトラステッドディクショナリをインスタンス生成すると、アプリケーションは、そのトラステッドディクショナリから値を「ｇｅｔ」および「ｐｕｔ」することの可能なトラステッドバンドルを暗黙的にリストアップする。これらのトラステッドバンドルを署名するのに使用されている公開鍵をリストアップすることにより、アプリケーションはそれらのトラステッドバンドルをリストアップする。
【００３０】
トラステッドバンドルは、アプリケーションのクラスファイルがパッケージされる標準的な方法である、Ｊａｖａ（登録商標）アーカイブ（ＪＡＲ）ファイルである。Ｊａｖａ（登録商標）言語は、Ｊａｖａ（登録商標）アーカイブマニフェストを署名することによりＪａｖａ（登録商標）アーカイブがデジタル署名されるのを可能にする。本システムは、無傷で、正確に署名されたＪａｖａ（登録商標）アーカイブファイルからのアプリケーションのみが、トラステッドディクショナリを成功裡に使用できるようにする。Ｊａｖａ（登録商標）アーカイブファイルは、その使用にマークされたトラステッドディクショナリのみ使用可能である。
【００３１】
本システムは、アプリケーションが信頼できる環境で動作していることを、そのアプリケーションが認識可能であるメカニズムを提供する。アプリケーション設計者は彼のソフトウェア作成構築マシンであるような、信頼できることが分かっている環境においてトラステッドディクショナリをインスタンス生成する。アプリケーション設計者はそのアプリケーションに従って、このトラステッドディクショナリを展開する。このアプリケーションが信頼できる環境において動作しているとき、アプリケーションはトラステッドディクショナリから作成秘密を首尾よく注出することのみ可能である。
【００３２】
例えば、ＤＶＤオーディオプレイヤのアプリケーションは、ＤＶＤオーディオデバイス鍵のセットを有するトラステッドディクショナリによりファクトリでロードされ得る。これらの鍵を使用してＤＶＤオーディオを首尾よく再生可能なＤＶＤプレイヤのアプリケーションは、それが信頼できる環境でアプリケーションが動作していることを認識している。ハッカーは、トラステッドディクショナリを有しているかのように装う「トロイの木馬」環境を企てることがある。しかし、そうした「トラステッドディクショナリ」から得られるデバイス鍵でＤＶＤオーディオを復号することは出来ない。従い、アプリケーションがそうした偽りの環境で動作している場合、そのコンテンツ保護スキームは公にしない。コンプロマイズした環境にある場合には、不正なオペレーションをアプリケーションが実行し得ないことをアプリケーション設計者は知っている。
【００３３】
別の例として、デジタル権利管理アプリケーション（Ｄｉｇｉｔａｌ  Ｒｉｇｈｔ  Ｍａｎａｇｅｍｅｎｔ  ａｐｐｌｉｃａｔｉｏｎ）は、サーバにより公開鍵プロトコルを用いて、許可されたコンテンツを受取る。公開鍵プロトコルは周知であり、プロトコルそれ自体は秘密ではない。秘密はプロトコルにおける公開鍵に対応する秘密鍵である。秘密鍵が隠蔽されたままであるかぎり、プロトコルはオープンソースコードに配置される。クライアントのアプリケーションが展開される前に、クライアントの秘密鍵がトラステッドディクショナリに配置される場合、その鍵は信頼できる環境においてのみ使用可能である。クライアントのアプリケーションおよびサーバが公開鍵プロトコルと首尾よくネゴシエート可能である場合、クライアントのアプリケーションが信頼できる環境で動作しているという確信ができる。サーバは、プロトコルの部分として、許可されたコンテンツを安全に配送することができる。
【００３４】
別の例において、アプリケーション設計者は、オーディオミュージックのオーディオウォータマークを提供するプログラムを作成する。このオーディオウォータマークは、様々なオーディオプレイヤに特定の方法で挙動するように命令する特別なコピー制御信号である。著作権保護のための命令として、オーディオプレイヤはオーディオウォータマークに反応して、オーディオミュージックの不正使用を防止する。オーディオウォータマークにおける命令を検出してそれに反応する、オーディオプレイヤにより使用されるプログラミングコードは、ハッカーから保護される必要がある。本システムはこのプログラミングコードを暗号化することが可能であり、また、このプログラミングコードが動作可能な、安全で信頼できる環境を提供する。
【００３５】
クラスファイルのいくつか、または全部を選択して暗号化するアプリケーション設計者は、そのアプリケーションが信頼できる環境で動作していることを検証する追加の方法を有する。これらのクラスファイルがトラステッドＪａｖａ（登録商標）仮想マシンにおいて動作していない限り、これらクラスファイルは成功裡にロードできない。この場合それがトラステッドＪａｖａ（登録商標）仮想マシンにおいてロードされない場合、アプリケーションは動作不可能である。
【００３６】
例えば、時間および日付とともに、銀行ロビーのような場面を記録するセキュリティカメラのインテグリティを保証するために本システムが使用される。銀行および警備会社は画像上の時間および日付のインテグリティを信頼する。本システムは、部外者が時間と日付を変更するのがかなり難しいセキュリティカメラに、信頼できる環境を提供するために使用可能である。
【００３７】
このように、「オープンソース」のコンセプトを保持しながら、耐タンパ・アプリケーションソフトウェアをサポート可能な、信頼できる、すなわちトラステッドＪａｖａ（登録商標）仮想マシンのモデル、コンピュータプログラム、および関連方法が定義される。
【００３８】
本発明の実施形態について、添付の図面を参照にしながら、例示の方法においてのみ詳述するものとする。
【発明を実施するための最良の形態】
【００３９】
図１は、本発明に従うトラステッドＪａｖａ（登録商標）仮想マシンのシステムおよび関連方法が用いられる全体環境例を表したものである。トラステッドＪａｖａ（登録商標）仮想マシン１０は、一般にサーバ１５に埋め込みされる、またはサーバ１５にインストールされるソフトウェアプログラミングコードもしくはコンピュータプログラムから成る。あるいは、トラステッドＪａｖａ（登録商標）仮想マシン１０は、ディスケット、ＣＤ、ハードドライブ、もしくは類似のデバイス等の適切なストレージ媒体にセーブされ得る。
【００４０】
トラステッドＪａｖａ（登録商標）仮想マシン１０をＪａｖａ（登録商標）プログラミング言語に関して記載するが、本発明はあらゆる適切なタイプの仮想マシンおよび「リアル」仮想マシンを用いて実行可能である。トラステッドＪａｖａ（登録商標）仮想マシン１０の説明においてＪａｖａ（登録商標）プログラミング言語を使用するが、これは例示にすぎず、他の仮想マシンに対して本発明のアプリケーションを制限するものではない。
【００４１】
リモートインターネットユーザのようなユーザを、コンピュータ２０、２５、３０といった様々なコンピュータにて示しており、ユーザはネットワーク３５によりサーバ１５にアクセスすることが可能である。コンピュータ２０、２５、３０のそれぞれは、ユーザとサーバ１５間のインターフェースを可能にするソフトウェアを配備している。サーバ１５は、電話、ケーブル、あるいは衛星リンクといったような通信リンク４０を介してネットワーク３５に接続を行う。
【００４２】
コンピュータ２０、２５、３０はそれぞれ通信リンク４５、５０、５５を介してネットワーク３５に接続を行う。トラステッドＪａｖａ（登録商標）仮想マシン１０についてネットワーク３５との関連において詳述するが、コンピュータ２０、２５、３０は遠隔的でなくローカルにトラステッドＪａｖａ（登録商標）仮想マシン１０にアクセスすることも可能である。コンピュータ２０、２５、３０は、アプリケーションユーザによりマニュアルにて、もしくは自動的にトラステッドＪａｖａ（登録商標）仮想マシン１０にアクセスを行う。
【００４３】
図２は、トラステッドＪａｖａ（登録商標）仮想マシン１０の高位階層を示したものである。トラステッドＪａｖａ（登録商標）仮想マシン、すなわちＴＪＶＭ１０は一般に、トラステッドＪａｖａ（登録商標）仮想マシン２０５、Ｊａｂａベースクラス２１０、およびＪａｖａ（登録商標）アプリケーション２１５から構成される。
【００４４】
トラステッドＪａｖａ（登録商標）仮想マシン２０５は、トラステッドＪａｖａ（登録商標）仮想マシンが動作を行う特定のコンピュータのマシン命令にコンパイルされる、一般的にＣ言語といったコンピュータ言語にて書かれたルーティンから成る。トラステッドＪａｖａ（登録商標）仮想マシン２０５をＣプログラミング言語に関して記載を行うが、本システムはどういったタイプのプログラミング言語を使用しても実行可能である。トラステッドＪａｖａ（登録商標）仮想マシン２０５の説明におけるＣプログラミング言語の使用は例示にすぎず、他のプログラミング言語に対して、トラステッドＪａｖａ（登録商標）仮想マシン２０５のアプリケーションを制限するものではない。
【００４５】
標準的なＪａｖａ（登録商標）実行において、Ｃコードはバイトコードインタプリタ２２０を実行し、かつ、オペレーティングシステムとのインターフェースを要する「ネイティブ」メソッド２２５を実行する。Ｃコードはプラットフォームごとに異なる。本例において、ＣコードはトラステッドＪａｖａ（登録商標）仮想マシン２０５によって実行される。
【００４６】
Ｊａｖａ（登録商標）ベースクラス２１０はＪａｖａ（登録商標）言語で書かれており、基本的なＪａｖａ（登録商標）オブジェクト、すなわち列、オブジェクト、Ｉ／Ｏ等を実行する。これらはＪａｖａ（登録商標）コンパイラによりバイトコードにコンパイルされている。いくつかのＪａｖａ（登録商標）ベースクラスは、「ネイティブ」コード、すなわち命令が実行されるプロセッサのネイティブ命令セットにおいて実行される方法を有する。
【００４７】
Ｊａｖａ（登録商標）アプリケーション２１５はＪａｖａ（登録商標）ベースクラス２１０上で動作する。Ｊａｖａ（登録商標）アプリケーション２１５は、集約的にトラステッドバンドル２４０と称する、１つ以上のトラステッドバンドル１、２３０からトラステッドバンドルＮ、２３５を含む。加えて、アプリケーション２１５は、アプリケーションメイン２４５あるいはアプレットｉｎｉｔ２５０といったような、信頼化の必要がない他のＪａｖａ（登録商標）コードを含む。Ｊａｖａ（登録商標）アプリケーション２１５は集約的にトラステッドディクショナリ２６５と称する、トラステッドディクショナリ１、２５５からトラステッドディクショナリＮ、２６０といった、１つ以上のトラステッドディクショナリを任意に含む。
【００４８】
Ｊａｖａ（登録商標）アプリケーション２１５は複数のトラステッドバンドル２４０とトラステッドディクショナリ２６５を含みうる。複数のトラステッドバンドル２４０は相互に通信可能である。トラステッドバンドル２４０はトラステッドディクショナリ２６５において別々に秘密を保持するか、あるいはトラステッドディクショナリ２６５において秘密を共有することも可能である。
【００４９】
ソフトウェア会社は、その個々の会社のトラステッドディクショナリ２６５、２６７を介して通信を行い、秘密を渡す、異なるＪａｖａ（登録商標）アプリケーション２１５、２６６を生成する。例えば、あるソフトウェア会社はオーディオＣＤに電子透かしを挿入するＪａｖａ（登録商標）アプリケーション２１５を製造する。電子透かしソフトウェアはトラステッドバンドル２４０を含む。ＣＤプレイヤは、ウォータマークトラステッドバンドル２４０を呼び出すＪａｖａ（登録商標）アプリケーション２６６にソフトウェアを含み、透かし信号を検出する。トラステッドディクショナリ２６５、２６７は電子透かしソフトウェアのセキュアパスを可能にして、ＣＤプレイヤのソフトウェアと通信を行い、それらが真正バージョンであり、ソフトウェアのハッキングバージョンではないことを確実に検証する。
【００５０】
図２においていくつかのモジュールが「インテグリティエンベロープ」にエンベロープされて示されている。インテグリティエンベロープは、これらのモジュールが修正されていないことを検証するメカニズムを提供する。トラステッドＪａｖａ（登録商標）仮想マシン２０５はインテグリティエンベロープ２７０によって保護されている。Ｊａｖａ（登録商標）ベースクラス２１０はインテグリティエンベロープ２７５によって保護されている。トラステッドバンドル１、２３０はインテグリティエンベロープ２８０によって保護されている。トラステッドバンドルＮ、２３５はインテグリティエンベロープ２８５によって保護されている。
【００５１】
インテグリティエンベロープ２７０、２７５、２８０、２８５は電子署名のチェックを有する。加えて、インテグリティエンベロープ２７０、２７５、２８０、２８５は電子印鑑といった他の技術を有する。電子印鑑技術に関するさらなる詳細について、例えば、米国特許第５，９７８，４２８号および同第６，０３８，３１６号が参照されうる。電子印鑑は電子署名に類似するが、ソフトウェアモジュールのインテグリティのチェックにおいてある程度の長所を有する。さらに、インテグリティエンベロープ２７０、２７５、２８０、２８５は、トラステッド・コンピューティング・プラットフォーム・アライアンス（ＴＣＰＡ）とパラジウムチップに見られるようなハードウェアベースのインテグリティチェックを有する。
【００５２】
図２に示すように、トラステッドＪａｖａ（登録商標）仮想マシン２０５のネイティブメソッド２２５におけるシークレットメソッド２９０は暗号化される。加えて、トラステッドディクショナリ２６５が暗号化される。さらに、トラステッドバンドル１、２３０のクラス２９５によって示されているように、トラステッドバンドル２４０のクラスの幾つか、または全部が暗号化される。最低限、シークレットメソッド２９０、トラステッドディクショナリ２６５、およびクラス２９５が、例えばメモリ、ディスク、あるいは外部メモリに記憶されつつ、暗号化される。
【００５３】
シークレットメソッド２９０、トラステッドディクショナリ２６５、およびクラス２９５がコンピュータメモリにロードされた後であっても暗号は持続する。この場合、実行前に、シークレットメソッド２９０、トラステッドディクショナリ２６５、およびクラス２９５のコードが即座かつ迅速に復号される。実行完了後に、シークレットメソッド２９０、トラステッドディクショナリ２６５、およびクラス２９５は、論理的に暗号化され得る。
【００５４】
トラステッドＪａｖａ（登録商標）仮想マシン１０は既知の、あるいは利用可能なソフトウェア耐タンパ技術を用いる。一実施形態において、トラステッドディクショナリ２６５は、データ暗号化規格（ＤＥＳ）あるいは次世代暗号化規格（ＡＥＳ）というような標準的な暗号を用いて暗号化される。
【００５５】
シークレットメソッド２９０の暗号化に使用される鍵は、ソフトウェア耐タンパ技術において通常使用されるような、高度に難読化されたグローバルシークレットである。既知の、あるいは利用可能なブロードキャスト暗号化技術は、クラス２９５を暗号化するのに使用される鍵の管理に使用され得る。ブロードキャスト暗号化技術に関するさらなる詳細について、例えば、米国特許第６，１１８，８１３号および米国特許出願第２００２／０１１４７９０６Ａ１号が参照されうる。トラステッドＪａｖａ（登録商標）仮想マシン１０は適切なブロードキャスト暗号化スキームを使用してクラス２９５を暗号化することが出来る。
【００５６】
ブロードキャスト暗号を使用するために、トラステッドＪａｖａ（登録商標）仮想マシン２０５の設計者は、クラス２９５といったようなＪａｖａ（登録商標）クラスを暗号化するそれぞれのアプリケーション設計者に、メディア鍵ブロックとそれらの関連メディア鍵を配送する。アプリケーション設計者はメディア鍵を使用するツールにより特定のクラス２９５を暗号化する。このツールはＪａｖａ（登録商標）アーカイブファイルにメディア鍵ブロックを加える。
【００５７】
デバイス鍵２９２のセットがトラステッドＪａｖａ（登録商標）仮想マシン２０５に構築される。トラステッドＪａｖａ（登録商標）仮想マシン２０５の各バージョンは異なるセットのデバイス鍵を有する。所定の暗号化されたクラス２９５の復号には、トラステッドＪａｖａ（登録商標）仮想マシン２０５がそのデバイス鍵を用いてＪａｖａ（登録商標）アーカイブファイル内のメディア鍵ブロックを処理して、メディア鍵を抽出する。
【００５８】
ハッキングにより特定のトラステッドＪａｖａ（登録商標）仮想マシン２０５が破られ、そのデバイス鍵のセットが発覚した場合、新しいデバイス鍵のセットによる新しいトラステッドＪａｖａ（登録商標）仮想マシン２０５を展開することができる。この新しいデバイス鍵のセットは、既存の全てのアプリケーションにおける全メディア鍵ブロックを処理することが可能である。
【００５９】
さらに、コンプロマイズしていない鍵を機能させる一方で、コンプロマイズしたデバイス鍵を取り除くアプリケーション設計者に新しいメディア鍵ブロックを与えることができる。アプリケーション設計者は都合の良いときに彼のアプリケーションを新しいメディア鍵ブロックにアップデートすることができる。メディア鍵ブロックのアップデートは新しいトラステッドＪａｖａ（登録商標）仮想マシン２０５の展開と厳密に同期する必要はない。
【００６０】
トラステッドＪａｖａ（登録商標）仮想マシン２０５が動作しているプラットフォームは、例えば、ＴＣＰＡチップあるいはパラジウムチップといったようなセキュリティチップを含み得る。そうした場合、デバイス鍵の記憶にこれらのチップに使用することができる。
【００６１】
一実施形態において、トラステッドディクショナリ２６５は、標準Ｊａｖａ（登録商標）ベースクラスディクショナリのサブクラスを含む。データ値の記憶および検索を可能にする適切なクラスがトラステッドディクショナリ２６５として使用される。トラステッドディクショナリ２６５の方法（例えば「ｇｅｔ」および「ｐｕｔ」）が、トラステッドＪａｖａ（登録商標）仮想マシン２０５のネイティブメソッド２２５として実行される。
【００６２】
トラステッドディクショナリ２６５がコピーを可能としない場合、それは「ローカライズされた」と定義される。トラステッドディクショナリ２６５がローカライズされていると、Ｊａｖａ（登録商標）アプリケーション２１５が特定すると、Ｊａｖａ（登録商標）アプリケーション２１５は他のコンピュータシステムのトラステッドディクショナリ２６５を読み取ることが出来ない。
【００６３】
鍵データベースを含む既知のあるいは利用可能なロジック技術、および鍵算出における間接の段を、トラステッドディクショナリ２６５の生成に使用することができる。トラステッドディクショナリ２６５の基本ロジックに関するさらなる詳細について、例えば、２００１年１月５日に出願された米国特許出願第０９／７５４，３９６号、代理人整理番号ＡＭ９−９９−０１４５が参照されうる。これらの開示内容を本明細書に援用する。
【００６４】
Ｊａｖａ（登録商標）ディクショナリは一般に「鍵」と「値」を有する。しかし、ディクショナリ鍵と暗号鍵との混乱を避けるため、前のコンセプトの「鍵」の代わりに「キーワード」という言葉を用いる。従い、ディクショナリ値はキーワードに関して記憶され、これらは後にキーワードを用いて検索される。トラステッドディクショナリ２６５において、キーワードおよび値は、データベースマスター鍵と呼ばれる秘密鍵によって暗号化される。データベースマスター鍵は、一般値、プラットフォーム特定値、および読み書き値といったタイプの値の秘密関数の結果である。プラットフォーム特定値は例えばユーザのコンピュータのハードディスクのシリアル番号である。
【００６５】
読み書き値の例では、コンピュータの基本入出力システム（BIOS）の読み書き領域に記憶される値がある。インテグリティを目的に、エンドユーザによる読み書き値のセーブ及び回復は容易になされ得ない。TCPAあるいはパラジウムチップを含むプラットフォームにおいて、プラットフォーム値と読み書き能力がチップに構築される。
【００６６】
例として、「鍵データベース」がトラステッドディクショナリ２６５に使用される。鍵データベースが１つのPCから別のPCに移されると、プログラムはデータベースの正確なマスター鍵をもはや算出せず、データベースは無効となる。鍵データベースにはカウンタが備わっている。ユーザはカウンタをリセットするために、鍵データベースのセーブ及び回復を試みるかもしれない。マスター鍵が変わり、読み書き値がセーブと回復との間で変わる。従い、鍵データベースとトラステッドディクショナリ２６５はもはや使用不可能となる。Ｊａｖａ（登録商標）アプリケーション２１５はここで、ユーザが使用ルールの回避を試みて、適切に応答可能であることを認識している。
【００６７】
いくつかのＪａｖａ（登録商標）アプリケーション２１５ではプラットフォームバインディングもしくはセーブ／回復保護を必要としない。プラットフォームバインディングあるいはセーブ／回復保護、ディクショナリの構成パラメータを生成すること、また、必要に応じて秘密マスター鍵関数にプラットフォーム特定値あるいは読み書き値を含ませないことは比較的容易なことである。
【００６８】
トラステッドディクショナリ２６５には、トラステッドディクショナリ２６５生成の際に設定された公開鍵のリストが含まれている。これらの公開鍵は、公開鍵の１つに関連する秘密鍵によってそのＪａｖａ（登録商標）アーカイブファイルに署名がされたトラステッドバンドル２４０への、トラステッドディクショナリ２６５のアクセスを制限する。
【００６９】
一実施形態において、トラステッドディクショナリ２６５がアクセスする前に、トラステッドバンドル２４０に代わり、トラステッドディクショナリ２６５インプレメンテーションが公開鍵のリストをチェックする。別の実施形態においては、秘密関数に入力される一般値の１つに公開鍵を用いる、ビルトイン「秘密関数」マスター鍵メカニズムの長所を有する。よって、許可されるとバンドルは首尾よくトラステッドディクショナリ２６５を復号する。
【００７０】
１つ以上の公開鍵がトラステッドディクショナリ２６５に関連する場合、間接の段が鍵算出に加えられる。さまざまなマスター鍵のそれぞれ、各公開鍵の１つは、共通の中間鍵を暗号化する。中間鍵はトラステッドディクショナリ２６５における値を暗号化する。
【００７１】
加えて、中間鍵の異なる暗号バージョンがトラステッドディクショナリ２６５に記憶される。トラステッドバンドル２４０がトラステッドディクショナリ２６５へのアクセスを試みると、トラステッドＪａｖａ（登録商標）仮想マシン２０５はマスター鍵を算出して、中間鍵のこれらの暗号化バージョンそれぞれを復号する。このトラステッドディクショナリ２６５にバンドルのアクセスが許可される場合、これら復号の１つが真の中間鍵である。この真の中間鍵がアクセスを許可する。
【００７２】
トラステッドディクショナリにおけるキーワードの値はほとんど何らかのＪａｖａ（登録商標）オブジェクトである。Ｊａｖａ（登録商標）言語において、例えば、ほとんどのＪａｖａ（登録商標）オブジェクトはｗｒｉｔｅＯｂｊｅｃｔ（）メソッドを用いてバイトのシーケンスに変換され得る。こうしたオブジェクトは「直列化可能」と呼ばれる。バイトのそのシーケンスはディクショナリキーワードもしくは値として扱われる。従い、直列化可能Ｊａｖａ（登録商標）オブジェクトはトラステッドディクショナリ２６５に支障なく記憶される。
【００７３】
一実施形態において、トラステッドバンドル２４０は、オープンサービス・ゲートウェイ・イニシアチブ（Ｏｐｅｎ  Ｓｅｒｖｉｃｅ  Ｇａｔｅｗａｙ  Ｉｎｉｔｉａｔｉｖｅ（ＯＳＧｉ））のバンドルクラスのサブクラスである。アプリケーションのほとんどのパブリックメソッドへのアクセスを制限し得るコンセプトはトラステッドバンドル２４０にある。
【００７４】
Ｊａｖａ（登録商標）のフューチャは、そのプライベートメソッドのみならず、クラス全体をバンドル外の他から「隠蔽する」ために使用される。例えば、クラスＸおよびクラスＹといった２つのクラスは、クラスローダＡおよびクラスローダＢの異なるクラスローダによりロードされる。Ｊａｖａ（登録商標）仮想マシンにクラスを定義するのにクラスネーム及び実際のクラスローダの両方が重要である。
【００７５】
クラスローダＡおよびクラスローダＢが相互に通信を行うために特別な手段をとらない限り、同一ネームを有するクラスであっても複製され、各クラスローダによって別々に取り込まれる。従い、同一ネームの２つの同一クラスは、トラステッドＪａｖａ（登録商標）仮想マシン２０５により異なるクラスと見なされる。例えば、クラスＸがウィジェットオブジェクトを生成して、それをクラスＹのメソッドに渡すと、ウィジェットを実行するクラスファイルが同一であるにもかかわらず、クラスＸではＡウィジェットを生成し、クラスＹではＢウィジェットが予想されることからＣｌａｓｓＣａｓｔＥｘｃｅｐｔｉｏｎエラーが生じる。
【００７６】
一実施形態において、クラス全体を隠蔽するこのＪａｖａ（登録商標）のフューチャは、ＯＳＧｉバンドルコンセプトにおいて実行される。各バンドルは、別々のクラスローダによって意図的にロードされる別々のＪａｖａ（登録商標）アーカイブファイルである。このクラスローダはシステムにおける他のクラスローダと通信を行い、Ｊａｖａ（登録商標）ベースクラス２１０を得て、そして、Ｊａｖａ（登録商標）アーカイブファイルのマニフェストにおいて「エキスポート」パッケージとして明確に指定されているパッケージ（クラスのグループ）をエキスポートする。エキスポートされたクラスのみが他のバンドルにより、あるいはバンドル外のコードにより首尾よく参照され得る。
【００７７】
ＯＳＧｉバンドル、トラステッドバンドル２４０を作成するために、トラステッドＪａｖａ（登録商標）仮想マシン１０は、ＯＳＧｉバンドルのＪａｖａ（登録商標）アーカイブマニュフェストが署名されるよう要求する。従い、元の署名者により指示されたパッケージのみエキスポート可能である。
【００７８】
一実施形態において、トラステッドＪａｖａ（登録商標）仮想マシン１０はｇｅｔＣｌａｓｓＬｏａｄｅｒ（）プライベートメソッドを生成する。すなわち、これは、ハッカーがｇｅｔＣｌａｓｓＬｏａｄｅｒ（）が使用して、例えばメディアの所有権保護においてアプリケーション設計者の意図の裏をかくのを防止する。ＯＳＧｉバンドルの次の特徴により、このメソッドｇｅｔＣｌａｓｓＬｏａｄｅｒ（）はプライベートとなる。Ｊａｖａ（登録商標）オブジェクトのクラスは、そのオブジェクト上でｇｅｔＣｌａｓｓＬｏａｄｅｒ（）メソッドを用いることによって得られる。その結果は、ｇｅｔＣｌａｓｓＬｏａｄｅｒ（）と呼ばれるパブリックメソッドを有するクラスオブジェクトである。ｇｅｔＣｌａｓｓＬｏａｄｅｒ（）は、クラスをロードするクラスローダのクラスローダオブジェクトを返送する。クラスローダオブジェクトから、クラスローダによりロードされる他のクラスのクラスオブジェクトを見つけるのに、メソッドｌｏａｄＣｌａｓｓ（）が使用され得る。そのクラスオブジェクトから、そのクラスの新しいオブジェクトがインスタンス生成され得る。これは意図を無効化して、エキスポートされたクラスのみがトラステッドバンドル２４０外でインスタンス生成されるのを可能にする。
【００７９】
別の実施形態において、「ｇｅｔＣｌａｓｓＬｏａｄｅｒ（）」の挙動がトラステッドバンドル２４０を認識するように修正される。従い、ｇｅｔＣｌａｓｓＬｏａｄｅｒ（）は、有用なクラスローダのみを、同じトラステッドバンドル２４０にあるメソッドに返送する。さらなる実施形態においては、Ｊａｖａ（登録商標）セキュリティマネジャを使用して、ｇｅｔＣｌａｓｓＬｏａｄｅｒ（）を実行するオブジェクトを制限する。また別の実施形態では、トラステッドバンドル２４０の外を呼び出すときに、エキスポートされたクラスのみを明らかにするようにバンドルクラスローダを修正する。
【００８０】
Ｊａｖａ（登録商標）ベースクラス２１０は全てのトラステッドバンドル２４０に共通であることから、Ｊａｖａ（登録商標）ベースクラス２１０はインテグリティエンベロープにカプセル化される。さもなければ、Ｊａｖａ（登録商標）ベースクラス２１０を装うトロイの木馬を有することも論理的に可能である。例えば、トラステッドバンドル２４０が鍵を列に変換できるとすると、偽りの列クラスがハードディスクに結果を書き込む。このアタックはいくらか強引ともいえるが、Ｊａｖａ（登録商標）ベースクラス２１０をチェックするだけでこれを取り除くのは容易なことである。
【００８１】
トラステッドＪａｖａ（登録商標）仮想マシン１０は「セキュア認証チャネル」を使用する。「セキュア認証チャネル」なる用語はソフトウェア耐タンパ性において一般的な用語である。これは、渡されるデータを介入者に取り出させることなく相互に通信が必要な２つの別々のソフトウェアモジュール間の接続に相当する。
【００８２】
トラステッドバンドル２４０にトラステッドディクショナリ２６５を共有させることにより、好都合にセキュア認証チャネルをトラステッドＪａｖａ（登録商標）仮想マシン１０に確立することが可能である。言い換えると、発呼側と被発呼側のトラステッドバンドル２４０の両方から公開鍵によりインスタンス生成されたトラステッドディクショナリ２６５を通過して、発呼側トラステッドバンドル２４０は被発呼側のトラステッドバンドル２４０のエキスポートされたクラスを呼び出す。事前のアレンジメントにより、被発呼側のトラステッドバンドル２４０への引数として作用する特定のネーム値がトラステッドディクショナリ２６５に記憶される。同様に、被発呼側のトラステッドバンドル２４０は、事前にアレンジされたネームにおけるトラステッドディクショナリ２６５にそれらを記憶することによって値を返送する。トラステッドＪａｖａ（登録商標）仮想マシン１０はこのようにして鍵のような秘密値を返送して、介入者プログラムによる監視もしくは修正を防止する。
【００８３】
このセキュア認証チャネルアプローチは、信頼できる環境で動作しているトラステッドバンドル２４０に対しては検証を行わない。従い、トラステッドバンドル２４０は、このメカニズムを信頼する前に上述の方法を用いてトラステッドバンドル２４０が信頼できる環境にあることを検証する。加えて、トラステッドディクショナリ２６５をインスタンス生成しなかった部分は、その公開鍵が予測通りであることを検証する。実施形態において、トラステッドディクショナリ２６５のクラスはｇｅｔＰｕｂｌｉｃＫｅｙｓ（）メソッドを実行して、パブリックキーを検証する。トラステッドＪａｖａ（登録商標）仮想マシン１０は、多数のメソッドのうちのいずれかを用いて公開鍵を検証する。
【００８４】
一実施形態において、トラステッドＪａｖａ（登録商標）仮想マシン環境は、Ｊａｖａ（登録商標）アプリケーション２１５に影響を与えることなく、例えばＴＣＰＡおよびパラジウムチップといったようなセキュリティチップを使用する。トラステッドＪａｖａ（登録商標）仮想マシン２０５は通常、基本入出力システム（ＢＩＯＳ）ローダにより開始する信頼の連鎖の部分としてロードされる。信頼の連鎖が失われると、トラステッドＪａｖａ（登録商標）仮想マシン２０５は、オペレーティングシステムが安全であるとはもはや信頼しない。
【００８５】
しかしこれはソフトウェア耐タンパ性の通常の状態であって、補償を行う既知の方法がある。例えば、オペレーティングシステムの重要部分は、ソフトウェア・インテグリティ・エンベロープを有する。あるいは、ウィルス検出に用いられる技術に類似する技術が展開され、ユーザが彼自身のオペレーティングシステムカーネルにインストールした迂回プログラムを検出することが可能である。多くの迂回プログラムはカーネルレベルで稼動するように設計されている。
【００８６】
オペレーティングシステムが信頼できない状況において、トラステッドＪａｖａ（登録商標）仮想マシン２０５は一般的なソフトウェア耐タンパ技術を用いて、オペレーティングシステムの迂回プログラムを検出する。トラステッドＪａｖａ（登録商標）仮想マシン２０５は、デバイス鍵を記憶するセキュリティチップと、トラステッドディクショナリ２６５の算出用の値を用いる。
【００８７】
通常のオペレーションにおいて、セキュリティチップの値はＪａｖａ（登録商標）アプリケーション２１５のチェックサムにより保護される。しかし、これらのチェックサムは秘密ではなく、これらは、信頼の連鎖において直ちに基の層により実行される。一旦信頼の連鎖が壊れると、これらの値は秘密鍵として作用する。すなわち、鍵はもはやチェックサムである必要はない。実施形態において、トラステッドＪａｖａ（登録商標）仮想マシン２０５の記憶値を解除する値は、インテグリティ算出、例えば電子署名算出の結果である。
【００８８】
トラステッドＪａｖａ（登録商標）仮想マシン１０を使用するトラステッドＪａｖａ（登録商標）アプリケーション２１５を生成する方法３００を、図３のプロセスフローチャートにて示している。ステップ３０５において、アプリケーション設計者は、Ｊａｖａ（登録商標）アプリケーション２１５のどのアスペクトが保護を必要とするかを判断する。Ｊａｖａ（登録商標）アプリケーション２１５は、秘密コード、秘密データ、あるいはこの２つの組合せから成る。例えば、ＤＶＤビデオコンテンツ保護スキーム（ＣＳＳ）は秘密鍵を有する。ＣＳＳもまた、暗号化アルゴリズムを保護するライセンシーを必要とする。一方で、ＤＶＤオーディオ保護スキーム（ＣＰＰＭ）は秘密鍵のみを有する。すなわち、アルゴリズムは公開される。
【００８９】
Ｊａｖａ（登録商標）アプリケーション２１５が秘密データから成る場合、Ｊａｖａ（登録商標）アプリケーション２１５はＪａｖａ（登録商標）ディクショナリに秘密データを配置するように設計される。Ｊａｖａ（登録商標）ディクショナリは、Ｊａｖａ（登録商標）アプリケーション２１５が展開される際に、トラステッドディクショナリ２６５としてインスタンス生成される。
【００９０】
ステップ３１０にてＪａｖａ（登録商標）アプリケーション２１５のバンドルが設計される。一実施形態において、これらのバンドルは、オープンサービス・ゲートウェイ・イニシアチブバンドルとして設計される。アプリケーション設計者はバンドルに一致するＪａｖａ（登録商標）アーカイブファイルに署名する。すなわち、これによりバンドルが確実にトラステッドバンドル２４０として扱われる。トラステッドディクショナリ２６５がインスタンス生成される際、アプリケーション設計者は公開鍵のリストを提供する。関連する秘密鍵により署名されているバンドルのみが、そのトラステッドディクショナリ２６５へのアクセスを許可される。
【００９１】
ステップ３０５において、アプリケーション設計者は、Ｊａｖａ（登録商標）アプリケーション２１５は秘密を含んでいないことを判断する。例えば、ＭＰＥＧレンダリングアプリケーションはその機能を実行するのに秘密情報を必要としない。例えば、アプリケーション設計者は、別のコンテンツ保護スキームによりサブルーチンとして意図されるアプリケーションを生成する。この場合、サブルーチンがレンダリングのみであり、ファイルにデータをセーブしないことをそのコンテンツ保護スキームは信頼する。この場合、アプリケーション設計者は、任意のステップ３１５、「他のバンドルとのインターフェースを設計」に従う。
【００９２】
ステップ３１５において、いずれかのアプリケーションあるいはサービス（信頼できる、または信頼できない）から呼び出し可能なパブリックインターフェースが、適切なインターフェースにより、通常のＯＳＧｉサービスとして利用可能になる。そのサービスがトラステッドバンドル２４０とのインターフェースを必要とする場合、トラステッドバンドル２４０へのインターフェースはトラステッドディクショナリ２６５を必要とする。
【００９３】
例えば、トラステッドバンドル２４０へのインターフェースは、発呼側と「被発呼側」間にある。サービスがトラステッドバンドル２４０とのインターフェースにおいて発呼側にある場合、サービスはトラステッドディクショナリ２６５を用いる。サービスが発呼側にない場合、アプリケーション設計者は、サービスの公開鍵と、被発呼側の公開鍵によりトラステッドディクショナリ２６５をインスタンス生成する。これらの公開鍵がプライベートトラステッドディクショナリ２６５にセーブされて、耐タンパを確実にする。
【００９４】
サービスが被発呼側にある場合、発呼側はトラステッドディクショナリ２６５をインスタンス生成している。トラステッドディクショナリ２６５がサービスに渡されると、サービスは、トラステッドディクショナリ２６５が予想された公開鍵により構築されたことを検証する。発呼側に対してそのファンクションを実行する、秘密を有しないレンダリングアプリケーションは、トラステッドディクショナリ２６５の確認を要しない。
【００９５】
秘密引数と戻り値がトラステッドディクショナリ２６５を介して渡され、介入者のアタックを回避する。トラステッドディクショナリ２６５は直列化可能Ｊａｖａ（登録商標）オブジェクトから成る。「ｉｎｉｔ」メソッドは、トラステッドディクショナリ２６５を介してオブジェクトをサービスの発呼側に戻す。通常の引数および戻り値がその初期オブジェクトのメソッドにより使用される。この初期オブジェクトはエキスポートされたクラスのインスタンスである。アプリケーション設計者がこの最適化を用いる場合、インターフェースと抽象型クラスのみエキスポートパッケージにある。
【００９６】
ステップ３２０において、アプリケーション設計者は任意にトラステッドディクショナリツールを構築する。アプリケーション設計者は、Ｊａｖａ（登録商標）アプリケーション２１５が生成される環境であるような既知の信頼できる環境において、トラステッドディクショナリ２６５に、アプリケーションにて使用される秘密データを供給する。
【００９７】
インストレーションの間、エンドユーザにユーザマシン上でトラステッドディクショナリ２６５をインスタンス生成させることでは、要求されるような信頼できる環境を保証し得ない。アプリケーション設計者はトラステッドディクショナリ２６５をインスタンス生成するツールを構築し、そのツールに必要な秘密を供給し、そして標準的なＯｂｊｅｃｔＯｕｔｐｕｔＳｔｒｅａｍメソッドを用いて、そのツールをファイルに直列化する。
【００９８】
直列化されるトラステッドディクショナリ２６５は、例えば、Ｊａｖａ（登録商標）アプリケーション２１５のＪａｖａ（登録商標）アーカイブファイルの部分として展開され得る。直列化トラステッドディクショナリ２６５は、トラステッドＪａｖａ（登録商標）仮想マシン２０５によって読取あるいは書き込みのみ可能である。
【００９９】
ステップ３２５において、アプリケーション設計者は任意にＪａｖａ（登録商標）アプリケーション２１５のレジストレーションプロセスを設計する。Ｊａｖａ（登録商標）アプリケーション２１５の所定のインスタンスが単一プラットフォームにバウンドしたままであると、ＢｕｎｄｌｅＡｃｔｉｖａｔｏｒ  ｃｌａｓｓ’ｓ  ｓｔａｒｔ（）メソッドの起動によりプライベートトラステッドディクショナリ２６５を読み取り、プライベートトラステッドディクショナリ２６５上でｓｅｔＬｏｃａｌ（）を実行し、そしてファイルシステムにプライベートトラステッドディクショナリ２６５を書き戻す。
【０１００】
付加された保護のため、アプリケーション設計者は、ステップ３２５と、外部レジストレーションサービスへの接続とをコンバインする。アプリケーションにより展開されているプライベートトラステッドディクショナリ２６５は、ＩＤと初期接続の秘密を有する。後続する秘密は、トラステッドディクショナリ２６５がローカライズされた後、レジストレーションの部分として配送される。
【０１０１】
ステップ３３０において、アプリケーション設計者は任意にセキュアカウントを設計する。Ｊａｖａ（登録商標）アプリケーション２１５はオペレーションの間、セキュアカウントを必要とする。ハードディスクへのファイルのセーブおよび回復時に、ユーザが容易にリセット出来ないセキュアカウントが、トラステッドディクショナリ２６５に記憶される。ＢＵｎｄｌｅＡｃｔｉｖａｔｏｒクラスのｓｔａｒｔ（）メソッドの起動により、プライベートトラステッドディクショナリ２６５を読取り、プライベートトラステッドディクショナリ２６５上にてｐｒｅｖｅｎｔＮｏｒｍａｌＲｅｓｔｏｒｅ（）を実行する。そこで、ＢｕｎｄｌｅＡｃｔｉｖａｔｏｒクラスは、ＯｂｊｅｃｔＯｕｔｐｕｔＳｔｒｅａｍのｗｒｉｔｅＯｂｊｅｃｔ（）メソッドを用いて、プライベートトラステッドディクショナリ２６５をファイルシステムに書き戻す。トラステッドディクショナリ２６５はここで不可逆な状態にあり、これは、ファイルを単に古いバージョンに替えることでは、エンドユーザがこれを前の状態に変えることは容易に出来かねることを意味する。
【０１０２】
トラステッドディクショナリ２６５においてセキュアカウントが増すたびに、セキュアカウントはファイルシステムに書き戻される。Ｊａｖａ（登録商標）アプリケーション２１５はトラステッドディクショナリ２６５上でｃｏｍｍｉｔ（）を実行し、不都合なシステム崩壊によるトラステッドディクショナリ２６５の不測の破壊を回避する。ユーザは、ｃｏｍｍｉｔ（）なしにトラステッドディクショナリ２６５を前のｃｏｍｍｉｔ（）ポイントに戻し回復する。いかなるディクショナリ上のどのコミットもそれら全部をコミットする。ゆえに、連続的に複数のディクショナリを更新しながら、全ディクショナリが１回の起動によりコミットされ得る。しかし、それが不可逆とマークされたとしても、トラステッドＪａｖａ（登録商標）仮想マシン２０５はトラステッドディクショナリ２６５を回復できる。
【０１０３】
ステップ３３５において、アプリケーション設計者はＪａｖａ（登録商標）アプリケーション２１５をデバッグする。トラステッドディクショナリ２６５のデバッグバージョンはどのＪａｖａ（登録商標）仮想マシン上でも実行可能である。システム特性に基づいて、ｔｒｕｓｔｅｄＤｉｃｔｉｏｎａｒｙｋｅｙＶｅｒｉｆｙ（トラステッドディクショナリ鍵検証）は「真」または「偽」のいずれかとなり、デバッグクラスは適切に署名されたＪａｖａ（登録商標）アーカイブファイルを実行する、または実行しない。トラステッドディクショナリ２６５のデバッグバージョンはトラステッドディクショナリ２６５の「直列化可能」挙動を実行する。すなわち、トラステッドディクショナリ２６５における全てのオブジェクトは直列化可能であり、「ｇｅｔ」メソッドは、オリジナルオブジェクトそれ自体ではなくオリジナルオブジェクトの複製を返す。
【０１０４】
トラステッドディクショナリ２６５のデバッグバージョンはトラステッドＪａｖａ（登録商標）仮想マシン２０５において読取り不可能である。トラステッドＪａｖａ（登録商標）仮想マシン２０５はどのような種類のデバッグもサポートしない。
【０１０５】
ステップ３４０において、アプリケーション設計者はＪａｖａ（登録商標）アプリケーション２１５の構築プロセスを完了する。任意に、設計者が１つ以上のクラスを暗号化している場合、メディアキーブロックが得られる。このメディアキーブロックはＪａｖａ（登録商標）アーカイブファイルの公開鍵にカスタマイズされる。
【０１０６】
Ｊａｖａ（登録商標）アーカイブ署名者（ｊａｒｓｉｇｎｅｒ）は、Ｊａｖａ（登録商標）アーカイブファイルに署名している。Ｊａｖａ（登録商標）アーカイブファイルが署名された後には、このＪａｖａ（登録商標）アーカイブファイルにクラスの追加はなされない。しかし、アーカイブファイルが署名された後に、Ｊａｖａ（登録商標）アーカイブファイルにデータもしくは他のリソースは追加され得る。トラステッドディクショナリ２６５は自己認証であり、従いＪａｖａ（登録商標）アーカイブファイルにおけるトラステッドディクショナリ２６５の署名は一般的には必要とされない。
【０１０７】
トラステッドＪａｖａ（登録商標）仮想マシン１０におけるＤＶＤプレイヤアプリケーションとＤＶＤディスク間のインタラクションを、図４および図５のプロセスフローチャートの方法４００にて示している。ユーザはＤＶＤドライブを有しており、オープンソースのＤＶＤプレイヤソフトウェアによるＤＶＤドライブの操作を望んでいる。ＤＶＤドライブはＤＶＤディスクを動作する機構である。ステップ４０５においてユーザはトラステッドＪａｖａ（登録商標）仮想マシン２０５をダウンロードし、これを彼のＤＶＤ装置にインストールする。ＤＶＤ装置は、ＤＶＤドライブと、トラステッドＪａｖａ（登録商標）仮想マシン２０５およびＤＶＤドライブを動作するのに十分な計算能力とを有する。
【０１０８】
ステップ４１０において、ユーザはＤＶＤプレイヤのソフトウェアをダウンロードし、これをインストールする。ＤＶＤプレイヤのソフトウェアは、１つ以上のトラステッドバンドル２４０におけるオープンソースコードと、１つ以上のトラステッドディクショナリ２６５における鍵およびＩＤといったような秘密を含む。トラステッドバンドル２４０が生成されたことから、トラステッドＪａｖａ（登録商標）仮想マシン２０５は、ＤＶＤプレイヤソフトウェアのトラステッドバンドル２４０の電子署名をチェックして、トラステッドバンドル２４０が修正されてないことを確認する（ステップ４１５）。電子署名が無傷でない場合（決定ステップ４２０）、ステップ４２５においてトラステッドＪａｖａ（登録商標）仮想マシン２０５はトラステッドディクショナリ２６５へのアクセスを許可しない。
【０１０９】
ステップ４３０において、ＤＶＤプレイヤのソフトウェアはＤＶＤドライブ上のＤＶＤディスクにアクセスを行う。ＤＶＤディスクは、ディスク再生を許可するための特定のデバイス鍵を要求する。すなわち、これらの鍵はトラステッドディクショナリ２６５に記憶されている。トラステッドディクショナリ２６５へのアクセスには、正確な鍵によって署名されたそのままの署名を必要とする。ステップ４３５において、トラステッドＪａｖａ（登録商標）仮想マシン２０５は、トラステッドディクショナリ２６５にアクセスを行うための適切な鍵をＤＶＤプレイヤのソフトウェアが有していることを検証する。ＤＶＤプレイヤのソフトウェアがアクセス用の適切な鍵を有していない場合（決定ステップ４４０）、トラステッドＪａｖａ（登録商標）仮想マシン２０５はトラステッドディクショナリ２６５へのアクセスを許可しない（ステップ４２５）。
【０１１０】
決定ステップ４４０において、ＤＶＤプレイヤがアクセス用の適切な鍵を有している場合、ＤＶＤプレイヤのソフトウェアはその鍵がそのままの真正であることを検証する。そこでＤＶＤプレイヤのソフトウェアがトラステッドディクショナリ２６５にアクセス可能となる。ステップ４４５において、トラステッドＪａｖａ（登録商標）仮想マシン２０５はトラステッドディクショナリ２６５を復号する。ステップ４５０において、ＤＶＤプレイヤのソフトウェアはトラステッドディクショナリ２６５から例えばデバイス鍵といったような１つ以上の鍵を得て、ステップ４５５において、必要に応じて鍵をＤＶＤドライバに供給する。ステップ４６０において、ＤＶＤドライバはＤＶＤディスクを再生する。ＤＶＤプレイヤのソフトウェア、ＤＶＤディスク、そしてＤＶＤ装置の全部は異なる製造者により製造されうる。しかし、これら全部が協働して、トラステッドＪａｖａ（登録商標）仮想マシンにおけるコンテンツの保護を確実に行う。
【０１１１】
Ｊａｖａ（登録商標）アプリケーション２１５を不正に使用しようとすると、Ｊａｖａ（登録商標）アプリケーション２１５は、信頼できる環境を提供しない従来のＪａｖａ（登録商標）仮想マシンにロードされる。通常のオペレーションにおいて、Ｊａｖａ（登録商標）アプリケーション２１５は、ＤＶＤディスクを再生するといったようなタスクを実行する鍵をリクエストして、トラステッドディクショナリ２６５へのアクセスを試みる。しかし、従来のＪａｖａ（登録商標）仮想マシンはトラステッドディクショナリ２６５を復号することは出来ない。従い、Ｊａｖａ（登録商標）アプリケーション２１５は、操作継続に要求される鍵を得ることは不可能である。Ｊａｖａ（登録商標）アプリケーション２１５が従来のＪａｖａ（登録商標）仮想マシンにおいて動作するオープンソースソフトウェアであっても、Ｊａｖａ（登録商標）アプリケーション２１５の設計者により許可されていないオペレーションおよび情報は、正確な鍵なくしては発生し得ない。
【０１１２】
本文に記載を行った本発明の詳細なる実施形態は、本発明の原理における特定のアプリケーションの例示でしかないことは理解されるべきである。本発明の範囲を逸脱することなく、本文に記載を行った同様の内容において、耐タンパ性トラステッドＪａｖａ（登録商標）仮想マシンおよび方法に多くの修正がなされ得る。
【図面の簡単な説明】
【０１１３】
【図１】本発明のトラステッドＪａｖａ（登録商標）仮想マシン環境が使用され得る典型的な動作環境の略図である。
【図２】図１のトラステッドＪａｖａ（登録商標）仮想マシン環境の高水準アーキテクチャのブロック図である。
【図３】図１および図２のトラステッドＪａｖａ（登録商標）仮想マシン環境において使用されるアプリケーションを生成する方法を示したプロセスフローチャートである。
【図４】図１および図２のトラステッドＪａｖａ（登録商標）仮想マシン環境における典型的なアプリケーションの動作方法を示したプロセスフローチャートである。
【図５】図１および図２のトラステッドＪａｖａ（登録商標）仮想マシン環境における典型的なアプリケーションの動作方法を示したプロセスフローチャートである。
【符号の説明】
【０１１４】
１０、２０５：トラステッドＪａｖａ（登録商標）仮想マシン
１５：サーバ
２０、２５、３０：コンピュータ
３５：ネットワーク
４０、４５、５０、５５：通信リンク
２１０：Ｊａｖａ（登録商標）ベースクラス
２１５：Ｊａｖａ（登録商標）アプリケーション
２２０：バイトコードインタプリタ
２２５：ネイティブメソッド
２４０：トラステッドバンドル
２４５：アプリケーションメイン
２５０：アプレットＩＮＩＴ
２６５、２６７：トラステッドディクショナリ
２７０、２７５、２８０、２８５：インテグリティエンベロープ
２９２：デバイス鍵
【図１】
2007514994.tif 000002
【図２】
2007514994.tif 000003
【図３】
2007514994.tif 000004
【図４】
2007514994.tif 000005
【図５】
2007514994.tif 000006
【国際調査報告】
2007514994.tif 000007
2007514994.tif 000008
2007514994.tif 000009
2007514994.tif 000010
2007514994.tif 000011