summaryrefslogtreecommitdiffstats
path: root/Master/Reference Architectures and Patterns/hjp5/html/k100304.html
blob: 64cefd46dae0e79bc59680b2e060cabe4b6fc572 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
<html>
<head>
<title>
Handbuch der Java-Programmierung, 5. Auflage
</title>
</head>
<body>
<a name="startofbody"></a>
<script language="JavaScript" src="hjp4lib.js">
</script>
<script language="JavaScript">
installKbdHandler("97,#startofbody;101,#endofbody;116,cover.html;122,k100003.html;115,search.html;105,index.html;100,JDKDOCS;112,APIDOCS;104,k100302.html;106,k100303.html;107,k100305.html;108,k100307.html");
</script>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html">&nbsp;Titel&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html">&nbsp;Inhalt&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html">&nbsp;Suchen&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html">&nbsp;Index&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()">&nbsp;DOC&nbsp;</a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100302.html">&nbsp;&lt;&lt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100303.html">&nbsp;&nbsp;&lt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100305.html">&nbsp;&nbsp;&gt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100307.html">&nbsp;&gt;&gt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()">&nbsp;API&nbsp;</a>
<td align="right">Kapitel 48 - Sicherheit und Kryptographie
</table>
<hr>


<!-- Section -->
<a name="sectlevel2id048002"></a>
<h2>48.2 Sicherheitsmechanismen in Java </h2>
<hr>
<ul>
<li><a href="k100304.html#sectlevel2id048002">48.2 Sicherheitsmechanismen in Java</a>
<ul>
<li><a href="k100304.html#sectlevel3id048002001">48.2.1 Sprachsicherheit</a>
<li><a href="k100304.html#sectlevel3id048002002">48.2.2 Das Sandbox-Konzept</a>
<li><a href="k100304.html#sectlevel3id048002003">48.2.3 Ver&auml;nderungen im JDK 1.1 und 1.2</a>
</ul>
</ul>
<hr>


<!-- Section -->
<a name="sectlevel3id048002001"></a>
<h3>48.2.1 Sprachsicherheit </h3>

<p>
Java wurde von Anfang an mit h&ouml;heren Sicherheitsanspr&uuml;chen
entworfen, als dies &uuml;blicherweise bei Programmiersprachen der
Fall ist. Einer der Hauptgr&uuml;nde daf&uuml;r war der Wunsch, den
Aufruf von Applets, die aus dem Internet geladen wurden, so sicher
wie m&ouml;glich zu machen. Selbst b&ouml;sartige Applets sollten
nicht in der Lage sein, ernsthafte Angriffe auf den Computer, das
Betriebssystem oder die Ressourcen des Anwenders auszuf&uuml;hren.

<p>
Sicherheit beginnt in Java schon bei der Implementierung der Sprache.
Anders als in C oder C++ gibt es beispielsweise keine direkten Zugriffe
auf den Hauptspeicher und keine Pointerarithmetik. Das Memory-Management
arbeitet vollautomatisch. Sicherheitsl&uuml;cken, die durch (provozierte)
Speicher&uuml;berl&auml;ufe verursacht werden, sind damit nicht ohne
weiteres m&ouml;glich. 

<p>
Alle Typkonvertierungen werden zur Laufzeit gepr&uuml;ft und unerlaubte
Umwandlungen von vorne herein ausgeschlossen. Auch Zugriffe auf Array-Elemente
und Strings werden grunds&auml;tzlich auf Einhaltung der Bereichsgrenzen
gepr&uuml;ft. Zugriffe, die au&szlig;erhalb des erlaubten Bereichs
liegen, f&uuml;hren nicht zu undefiniertem Verhalten, sondern werden
definiert abgebrochen und l&ouml;sen eine Ausnahme aus. 

<p>
Beim Laden von Bytecode &uuml;ber das Netz wird dieser vor der Ausf&uuml;hrung
von einem <a name="ixa103506"><i>Bytecode-Verifier</i></a> untersucht.
Auf diese Weise wird beispielsweise sichergestellt, dass nur g&uuml;ltige
Opcodes verwendet werden, dass alle Sprunganweisungen auf den Anfang
einer Anweisung zeigen, dass alle Methoden mit korrekten Signaturen
versehen sind und dass Ausdr&uuml;cke korrekt typisiert sind. Zudem
implementiert der Klassenlader einen lokalen Namensraum, der verhindert,
dass bestehende Klassen ver&auml;ndert oder ersetzt werden k&ouml;nnen.


<!-- Section -->
<a name="sectlevel3id048002002"></a>
<h3>48.2.2 Das <a name="ixa103507">Sandbox-Konzept</a> </h3>

<p>
Traditionell wurde in Java zwischen lokalem Code und solchem, der
aus dem Netz geladen wird, bez&uuml;glich seiner Sicherheitsanforderungen
rigoros unterschieden. W&auml;hrend lokalem Code (also Applikationen
und von der Festplatte geladenen Applets) der Zugriff auf alle verf&uuml;gbaren
Ressourcen gestattet ist, d&uuml;rfen Applets, die aus dem Netz geladen
wurden, nur einen kleinen Teil davon verwenden. Sie halten sich gewisserma&szlig;en
in einem Sandkasten auf, in dem sie nur ungef&auml;hrliche Spielzeuge
verwenden und keinen ernsthaften Schaden anrichten k&ouml;nnen (daher
der Name &#187;Sandbox&#171;). 

<p>
Zu den &#187;gef&auml;hrlichen Spielzeugen&#171;, die nicht verwendet
werden d&uuml;rfen, z&auml;hlen: 
<ul>
<li>der lesende und schreibende Zugriff auf Dateien des lokalen Computers,
<li>das &Ouml;ffnen von TCP/IP-Verbindungen zu einem anderen als dem
Host, von dem das Applet geladen wurde,
<li>das Akzeptieren von TCP/IP-Verbindungen auf privilegierten Portnummern,
<li>das Lesen benutzerbezogener System-Properties wie &#187;user.name&#171;,
&#187;user.home&#171;, &#187;user.dir&#171; oder &#187;java.home&#171;,
<li>das Erzeugen eines Top-Level-Fensters ohne Warnhinweis,
<li>das Ausf&uuml;hren externer Programme,
<li>das Laden von System-Libraries,
<li>das Beenden der virtuellen Maschine.
</ul>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>

<p>
Ben&ouml;tigte ein Applet Zugriff auf diese Ressourcen, gab es im
JDK 1.0 die M&ouml;glichkeit, die zugeh&ouml;rigen Dateien auf der
lokalen Festplatte abzulegen. Denn wenn das Applet zur Ausf&uuml;hrung
nicht aus dem Netz, sondern aus den lokalen Dateien gestartet wurde,
galt es automatisch als vertrauensw&uuml;rdig und hatte Zugriff auf
alle ansonsten verbotenen Ressourcen.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
<tr>
<td><font color="#FFFFFF">&nbsp;Hinweis&nbsp;</font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>


<!-- Section -->
<a name="sectlevel3id048002003"></a>
<h3>48.2.3 Ver&auml;nderungen im JDK 1.1 und 1.2 </h3>

<p>
Mit dem JDK 1.1 wurde eine neue M&ouml;glichkeit eingef&uuml;hrt,
Applets Zugriff auf gesch&uuml;tzte Ressourcen zu erm&ouml;glichen.
Dazu m&uuml;ssen alle zum Applet geh&ouml;renden Dateien in eine jar-Datei
verpackt und mit einer digitalen Unterschrift versehen werden. Wird
der Unterzeichner auf dem ausf&uuml;hrenden Computer als vertrauensw&uuml;rdig
angesehen (indem sein &ouml;ffentlicher Schl&uuml;ssel an geeigneter
Stelle bekanntgemacht wurde), kann das Applet die Sandbox verlassen
und hat Zugriff auf alle gesch&uuml;tzten Ressourcen. 

<p>
Mit dem JDK 1.2 wurde dieses Konzept weiter verfeinert. W&auml;hrend
es im JDK 1.1 schwierig war, die Zugriffsbeschr&auml;nkungen schrittweise
zu lockern, ist das nun viel einfacher. Die Zugriffsbeschr&auml;nkungen
sind konfigurierbar und k&ouml;nnen mit Hilfe einer <a name="ixa103508"><i>Policy-Datei</i></a>
auch ohne Programm&auml;nderungen angepasst werden. Sie k&ouml;nnen
wahlweise davon abh&auml;ngig gemacht werden, von wem die Signatur
stammt, als auch davon, woher das Applet geladen wurde. Zudem wurde
die prinzipielle Unterscheidung zwischen lokalem und netzwerkbasiertem
Code aufgegeben. Obwohl die Sicherheitseinstellungen so konfiguriert
werden k&ouml;nnten, dass lokalem Code voller Zugriff auf alle Ressourcen
gew&auml;hrt wird, ist das standardm&auml;&szlig;ig nicht mehr der
Fall. 
<hr>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html">&nbsp;Titel&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html">&nbsp;Inhalt&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html">&nbsp;Suchen&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html">&nbsp;Index&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()">&nbsp;DOC&nbsp;</a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage, Addison
Wesley, Version 5.0.1
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100302.html">&nbsp;&lt;&lt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100303.html">&nbsp;&nbsp;&lt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100305.html">&nbsp;&nbsp;&gt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100307.html">&nbsp;&gt;&gt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()">&nbsp;API&nbsp;</a>
<td align="right">&copy; 1998, 2007 Guido Kr&uuml;ger &amp; Thomas
Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
</table>
<a name="endofbody"></a>
</body>
</html>