サンドボックスセキュリティメカニズムとネイティブ
1.サンドボックスセキュリティメカニズム
Javaセキュリティモデルの中核はJavaサンドボックスです。サンドボックス
とは何ですか?サンドボックスは、プログラムの実行を制限する環境です。サンドボックスメカニズムは、Javaコードを仮想マシン(JVM)の特定の動作範囲に制限し、コードの効果的な分離を保証し、コードへの損傷を防ぐような手段を通じて、ローカルシステムリソースへのコードのアクセスを厳密に制限することです。ローカルシステム。
サンドボックスは主にシステムリソースへのアクセスを制限します。システムリソースとは何ですか?CPU、メモリ、ファイルシステム、およびネットワーク。サンドボックスのレベルが異なれば、これらのリソースへのアクセスに対する制限も異なります。
すべてのJavaプログラムはサンドボックスで実行でき、セキュリティポリシーをカスタマイズできます。
- Javaセキュリティモデルのコア
- サンドボックス:プログラムのランタイム環境を制限します
- ドメインの概念
- Javaコードを仮想マシンの特定の動作範囲に制限し、ローカルシステムリソースへのコードのアクセスを厳密に制限します。この対策により、コードを効果的に分離し、ローカルシステムへの損傷を防ぎます。
サンドボックスを構成する基本的なコンポーネント
- バイトコードベリファイア(バイトコードベリファイア)
:JavaクラスファイルがJava言語仕様に従っていることを確認します。これは、Javaプログラムがメモリ保護を実現するのに役立ちます。ただし、コアクラスなど、すべてのクラスファイルがバイトコード検証を受けるわけではありません。 - クラスローダー(クラスローダー):その中で、クラスローダーは3つの方法でJavaサンドボックスで役割を果たします
- 悪意のあるコードが意図的なコードに干渉するのを防ぎます。
- 信頼できるクラスライブラリの境界を保護します。
- コードを保護ドメインに分類し、コードが実行できる操作を決定します。
仮想マシンは、異なるクラスローダーによってロードされたクラスに異なる名前空間を提供します。名前空間は一連の一意の名前で構成されます。ロードされた各クラスには名前が付けられます。この名前空間は、それぞれのJava仮想マシンによって提供されます。これらはクラスによって維持されます。ローダー、そしてそれらはお互いにさえ見えません。
クラスローダーで使用されるメカニズムは、親の委任モデルです。
1.最も内側のJVM自体のクラスローダーからロードを開始します。同じ名前の外側の悪意のあるクラスはロードできず、使用できません
。2。アクセスドメインはパッケージによって厳密に区別されるため、外側の悪意のあるクラスは組み込みコード。内部クラスにアクセスするためのアクセス許可を取得すると、壊れたコードは当然有効になりません。
-
アクセスコントローラー:アクセスコントローラーは、オペレーティングシステムへのコアAPIのアクセス権限を制御でき、この制御のポリシー設定はユーザーが指定できます。
-
セキュリティマネージャー(セキュリティマネージャー):コアAPIとオペレーティングシステム間のメインインターフェイスです。アクセスコントローラよりも優先度の高い典拠コントロールを実現します。
-
セキュリティパッケージ(セキュリティパッケージ):
java.securityの下のクラスと拡張パッケージの下のクラス。これにより、ユーザーは次のような新しいセキュリティ機能をアプリケーションに追加できます。 -
セキュリティプロバイダー
-
メッセージの概要
-
デジタル署名
-
暗号化
-
識別する
二、ネイティブ
- 基礎となるc、c ++言語ライブラリを呼び出す
- ネイティブ-> jni->ネイティブメソッドインターフェイス->ネイティブメソッドライブラリ
- ネイティブメソッドスタック
- 一般的にはあまり使用されませんが、ハードウェア開発に多く使用されます
- native:nativeキーワードを含むものはすべて、javaのスコープが到達できないことを示しているため、戻って基になるC言語ライブラリを呼び出してください。
- ローカルメソッドスタックに入ります
- ローカルメソッドを呼び出すローカルインターフェイスJNI(Java Native Interface)
- JNIの役割:Javaの使用を開放し、Java用のさまざまなプログラミング言語を統合すること!最初は:C、C ++
- Javaが誕生したとき、CとC ++が横行していました。足がかりを得るには、CとC ++を呼び出すプログラムが必要です。
- それは特別にメモリ領域にマークされた領域を開きました:ネイティブメソッドスタック、ネイティブメソッドを登録します
- 最終的な実行では、JNIを介してローカルメソッドライブラリにメソッドをロードします
- 例:Javaプログラムは、プリンター、管理システムを駆動し、それをマスターするだけで、エンタープライズレベルではあまり適用されません。
- プライベートネイティブvoidstart0();
- //他のインターフェースを呼び出す:Socket ... WebService〜 ... http〜
Threadクラスのstartメソッドは次のとおりです。
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0)
throw new IllegalThreadStateException();
/* Notify the group that this thread is about to be started
* so that it can be added to the group's list of threads
* and the group's unstarted count can be decremented. */
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
/* do nothing. If start0 threw a Throwable then
it will be passed up the call stack */
}
}
}
private native void start0();
実際には、Threadクラスには、宣言のみが実装されておらず、native
キーワードを使用するメソッドがあります。ネイティブに関しては、このメソッドは言語レベルではなくシステムレベル(基盤となるオペレーティングシステムまたはサードパーティのC言語)であり、Javaはそれを操作できません。ネイティブメソッドは、ネイティブメソッドスタックにロードされます。