JavaTM安全体系结构 7


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

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
<p style="color:#666666;"> <span style="font-size:14px;">本门课程重实战,将基础知识拆解到项目里,让你在项目情境里学知识。</span> </p> <p style="color:#666666;"> <span style="font-size:14px;">这样的学习方式能让你保持兴趣、充满动力,时刻知道学的东西能用在哪、能怎么用。</span> </p> <p style="color:#666666;"> <span style="font-size:14px;">平时不明白的知识点,放在项目里去理解就恍然大悟了。</span> </p> <p style="color:#666666;"> <span></span> </p> <p style="color:#666666;"> <span style="font-size:14px;"> </span> </p> <p style="color:#666666;"> <span style="color:#FF0000;font-size:14px;"><strong>一、融汇贯通</strong></span> </p> <p style="color:#666666;"> <span style="font-size:14px;">本视频采用了前后端分离的开发模式,前端使用Vue.js+Element UI实现了Web页面的呈现,后端使用Python 的Django框架实现了数据访问的接口,前端通过Axios访问后端接口获得数据。在学习完本章节后,真正理解前后端的各自承担的工作。</span> </p> <p style="color:#666666;"> <span style="font-size:14px;"> </span> </p> <p style="color:#666666;"> <span style="color:#FF0000;font-size:14px;"><strong>二、贴近实战</strong></span> </p> <p style="color:#666666;"> <span style="font-size:14px;">本系列课程为练手项目实战:学生管理系统v4.0的开发,项目包含了如下几个内容:项目的总体介绍、基本功能的演示、Vuejs的初始化、Element UI的使用、在Django中实现针对数据的增删改查的接口、在Vuejs中实现前端增删改查的调用、实现文件的上传、实现表格的分页、实现导出数据到Excel、实现通过Excel导入数据、实现针对表格的批量化操作等等,所有的功能都通过演示完成、贴近了实战</span> </p> <p style="color:#666666;"> <span style="font-size:14px;"> </span> </p> <p style="color:#666666;"> <span style="color:#FF0000;font-size:14px;"><strong>三、课程亮点</strong></span> </p> <p style="color:#666666;"> <span style="font-size:14px;">在本案例中,最大的亮点在于前后端做了分离,真正理解前后端的各自承担的工作。前端如何和后端交互</span> </p> <p style="color:#666666;"> <span style="font-size:14px;"> </span> </p> <p style="color:#666666;"> <span style="color:#FF0000;font-size:14px;"><strong>适合人群:</strong></span> </p> <p style="color:#666666;"> <span style="font-size:14px;">1、有Python语言基础、web前端基础,想要深入学习Python Web框架的朋友;</span> </p> <p style="color:#666666;"> <span style="font-size:14px;">2、有Django基础,但是想学习企业级项目实战的朋友;</span> </p> <p style="color:#666666;"> <span style="font-size:14px;">3、有MySQL数据库基础的朋友</span> </p> <p style="color:#666666;"> <span style="font-size:14px;"> </span> </p> <p style="color:#666666;"> <span style="font-size:14px;"><img alt="" src="https://img-bss.csdnimg.cn/202009070752197496.png" /><br /> </span> </p> <p style="color:#666666;"> <span style="font-size:14px;"><br /> </span> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值