JavaTM安全体系结构(JDK1.2)
7. GuardedObject和SignedObject
7.1 java.security.GuardedObject和java.security.Guard
回想一下,当访问控制决策必须在不同的上下文中作出时,AccessControlContext类是非常有用的。这里有另外一种情况:资源的供应者与资源的消费者不在同一个线程,并且消费者线程不能为供应者线程提供访问控制上下文信息(因为上下文是安全敏感的;或上下文太大,不能传递;或由于其它原因)。对这种情况,我们提供了一个被称为GuardedObject的类,来保护对这个资源的访问。见下图说明:
基本的想法是:资源的供应者可创建一个代表这个资源的对象,再创建一个将资源对象嵌套在内的GuardedObject, 然后,将GuardedObject提供给消费者。在创建GuardedObject时,供应者还要指定一个Guard对象;这样,如果某些在这个Guard内部的(安全)检查令人满意的话,任何人(包括消费者)则只能获得资源对象。
Guard是一个界面,所以任何对象可选择成为一个Guard。这个界面上的唯一方法被称为checkGuard。它提取一个Object变量,并执行一定的(安全)检查。java.security中的Permission类实现这个Guard界面。
例如,假设一个系统线程被要求为阅读访问打开一个文件/a/b/c.txt,但是系统线程不知道请求者是谁或这个请求是在什么情况下被做出的。因此,正确的访问控制决策不能在服务器端做出。系统线程可使用GuardedObject来延迟访问控制检查。如下所示:
FileInputStream f = new FileInputStream ("/a/b/c.txt");
FilePermission p = new FilePermission ("/a/b/c.txt", "read");
GuardedObject g = new GuardedObject (f, p);
现在,系统线程可将g传递给消费者线程。消费者线程要获得文件输入流,必须调用:
FileInputStream fis = (FileInputStream) g.getObject();
这个方法结果调用在Guard对象p上的checkGuard方法,并且由于p是一个许可,所以它的checkGuard方法事实上是:
SecurityManager sm = System.getSecurityManager ();
if (sm ! = null) sm.checkPermission (this);
这可以保证一个真正的访问控制检查发生在消费者上下文内。事实上,你可以在许多情况下,替换常用哈希表和访问控制列表,并直接存储GuardedObject的哈希表。
这个GuardedObject和Guard的基本模式是非常通用的,我们期望通过继承这个基本的GuardedObject和Guard的类,开发人员可以轻松地获得极强大的访问控制工具。例如:用一个适当的方法的Guard可获得每个方法的调用,并且一个Guard可检查该日的时间、调用者的签字或其它证明、或任何其它相关的信息。
注意:由于GuardedObject返回一个Object,所以某些键入信息会丢失。要在合作方之间使用GuardedObject,接受方应该了解希望获得对象的什么类型(以及转换类型)。事实上,我们预见GuardedObject的多数用法涉及创建子类(即形成一个GuardedFileInputStream类),从而封装键入信息,类型转换也可在子类中相应地进行。
7.2 java.security.SignedObject
这个类是其它安全要素的基本积木块。SignedObject包含另一个可序列化的对象,(将)签字的对象和它的数字签字。如果数字签字不是空,它将包含一个有效的已签字的对象的数字签字。这可以用下图表示:
底层签字算法是通过一个被当作sign方法调用来设置的,该方法的参数是Signature对象,算法可以是如下算法之一:NIST标准DSA、使用DSA和SHA-1。与数字签字一样,算法是用通常方式说明的,如 "SHA/DSA"。
已签字的对象是一个初始对象的"深度拷贝"(以序列化的形式),一旦拷贝完成,初始对象的操作对该拷贝不产生副作用,一个已签字的对象是永恒不变的。
创建一个已签字对象的典型事例如下:
Signature signingEngine = Signature.getInstance(algorithm,provider);
SignedObject so = new SignedObject(myobject, signingKey, signingEngine);
一个典型的校验例子如下,so是一个被收到的SignedObject对象。如果已知算法的名称,则这里的第一行可被忽略:
String algorithm = so.getAlgorithm();
Signature verificationEngine = Signature.getInstance(algorithm, provider);
so.verify(verificationEngine);
SignedObject的潜在应用包括:
它可作为一个不可伪造的鉴别令牌在任意Java应用环境内使用:它可任意传递,而不必担心该令牌在没有被检测到的情况下而被恶意更改;
它可被用来为Java运行时以外的存储器签署并序列化数据/对象(例如,在磁盘上存储访问控制的关键数据);
嵌套的SignedObjects可被用来构造一个签字的逻辑顺序,就象认证和授权的链一样。
我们期望这个类在将来可以创建子类,以允许在相同的签字对象上有多个签字。那样,在这个基础类上的现存方法调用将在语意上是全兼容的。特别是如果只有一个签字,则任意get方法将返回单独值;如果有多个签字,则将从签字集中返回一个任意值。
..........|Next|..........
欢迎与我们联系:webmaster@prc.sun.com
版权所有 1997-1998 Sun(中国)公司,北京南礼士路66号建威大厦16层
All rights reserved.Legal Terms