Java开发网 Java开发网
注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

您没有登录

» Java开发网 » Java Security  

按打印兼容模式打印这个话题 打印话题    把这个话题寄给朋友 寄给朋友    该主题的所有更新都将Email到你的邮箱 订阅主题
flat modethreaded modego to previous topicgo to next topicgo to back
作者 Java安全漫谈
feiggle





发贴: 70
积分: 20
于 2003-04-18 15:55 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
在学习java语言的过程中。看了很多安全的相关的资料,得到版主menzy、floater的不少帮助,觉得里面有不少东西,整理一下,就算总结一下吧,分享给大家,希望有用。

1、关于Appelt 权限控制的简介 :
Java平台通过安全管理器(security manager)来防止系统遭到攻击。现在的JDK 系统是通过启动安全管理器来进行资源访问控制的。现在的浏览器中都装有安全管理器,Applet 的一举一动都受到管理器的控制下,与JDK 1.2 以上版本平台兼容的系统需要通过 policy 文件来授权。
在policy 文件中定义了来自某地(URL)的某人签名的代码的访问权限控制 ,在JDK 1.2 以上版本中,可以通过工具 policytool 来生成、编辑 policy 文件.。

2、关于应用程序权限控制的简介 :

如果没有安全管理器控制的话,应用程序是完全自由的(此时安全管理器是不会自动启动的)。通过用命令行 -Djava.security.manager 来运行程序,就和下载的Applet 一样受到了安全管理器的控制。Windows:的缺省的policy 控制文件是 java.home\lib\security\java.policy

3、几个重要的概念
为了保证代码和文挡的安全性,需要签名、证书、和密钥管理方面有支持;

A) 数字签名
数字签名的思路大致是这样的:
a、用Keytool 或 API 生成的私钥给文档或代码签名
b、将文档(代码) 和签名,带有公钥的证书发给接收者
c、接收者通过公钥来确认接收到的文件的完整性
d、接收者通过证书或确定情况来确认发送者身份

B)证书
证书包括了以下几个部分::
a、公钥
b、实体标识 ; 可能包括实体名、实体公司名、所在城市、国家等等
c、数字签名 : 分发这份证书的实体对证书签名
d、分发这份证书实体的标识
要确认某份证书是可信的,只需确认签发证书的实体是可信的[ 其公钥是可信的] 。实际中可能第一次的出的公钥存在于另一个人的签名文档中,这样就需要建立一个信任链,看最终的公钥是否是可信任的。成功地建立了信任链以后,就可以计算出该证书的指纹(fingerprintMoon )-- 一般是证书的一个 Hash 码 ;接受者可以打电话给证书发放者比较两处的指纹是否相同,以确认自己受到的证书是他发的,并且中途没有被修改过。接下来需要确认发送者的身份,如果发送者是自己信任的( 已确认并保存了其共钥) ,确认完成。否则就需要第三方( CA )来得到证书。首先发一个自签的证书给 CA ,CA 通过检查证书信息(比如身份证编码什么的)来确证,然后生成一个自签名的证明发送者身份的证书。任何信任这个 CA 的人都相信这份证书上公钥和实体的对应。
系统将所有信任的证书存储起来( Keystore ), 以后收到了带签名的代码或文档,就可以通过jarsigner ,系统 API 来确认;如果在安全策略文件中说明了信任某实体签名的代码,在下载后系统会自动确认。
如果是将签名后的代码或文档发送给其他人,需要将自己的证书捎带上去以便对方确认。keytool – export 或 API 函数可以从 KeyStore 中将证书附加在被签名的文档中。如果是用 jarsigner ,他自动将证书带上。
  
C)密钥管理
通过一个带密码的数据库来存储自己的私钥及信任的公钥( 称为 Keystore );它包括了两类入口 : 信任证书和证书密钥对(自己的私钥和证书) [ 与 PGP 类似 ],他们都可以通过别名来标识。一个 KeyStore 的所有者可以通过不同的别名来标记不同的 证书- 私钥对而用于不同的场合。

4、通过 java 工具来实现基本流程
工具简单介绍:
密钥和证书管理工具( Keytools )
它主要是负责 公 – 私钥对 、向C A 发证书申请、接受 CA 的回复、记录信任的公钥—实体 对应表, 维护密钥库 ( keystore ) , 命令基本形式是:
keytool command options
主要有如下几种命令:
  - certreq – 产生一个证书签名请求(Generate a Certificate Signing Request ,CSR)给 CA , 由它来认证自己的证书。
   -delete – 删除对应的密钥库的记录
  - export 将公钥证书输出到某个文件
  - genkey. 在密钥库中存入私钥- 公钥对, 后者保存在一个自签的证书中。
  --import 将一个信任的证书导入,或者是接到了CA 的回复,将该证书取代原来密钥库中自签的证书。
  keypasswd – 为某私钥分配密码
  -list - 列出密钥库中所有入口
  -storepasswd 给密钥库分配密码

Java文档处理工具(jar)
如果要对代码签名,需要先用 jar 将其打包,然后用jarsigner 来签名, 命令的基本格式是
jar cf jar-file input-fileMoon

Java 文档签名及验证工具 (jarsigner)
jarsigner 工具通过密钥库中的数据来对 jar 文件进行签名和认证;

策略编辑器 (policytool )
编辑系统的策略文件

使用代码签名的大致流程如下:
签名方大致命令如下:
[ 生成私钥]keytool -genkey -alias signFiles -keypass 123456 -keystore store -storepass 123456
[ 打包 ]jar cvf A.jar *.class
[ 签名 ]jarsigner -keystore store -signedjar A.jar signFiles
[生成证书] keytool -export -keystore store -alias signFiles -file cer.cer

接收方大致流程如下:
直接运行代码是不允许的,只有先将证书引入本地的 keystore , 作为信任的证书插入;通过使用 Policy Tool 来配置相应的策略文件,通过两种方式来运行它:
用 java -Djava.security.manager -Djava.security.policy= raypolicy -cp sCount.jar AppName 的形式
通过配置浏览器使用的j ava.home\lib\security\java.security 文件,就可以带安全检查地运行该程序。
5、使用 JDK 的API 来构造自己的例程
基础 API
产生公钥和密钥对
[ 得到密钥产生器]KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA", "SUN");
[ 初始化密钥产生器] SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN"); keyGen.initialize(1024, random);
[产生公钥和密钥] KeyPair pair = keyGen.generateKeyPair();PrivateKey priv = pair.getPrivate(); PublicKey pub = pair.getPublic();

对数据签名
[ 得到一个签名对象] Signature dsa = Signature.getInstance("SHA1withDSA", "SUN");
[初始化签名对象] dsa.initSign(priv);
[对数据签名 ] dsa.update(buffer, 0, len);
[得到签名的数据] byte[] realSig = dsa.sign();
存储签名和公钥
签名结果直接按字节流存储
公钥通过pub.getEncoded(); 先转换为字节流来处理
从文件中取得公钥
先从文件中读到字节流中 encKey
[构造一个密钥说明类] X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);
[构造一个密钥管理器] KeyFactory keyFactory = KeyFactory.getInstance("DSA", "SUN");
[取得公钥] PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);
验证签名
[ 同生成签名一样先取得签名对象]
[用公钥初始化签名对象] sig.initVerify(pubKey);
[取得被签名的数据] sig.update(buffer, 0, len);
[验证] boolean verifies = sig.verify(sigToVerify);

先整理到这里,希望对初涉java安全的朋友有所帮助!


feiggle edited on 2003-04-18 18:06


作者 Re:Java安全漫谈 [Re:feiggle]
robinhoodx





发贴: 216
积分: 80
于 2003-04-18 18:06 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
really helpful. thanks a lot!



作者 Re:Java安全漫谈 [Re:feiggle]
floater

Java Jedi

总版主


发贴: 3233
积分: 421
于 2003-04-19 08:46 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Two more subjects:
1. How browsers handle the digital certs.
2. MD hash security.

Other advanced topics:
PKI
coding theory

Excellent!!



"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
- Martin Fowler, Refactoring - Improving the Design of Existing Code

flat modethreaded modego to previous topicgo to next topicgo to back
  已读帖子
  新的帖子
  被删除的帖子
Jump to the top of page

   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923