本文描述怎样通过数字签名提升java的访问权限,本文环境:
os:Ubuntu9.10 64b
Firefox:3.5.8 jre环境:JRE 1.6.0_18(64b)
测试java代码和jsp页面代码如下:
public class TestApplet extends Applet {
private static final long serialVersionUID = 1L;
private void info(String msg) {
System.out.println(msg);
}
@Override
public void init() {
super.init();
readFile("Linux".equalsIgnoreCase(System.getProperty("os.name")) ? "/etc/hostname" : "c:\\boot.ini");
}
private void readFile(final String filePath) {
info("读取文件:" + filePath);
String text = AccessController.doPrivileged(new PrivilegedAction<String>() {
@Override
public String run() {
StringBuilder buffer = new StringBuilder();
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(filePath));
while(reader.ready()) buffer.append(reader.readLine());
} catch (Exception e) {
throw new IllegalStateException(e);
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return buffer.toString();
}
});
info("读取结果为:" + text);
}
}
<%@ page language="java" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
<body>
<applet id="hh" alt="Applet" width="100" height="100"
code="org.skzr.TestApplet"
archive="skzr-applet-sign.jar"
codebase="<%=basePath %>demo" mayscript>
</applet>
</body>
</html>
因为考虑到大家一般是windows 32位环境所以:导出时使用我的linux64下仅有的32位jdk:jdk1.6.0_14-32
把以上类导出为包:skzr-applet.jar
签名:(使用同一个32位jdk:jdk1.6.0_14-32)
1 创建keystore:
/prog/java/jdk1.6.0_14-32/bin/keytool -genkey -keystore skzr-applet.keystore -alias skzr-applet
2 签名:
/prog/java/jdk1.6.0_14-32/bin/jarsigner -keystore skzr-applet.keystore skzr-applet.jar skzr-applet
把demo放入tomcat的webapps下,打开http://localhost:8080/demo/index.jsp测试
index.jsp里面使用未签名包
:skzr-applet.jar在控制台可以发现异常:
java.lang.IllegalStateException: java.security.AccessControlException: access denied (java.io.FilePermission /etc/hostname
read),因为我的是linux所以读取此文件
index.jsp里面使用已签名包
:skzr-applet-sign.jar在控制台可以发现正确读取了文件:下面是控制台输出:
读取文件:/etc/hostname
读取结果为:skzr
basic: Applet initialized
至此权限提升完毕 ^ ^
效果图:
google chrome for linux
firefox 3.5.8
至于Windows下是一样的效果
例子demo
demo.zip
其中skzr-applet.jar未签名 skzr-applet-sign.jar是签名后的包
总结:
1 jre的策略文件不需要更改的
如果真的签名了,客户端加载运行jar时会出现询问是否信任此签名的提示的!
问题在于,你如果签名了整个applet jar那么每一次重新发布都需要重新签名,比较繁琐,好的办法是,把需要提升权限的打为一个jar,一般这个jar不会经常更改的,签名此jar就可以了,其他的(如界面UI)的jar就算修改了也不需要重新签名的
2 要点:需要提升权限的类一定要放入一个jar包,签名一次即可
3 注意执行需要权限的代码需要一个特殊的方法执行,
AccessController.doPrivileged(...)如果信任此签名,将可以执行此代码
- 大小: 122.9 KB
- 大小: 125.3 KB
- 大小: 28.2 KB
分享到:
相关推荐
### 基于Java2的身份认证数字签名和SSL实现技术 #### Java2平台下的安全模型概览 在探讨Java2平台下实现身份认证、数字签名和SSL的技术细节之前,我们首先需要理解Java2平台所提供的一系列安全框架和工具。Java2...
通过以上步骤,我们可以为jar包制作数字签名,这不仅可以增加程序的安全性,还可以提升用户对程序的信任度,特别是当程序需要访问客户端本地资源时。此外,数字签名也有助于保护开发者和用户的权益,避免恶意篡改...
1. **数字签名**:数字签名是确保代码完整性和来源可信的一种方法。使用Java的`jarsigner`工具,我们可以对包含Applet的JAR文件进行签名。签名过程会使用开发者私钥对JAR文件的每个条目计算哈希值,并将结果用私钥...
8. **权限管理**:如果涉及到数字签名,可能需要请求访问证书的权限,这需要在AndroidManifest.xml中添加相应的权限声明。 通过以上步骤,我们可以创建一个能够实现数字签名功能的自定义控件。在实际开发中,开发者...
2. **证书签名**:Java应用通常需要经过数字签名才能获取高级权限。修改权限文件可能绕过这一过程,但未经签名的应用可能存在安全隐患。 3. **风险与安全**:增加权限意味着增加风险。确保只给予信任的来源和已知...
应用签名是开发过程中的一个重要环节,它涉及到一个数字证书,这个证书用于验证应用的来源和身份。在Android系统中,每个 APK 文件(Android 应用的打包格式)都需要一个签名,以便系统能够验证其来源和权限。签名...
Java 数字签名、数字证书的相关实例。 关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据...
9. **数字签名**: 数字签名是加密领域的重要概念,Java提供JSR 105(XML数字签名)和java.security包来实现数字签名和验证,涉及非对称加密算法如RSA。 这些例子涵盖了Java的基础到进阶内容,不仅有助于巩固基础...
JCE包括各种加密算法,如AES、RSA、DES等,以及密钥管理、数字签名和消息摘要等功能。JCE_Learn可能是一个关于学习JCE的资料包,其中可能包含示例代码、教程文档或者加密解密工具。 在实际应用中,开发者可能需要...
6. **权限提升**:只有经过系统签名的APK才能获取到`android.system.app`或`android.uid.system`权限,这意味着应用可以运行在系统进程中,享有更高级别的操作权限。但这通常仅适用于系统应用或经过官方认证的更新。...
1. **JCE概述**:JCE是Java平台的加密扩展,提供了各种加密算法(如DES、3DES、AES、RSA等)和密码服务,包括加密、解密、消息认证码(MAC)、数字签名等。 2. **默认密钥长度限制**:在某些版本的JCE中,为了遵循...
在Java中,数字签名用于验证代码的来源和完整性,防止代码被篡改。Java KeyStore (JKS) 用于存储证书和私钥,而KeyManager和TrustManager则在证书验证过程中起关键作用。 八、安全编码实践 遵循安全编码规范,如...
签名后的Applet可以向用户请求提升权限,用户确认后,Applet将获得更多的系统访问权。 3. **本地文件操作** - **受限操作**:未经签名的Applet无法直接读写本地文件,这是为了保护用户的隐私和系统安全。 - **...
这一过程涉及数字签名,它是使用私钥进行加密的一种数据,与之对应的公钥可以用来解密并验证签名。 1. **什么是JAR签名?** JAR签名是一个将数字签名嵌入到JAR文件中的过程。它提供了一种机制,使得用户或者Java...
其次,Java安全框架包括了证书和数字签名,用于验证代码的来源和完整性。这使得开发者可以确保他们下载和运行的代码来自可信任的源,并且未被篡改。证书用于标识代码发布者的身份,而数字签名则保证了代码在传输过程...
3. **证书和数字签名**:Java使用X.509证书来验证代码或数据的来源和完整性。数字签名用于保证代码的完整性和作者身份。 4. **Java信任存储库**:Keystore是Java中的一个关键组件,用于存储用户的私钥、公钥和证书...
Java支持代码签名,通过数字签名确保代码的完整性和来源。证书是公开密钥的载体,用于验证代码签名的可信度。 7. **沙箱机制** 沙箱是Java安全模型的基础,它限制了未经认证的代码的行为。沙箱内的代码只能执行在...
Java 数字签名、数字证书的相关实例。 关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据...
6. **密钥管理**:Java Cryptography Extension (JCE)提供了加密、解密、数字签名和密钥管理等功能。开发者可以使用KeyPairGenerator和KeyPair类生成公钥和私钥对,用于数据加密和身份验证。 7. **消息摘要与数字...