文章目录

  • Java安全的沙箱机制
  • Applet运行授权实例(Policy)
    • 沙箱阻止Applet获取系统信息
    • appletviewer 运行方式使用Policy文件对Applet进行授权
    • 浏览器中运行带有获取系统信息的Applet
  • Applet数字签名步骤及示例
  • AccessController.doPrivileged提升代码权限
  • 其他参考

关于Applet的介绍和运行, 参考上一篇。
Applet的数字签名之1——Applet及其运行
本篇介绍Applet的数字签名和授权。

Java安全的沙箱机制

通过浏览器运行Applet的基本原理就是下载服务端的Applet jar到本地,由本地的JVM来执行。对于上一篇的实例,只是简单的打印“Hello World”字符串

  • 在较老版本浏览器中可以直接运行
  • 在新版本的浏览器中, Chrome直接不可以运行, IE 11需要在浏览器和控制台做一些设定才可以运行。

上一个实例只是简单的绘制字符串,如果涉及安全性更高的操作, 比如操作本地文件、读取本地机器的系统信息等, Java虚拟机则提供了更为严格的沙箱(Sandbox)保护机制。也就是JVM默认会认为下载的.jar档是不可信任的,会对其行为进行一定的限制,这些行为包括:

  1. 读写客户端机器的文件
  2. 与其他服务器建立网络连接
  3. 事件捕获
  4. 读取系统信息
  5. …等

但是如果Applet确实需要执行这些操作该怎么办呢? 在本地修改相关的权限设置自然是可以, 但规范的做法就是进行数字签名,发布证书, 在本地浏览器导入证书。

Applet运行授权实例(Policy)

接下来就以实例来说明Applet的授权方式。

沙箱阻止Applet获取系统信息

JDK版本: 1.8
将上一篇实例代码中的输出“Hello World”换成输出客户端机器的操作系统的版本。
g.drawString("Hello World", 5, 35);
修改為==》
g.drawString(System.getenv("OS"), 5, 35);

分别执行编译、打包产生myapplet.jar档。

javac cn\osxm\jcodef\applet\MyApplet.java
jar cvf myapplet.jar cn\osxm\jcodef\applet\MyApplet.class

使用appletviewer查看myapplet.html执行的Applet效果,命令行输入 appletviewer myapplet.html ,运行的画面如下:

以上运行的结果是:

  1. 客户端机器的操作系统不能显示, Applet上是空白的。
  2. 命令行控制台报访问控制的异常,没有获取操作系统(getenv.OS)的运行时权限。异常信息如下:
Exception in thread "AWT-EventQueue-1" java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "getenv.OS")at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)at java.security.AccessController.checkPermission(AccessController.java:884)at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)at java.lang.System.getenv(System.java:894)at cn.osxm.jcodef.applet.MyApplet.paint(MyApplet.java:30)at sun.awt.RepaintArea.paintComponent(RepaintArea.java:264)at sun.awt.RepaintArea.paint(RepaintArea.java:240)

appletviewer 运行方式使用Policy文件对Applet进行授权

以上的示例演示了沙箱阻止Applet读取本地的系统信息,Java提供了使用Policy文件指定运行的安全策略,通过安全策略可以授权Applet有相关的权限。appletviewer运行可以通过-J-Djava.security.policy=文件名 的方式来指定运行的安全策略。细节步骤如下:

  1. 创建Policy文件
    在 jar的目录中新建 java.policy 文件(文件名没有限制,但JRE的目录lib\security使用的文件名就是java.policy ),文件内容如下:
grant {permission java.security.AllPermission;
};

java.policy内容需要遵循一定的格式, 这里简单起见,使用最简单的设置,上面的配置是开放所有权限, 也可以细部进行设置。

2) 使用java.policy文件作为安全策略文件运行applet

appletviewer -J-Djava.security.policy=java.policy myapplet.html

运行结果如下:

一切又恢复正常了。附上以上的文件和目录结构:

浏览器中运行带有获取系统信息的Applet

以上指定安全策略文件状况下,使用appletviewer运行包含获取系统信息的Applet。如果是在浏览器中直接打开包含applet的html的文件,效果会是怎样的呢?

在IE11版本下,和上一篇一样,将此html加到Java控制台的安全的例外站点中(IE 8及旧版不需要)。加入后的效果如下:

加入以上设置之后,打开浏览器之后, 和没有加安全策略使用appletviewer的方式类似, 什么也不显示,如果打开控制台,控制台会报和上面类似的错误,页面效果如下图。

和appletviewer添加安全策略文件的方式类似,虽然可以通过修改客户端的Java安全策略允许执行, 但对浏览器的每个客户端机器进行修改是不太现实(在企业内部是可以通过推送的方式达成)。有另外一种方式可以解决这个问题,就是数字签名。对jar文件进行签名,浏览器端访问时信任证书。

Applet数字签名步骤及示例

对Applet的 jar文件进行数字签名的步骤基本包括:产生密钥库文件(包括公私钥),导出数字证书和对jar档进行签名。该jar文件放入服务端,浏览器访问信任证书后执行。具体步骤:

  1. 产生密钥库文件
keytool -genkey -keystore myapplet.store -alias myapplet

执行后需要输密码以及名字、地区等信息。
以上也可以通过一条命令执行
执行完成会生成 myapplet.store 这个文件。
这里设定密码是 123456

  1. 导出数字证书
keytool -export -keystore myapplet.store -alias myapplet -file myapplet.cer

导出证书需要输入上面设定的密码
执行完成,生成证书文件myapplet.cer

  1. 对jar文件进行签名
jarsigner -keystore myapplet.store myapplet.jar myapplet

这里需要输入keystore的密码。
以上命令执行完成, 会在jar文件中加入
MYAPPLET.SF和MYAPPLET.DSA 两个文件。
执行过程的画面如下:

4. 将签名后的jar、数字证书和密钥库文件一并放入服务端的某个目录。

需要特别注意的是:
浏览器客户端的JRE和浏览器的Java的版本不能高于1.6.0_20, 高于这个版本就无法执行。也就在JRE版本高于1.6.0_20客户端机器中(目前使用的多为JRE8或者 11版本,远远高于1.6.0_20),签名是无效的。
但从这个机制中,可以看到签名的公私钥的一些端倪。

AccessController.doPrivileged提升代码权限

虽然签名在新的JRE下不生效,但通过AccessController.doPrivileged提升代码权限的方式也是解决此问题的思路之一。思路如下:

public class MyApplet extends Applet {/*** */private static final long serialVersionUID = 1L;@SuppressWarnings({ "unchecked", "rawtypes" })@Overridepublic void paint(Graphics g) {g.setColor(Color.RED);//String s = System.getenv("OS");String os = (String) AccessController.doPrivileged(new PrivilegedAction() {public Object run() {String str = System.getenv("OS");return str;}});g.drawString(os, 5, 35);}
}

其他参考

从版本 42(2015 年 4 月发行)开始,Chrome 禁用了浏览器支持插件的标准方式

————————————————————————

说透Applet的数字签名之2——数字签名相关推荐

  1. 什么是数字签名?(数字签名与信息摘要又有什么关系?)

    在上一篇博文[什么是信息摘要]结尾我给出了一个结论:"看来单纯的信息摘要技术还不能保证信息的完整性,即不能确定信息是否被篡改",由此并引出了"数字签名"的概念. ...

  2. 说透Applet的数字签名之1——Applet及其运行

    文章目录 Applet介绍 rt.jar是什么 Applet的极简实例 Applet运行方式 开发环境:Eclipse运行 正式环境: 打包运行 命令行打包 Applet打包档的运行 问题解决 在Ec ...

  3. 给控件做数字签名之三:进行数字签名

    双击工具包里的signcode.exe 文中提到的数字签名工具包,请在此处下载 http://files.cnblogs.com/babyt/SignTool.rar   至此,数字签名完成 在DOS ...

  4. dss数字签名技术java_DSS数字签名标准

    DSS数字签名标准 签名过程: graph TD; id2 -.Signature.-> id12 subgraph Signature Generation; id0(Message/Data ...

  5. 密码学之ElGamal 数字签名 密钥产生 数字签名 验证 python实现

    ElGamal 数字签名 实验目的 通过实验了解数字签名的过程(签名过程和认证过程),掌握 ElGamal签名方案. 实验原理 ElGamal 数字签名的实现过程 1密钥产生:Alice 要对一个消息 ...

  6. 用python3实现MD5withRSA数字签名的验证

    在某次安全研究中.需要手工验证下某重要文件MD5withRSA的数字签名是否正确.于是写了个脚本.现记录下来,供大家学习讨论. 1. 数字签名基础知识 数字签名: 一旦选择足够安全的散列算法, 那么就 ...

  7. 密码学(一)—— 背景、常用的密码算法简介,单向散列简介、数字签名简介

    背景 密码,最初的目的就是用于对信息的加密,计算机领域的密码技术种类繁多,但随着密码学的运用,密码还用于身份认证,防止否认等功能上.最基本的,是信息加密解密分为对称加密和非对称加密,这两者的区别在于是 ...

  8. 白话hash和数字签名,保证你看得懂

    链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载. 摘要:最近有朋友在后台问为啥最近老介绍hash相关文章,其实hash算法在信息安全中非常重要,尤其是作为数字签名 ...

  9. 数字签名与数字证书是什么

    目录 概述 数字签名 数字签名是什么 数字签名的大概流程 发件人 收件人 签名的安全风险 数字证书 为什么需要数字证书 数字证书是什么 数字证书的应用场景 使用流程 概述 了解数字签名和数字证书之前, ...

最新文章

  1. js vm报错_uni-app v3版本更新常见问题排查
  2. mxnet 显存配置,cpu过高配置
  3. Android报“android.content.res.Resources$NotFoundException: String resource ID #0x2”错误
  4. 桩筏有限元中的弹性板计算_采用PKPM系列JCCAD软件桩筏筏板有限元方法计算的模型参数 -...
  5. float js 正则 验证_爬虫篇 | 200 行代码实现一个滑动验证码
  6. 很好的一款监控web请求的工具,fiddler.
  7. 图像语义分割 —利用Deeplab v3+训练VOC2012数据集
  8. python 获取当前目录,上级目录,上上级目录
  9. Maria数据库怎么复制到mysql_mysql/mariadb主从复制
  10. 富士通Fujitsu DPK1180K 打印机驱动
  11. n个水手分椰子问题 (递推)
  12. html那个代码看不到内容,IE浏览器 查看不了HTML源代码的问题解决!
  13. android调试更换模拟器,Android建立模拟器进行调试(示例代码)
  14. 【机器学习 - 8】:随机梯度下降法
  15. 使用 Vue 和 Electron 开发一款简单的 Markdown 编辑器
  16. 打破日韩垄断,研发国产8K传感器芯片的长光辰芯是什么来头?
  17. 火灾自动报警系统施工及验收规范
  18. 【大话三国】揭秘蜀汉五虎将的真相
  19. 微处理器件介绍:CPU/微控制器、DSP、FPGA、GPU
  20. 支付宝电脑网站支付(新版)

热门文章

  1. pyinstaller 打包exe可执行文件
  2. 前端开发工具之jQuery
  3. Java -- AWT 画图,图像处理
  4. Unix/Linux 中的 shell 机制
  5. org.apache.axis.ConfigurationException: No service named ldapOperate is available解决方法
  6. Tomcat 异常关闭排查
  7. Hbase CallQueueTooBigException 异常处理
  8. webservice项目部署部署到weblogic报错之解决方案
  9. 【报告分享】2021中国数据智能产业发展研究报告.pdf(附下载链接)
  10. 【白皮书分享】2020用户生命周期运营白皮书2.0.pdf(附下载链接)