代码签名和认证
Java安全模型很重要的一点就是它能支持认证。认证可以使用户确认,由某些团体担保的一些class文件是值得信任的,并且这些class文件在到达用户虚拟机的途中没有被改变。
要对一段代码作担保或者签名,必须首先生成一个公钥/私钥对。用户应该保管那把私钥而把公钥公开。至少,应该把公钥给那些要在你的签名上建立安全策略的人。一旦拥有了一个公钥/私钥对,就必须将要签名的class文件和其他文件放到一个JAR文件中,然后使用一个工具(例如版本1.2 SDK中的jarsigner)对整个JAR文件签名。这个签名工具将首先对JAR文件的内容进行单向散列计算,以产生一个散列。然后这个工具将用私钥对这个散列进行签名,并且将经过签名后的散列加到JAR文件的末尾。这个签名后的散列代表了你对这个JAR文件内容的数字签名。当你发布这个包含签名散列的JAR文件时,那些持有你的公钥的人将对JAR文件验证两件事:这个JAR文件确实是你签名的,并且在你签名后这个JAR文件没有做过任何改动。
散列也被称为消息文摘,它相当于一种输入“指纹”。
单向散列算法是从大量数据(输入)中产生少量数据(消息摘要或者散列),所以不同的输入可能产生相同的散列。单向散列算法倾向于充分随机地分布产生相同散列的输入,从而使产生相同散列值的概率主要依赖于散列的大小。
(注:关于数字签名、数字证书、非对称加密算法、证书管理工具的一些基础知识,原来的一篇文章简单整理过,见小蚂蚁-CAS单点登录系列(1)-基础知识)
要认证一个已签名的JAR文件,接收者必须用公钥对签名散列进行解密,得到的结果应该和从JAR文件计算而得到的散列值相等。
一个代码签名示例
1)测试环境
Windows 7 + JDK 1.6
2)示例代码
一个接口两个类:
package com.artima.security.doer; public interface Doer { void doYourThing(); }
package com.artima.security.friend; import com.artima.security.doer.Doer; import java.security.AccessController; import java.security.PrivilegedAction; public class Friend implements Doer { private Doer next; private boolean direct; public Friend(Doer next, boolean direct) { this.next = next; this.direct = direct; } public void doYourThing() { if (direct) { next.doYourThing(); } else { AccessController.doPrivileged( new PrivilegedAction() { public Object run() { next.doYourThing(); return null; } } ); } } }
package com.artima.security.stranger; import com.artima.security.doer.Doer; import java.security.AccessController; import java.security.PrivilegedAction; public class Stranger implements Doer { private Doer next; private boolean direct; public Stranger(Doer next, boolean direct) { this.next = next; this.direct = direct; } public void doYourThing() { if (direct) { next.doYourThing(); } else { AccessController.doPrivileged( new PrivilegedAction() { public Object run() { next.doYourThing(); return null; } } ); } } }
附件附带了源代码:samples.zip
3)编译java文件
javac com\artima\security\doer\Doer.java
javac com\artima\security\friend\Friend.java
javac com\artima\security\stranger\Stranger.java
4)打包class文件
jar cvf friend.jar com\artima\security\friend\*.class
jar cvf stranger.jar com\artima\security\stranger\*.class
5)删除class文件
删除class文件,以便Java虚拟机在运行后面的访问控制的例子时无法找到它:
del com\artima\security\friend\*.class
del com\artima\security\stranger\*.class
6)生成密钥对并进行存储
6.1)生成friend的密钥对
命令:keytool -genkey -alias friend -keypass friend4life -validity 10000 -keystore ijvmkeys
keystore密码:ijvm2ed
其他参数:
java
sun
sun
gz
gd
cn
y
(注:其中friend为密钥别名,friend的主密码为friend4life,有效期为10000天,keystore文件名为ijvmkeys。)
6.2)生成stranger的密钥对
命令:keytool -genkey -alias stranger -keypass stranger4life -validity 10000 -keystore ijvmkeys -storepass ijvm2ed
参数:
java
sun
sun
gz
gd
cn
y
(注:storepass直接指明了1)中设置的keystore密码)
7)现在keystore文件ijvmkeys包含了friend和stranger的密钥对,下面对JAR文件进行签名
jarsigner -keystore ijvmkeys -storepass ijvm2ed -keypass friend4life friend.jar friend
jarsigner -keystore ijvmkeys -storepass ijvm2ed -keypass stranger4life stranger.jar stranger
好了,为了对两个JAR进行签名,必须做上面这许多事。
(转载请注明来源:http://zhanjia.iteye.com/blog/1842242)
相关推荐
NULL 博文链接:https://zhanjia.iteye.com/blog/1842733
深入理解Java虚拟机学习笔记借鉴.pdf
java虚拟机源码学习 Understanding the JVM 深入理解Java虚拟机第三版 (周志明)源码及学习笔记
的第三部分。第四部分对应于原书的第四部分,程序编译与代码优化,不过仅对 Java 的运行期优化,也就是 JIT 时进行的优化进行了总结,编译器优化部分尚未进行深入研究。 阅读方法: 本 repo 的 README.md 从头读到尾...
本repository为《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)》阅读笔记,因为第一章主要讲的是Java的发展历史,这里就不做笔记,直接从第2章的"Java内存区域与内存溢出异常"讲起。 第二部分 自动内存...
深入理解java虚拟机:jvm高级特性与最佳实践源码现代操作系统,第 4 版 作者:Andrew S. Tanenbaum, Herbert Bos ** Notes by Henry Cooksley ** 1 介绍 操作系统、外壳、GUI、图形用户界面、内核模式、主管模式、...
深入java虚拟机 源码 Catalog 奔跑吧 ANSIBLE 分布式服务架构.原理、设计与实战 大型网站技术架构:核心原理与案例分析 DOCKER技术入门与实战 Docker容器与容器云第2版 NET_CLR_via_C#(第4版) elk-stack-guide-cn Go...
深入java虚拟机光盘资源Ubin 计划第 2 阶段 - 法定人数 该存储库包含 Project Ubin Phase 2 中 Quorum 原型的源代码和测试脚本。 Ubin Phase 2 是一个协作设计和快速原型设计项目,探索使用分布式账本技术 (DLT) ...
JAVA--达内培训笔记】 1、Java之父Golsling 1995年5月23日 Java诞生 1998年12月 1.2版本 Java2 J2SE J2EE J2ME 2004年12月 1.5版本(5.0) Java JavaSE JavaEE JavaME 2、Java SE --- Java标准平台 Java EE -...
Notebook 欢迎你来到我的笔记本 本github中写的都是笔记记录,其中内容大部分来源于网上优秀博文或者经典书籍,因此不推荐阅读我的笔记,只是我个人使用为主...第3章:抽象队列同步器 第4章:并发与集合总结 第5章:Has
JVM内在结构的图解文档,visio格式 1.编译过程 2.内存结构 3.对象与类的结构 4.类结构信息 5.对象建立过程 6.收集器 7.方法调用 8.垃圾回收 9.JIT 10.指令 11.线程
018最新JAVA架构师培训视频教程(附笔记、源码、视频教程 全网盘链接...三、JAVA虚拟机 四、Linux部分 五、数据库设计与优化 六、互联网中间件架构设计 七、互联网框架应用 八、互联网分布式综合项目实战(转载)
Java第三方库 Guava Joda-time Log4j Java 8 容器 Tomcat 1、Java 语言基础和JDK源码阅读 Java 语言基础 编号 名称 1 基本 2 运算符 3 数据类型 4 类 对象 接口 5 数组 6 枚举 7 异常处理 8 注解 9 范型 其他 编号 ...
JVM的重要性不言而喻,这个是学习JVM是看视频和读《深入理解JVM》时做的一些笔记,用于复习参考。 读书笔记 第2章:java内存模型和内存溢出异常 1.运行时数据区域 1.程序计数器:线程私有 2.java虚拟机栈:线程私有...
语言相关的API,第三方库和计算机基础理论等知识的学习和整理 更多 : | | 目录 资源 详细目录 Java语言和JDK源码 Java语言的基础理论知识 并发编程 Java并发编程相关的内容,并发包源码分析等 集合框架 Java集合框架...
java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap, ExtClassLoader,AppClassLoader类加载器也是一个java类,因此类加载器也需要被加载,所以必须有第一个类加载...
高级java笔试题 puppet-example 这是一个puppet示范项目,...inifile:ini配置文件操作工具(第三方开源) iptables:iptables规则配置工具(第三方开源) java:openjdk keepalived:高可用方案,IP共享(使用VRRP协议
第三部分:数据结果可视化 大作业内容介绍: 主要课题:针对北京2013-2017五年内污染物浓度数据进行大数据处理以及结果可视化 包括:数据清洗后的数据集、大作业报告(报告内附有源码)、结果可视化图片/HTML
c#学习笔记(1) 51099在线学习网发布 文章来源:网络收集 发布时间:2006-05-25 字体: [大 中 小] 51099在线学习网 http://www.51099.com 1, 结构(struct) 与 类(class) [attributes] [modifiers] struct ...