890.md 2.4 KB
Newer Older
W
init  
wizardforcel 已提交
1 2 3 4
# 在扩展中密封包

> 原文: [https://docs.oracle.com/javase/tutorial/ext/security/sealing.html](https://docs.oracle.com/javase/tutorial/ext/security/sealing.html)

W
wizardforcel 已提交
5
您可以选择*密封扩展 JAR 文件中的*包作为额外的安全措施。如果密封包,则该包中定义的所有类必须来自单个 JAR 文件。
W
init  
wizardforcel 已提交
6 7 8

如果没有密封,“敌对”程序可以创建一个类并将其定义为您的一个扩展包的成员。然后恶意软件可以免费访问扩展包的受包保护的成员。

W
wizardforcel 已提交
9
密封包的扩展与密封任何 JAR 包装的类没有什么不同。要密封扩展包,必须将`密封`标头添加到包含扩展名的 JAR 文件的清单中。您可以通过将`密封`标头与软件包的`名称`标头相关联来密封单个软件包。与存档中的单个包无关的`密封`标头表示所有包都已密封。这种“全局”`密封`标头被与各个包相关联的任何`密封`标头覆盖。与`密封`标题相关的值是`true``false`
W
init  
wizardforcel 已提交
10 11 12 13 14

## 例子

我们来看一些示例清单文件。对于这些示例,假设 JAR 文件包含以下这些包:

W
wizardforcel 已提交
15
```java
W
init  
wizardforcel 已提交
16 17 18 19 20 21 22 23 24
com/myCompany/package_1/
com/myCompany/package_2/
com/myCompany/package_3/
com/myCompany/package_4/

```

假设您要密封所有包裹。您可以通过简单地将清单级`密封`标头添加到清单中来实现,如下所示:

W
wizardforcel 已提交
25
```java
W
init  
wizardforcel 已提交
26 27 28 29 30 31 32
Manifest-Version: 1.0
Sealed: true

```

具有此清单的任何 JAR 文件中的所有包都将被密封。

W
wizardforcel 已提交
33
如果你只想密封`com.myCompany.package_3` ,你可以使用这个清单:
W
init  
wizardforcel 已提交
34

W
wizardforcel 已提交
35
```java
W
init  
wizardforcel 已提交
36 37 38 39 40 41 42
Manifest-Version: 1.0

Name: com/myCompany/package_3/
Sealed: true

```

W
wizardforcel 已提交
43
在这个例子中,唯一的`密封`标题是与包`com.myCompany.package_3``名称`标题相关联的标题,因此只有该包被密封。 (`密封`标题与`名称`标题相关联,因为它们之间没有空行。)
W
init  
wizardforcel 已提交
44

W
wizardforcel 已提交
45
最后一个例子,假设您要密封除`com.myCompany.package_2`之外的所有包*。你可以使用这样的清单来完成它:_
W
init  
wizardforcel 已提交
46

W
wizardforcel 已提交
47
```java
W
init  
wizardforcel 已提交
48 49 50 51 52 53 54 55
Manifest-Version: 1.0
Sealed: true

Name: com/myCompany/package_2/
Sealed: false

```

W
wizardforcel 已提交
56
在此示例中,存档级`Sealed:true`标头指示要密封 JAR 文件中的所有包。但是,清单还有一个`Sealed:false`标头与软件包`com.myCompany.package_2`相关联,并且该标头覆盖该软件包的存档级密封。因此,除了`com.myCompany.package_2`之外,此清单将导致密封所有包裹。