我已经写了一个XML签名的工具SecureX——可以选择证书库,选择私钥签名,选择公钥验证签名,选择图章嵌入签名,从图章中读取签名等功能。
目前,我打算将工具作为RCP方式发布(需要花一些时间,未作为RCP发布之前,该软件还不能在其他机器运行,因为我使用了SWT(Eclipse
的标准界面库)做界面),SWT是一种Native Look的界面库,因此发布的时候,需要发布多个版本,这通过RCP来做是比较容易的。
另外,我定义了一些future feature:
1,能从服务器下载最新的证书列表,并选择信任哪些证书。
2,下载CRL,并确定有哪些证书已经撤销。
3,支持XML加密/解密标准
4,加入数据安全传输通道
a) 支持Diffie Hellman的密钥协商方式建立的SecureSocket
b) 通过数字证书建立的非对称加密的SecureSocket
5,加入HMAC标准,能够在两个SecureX之间,SecureX与服务器之间建立数据完整性标准
6,SecureX符合Eclipse plugin标准规范,即能够以Eclipse Plugin发布,而且能够作为
单独的Rich Client Application发布,同时能够在线自动更新。
RSA协议我不再描述,大家可以看http://www.di-mgt.com.au/rsa_alg.html。
RSA的密钥对生成时间依赖于两个因素,
第一,密钥的长度
第二,素数的筛选质量
在整个密钥对生成过程中,RSA会随机选择两个大素数,事实上,计算机的聪明
程度还不足以判断某个随机选择的大素数是否真的不可分解,因此,你只能够通过
计算机程序来尽量将这个大随机数不是素数的几率降到某个界限值(如0.0001)以下。
RSA KeyPair分为公钥和私钥,你应该这样使用KeyPair:
1,你使用私钥来签名,别人用你的公钥来验证签名
2,别人用你的公钥加密信息M->M',你用私钥来解密信息M'->M
虽然RSA经受过多年深入的密码分析,但大家在使用RSA的时候还是要注意以下事项,
否则RSA的安全性会大打折扣:
1,合理的密钥长度(setKeyLength)
RSA1024至今是安全的,按照目前密码分析和计算机硬件条件的发展,估计在未来5-10年,
仍以难以破解。
2,素数确定性选择(setCertaintyOfPrime)
实际应用中,选择100就行了。
3,选择合理的padding(setRSAMode)
RSA有三种模式,RAW, PKCS和OAEP,日常应用中,我本人只使用PKCS(PKCS#1 v1.5)
和OAEP(PKCS#1 v2.0)这两种padding模式。
padding跟安全性其实是紧密挂钩的,有兴趣的朋友可以看看PKCS#1标准讨论。
我编写了一个RSAUtils的工具类,下面的该类的测试代码的一部分。
程序如下:
RSAUtils utils =new RSAUtils();
utils.setKeyLength(1024);
utils.setCertaintyOfPrime(100);
utils.setRSAMode(PKCS_RSA_MODE); //RAW =1 PKCS=2 OAEP=3
utils.initRSAKeyPair();
//查看公钥
RSAKeyParameters mypubkey=utils.getPublicKey();
BigInteger mypubkey_modulus=mypubkey.getModulus();
BigInteger mypubkey_exponent=mypubkey.getExponent();
System.out.println("##mypubkey的modulus长度="+mypubkey_modulus.bitLength());
System.out.println("##mypubkey_modulus值="+mypubkey_modulus.toString());
System.out.println("##mypubkey的exponent长度="+mypubkey.getExponent().bitLength());
System.out.println("##mypubkey_exponent值="+mypubkey_exponent.toString());
//查看私钥
RSAKeyParameters myprivkey=utils.getPrivateKey();
BigInteger myprivkey_modulus=myprivkey.getModulus();
System.out.println("##myprivkey的modulus长度="+myprivkey_modulus.bitLength());
System.out.println("##myprivkey的modulus值="+myprivkey_modulus.toString());
System.out.println("##myprivkey.getExponent()长度="+myprivkey.getExponent().bitLength());
System.out.println("##myprivkey.getExponent()值="+myprivkey.getExponent());
以下是输出:
##mypubkey的modulus长度=1024
##mypubkey_modulus值=93806062666699782638132820491933031482836826566660997927543724649365705443512121003172409185855121369631538039111403612211728268332662414248776212969019881724066055080327735965218365399595323200109436472147258110417469825748181131149217613806780318374365617984326523029965066348377550281908277056378455106547
##mypubkey的exponent长度=2
##mypubkey_exponent值=3
##myprivkey的modulus长度=1024
##myprivkey的modulus值=93806062666699782638132820491933031482836826566660997927543724649365705443512121003172409185855121369631538039111403612211728268332662414248776212969019881724066055080327735965218365399595323200109436472147258110417469825748181131149217613806780318374365617984326523029965066348377550281908277056378455106547
##myprivkey.getExponent()长度=1023
##myprivkey.getExponent()值=62537375111133188425421880327955354321891217711107331951695816432910470295674747335448272790570080913087692026074269074807818845555108276165850808646013241363962278455328383552959397735977285649455021534046301135296075808377308404258909132811288204167107604525033796313576612747649866739561523887875979483707
其中,要记住,公钥的exponent即RSA算法中的e, e通常是3,17和65537
X.509建议使用65537,PEM建议使用3,PKCS#1建议使用3或65537,一般来说,都是选择3。
私钥的Exponent就是私钥中最重要的部分,它就是私钥区别于公钥的地方!
接着,我们看看RSA的加密,解密过程。
通常,不要随便对某一个别人发过来的东西进行签名(有潜在危险),即使有这样的必要,请先将它的文件进行Digest或者HMAC
处理后,再做签名。
为了说明RSA是如何加密信息的,我先让大家脱离MD5/SHA1等辅助算法(没有人会单独使用RSA,RSAwithMD5,RSAwithSHA1才是常用的使用方法),来单独看看RSA本身:
大家习惯了DES/IDEA,再看RSA的加密,可能会有一些不习惯,因为RSA虽然也可以看成是基于Block的加密,但是,RSA的输入和输出的Block的大小是不一样的,Block的大小依赖于你所使用的RSA Key的长度和RSA的padding模式。
在RSAUtils测试用例中,分别对RSA设置三种长度的Key(768,1024,2048)和2种padding模式(PKCS 1.5和OAEP),结果如下:
RSA InBlock大小 OutBlock大小 (单位,字节)
768bit/PKCS 85 96
1024bit/PKCS 117 128
2048bit/PKCS 245 256
768bit/OAEP 54 96
1024bit/OAEP 86 128
2048bit/OAEP 214 256
大家可以看到,相同密钥长度, 加密出来的密文长度要比明文要长,且OAEP的InBlock/OutBlock要比PKCS的InBlock/OutBlock要小,单从熵的角度,意味着OAEP padding模式引入更多的熵,OAEP要比PKCS更安全(事实上,为何提出OAEP代替PKCS,大家可以到RSA网站看看OAEP文档 http://www.rsasecurity.com/rsalabs/node.asp?id=2125)。
下面,RSAUtils是我写的针对BouncyCastle的一个工具类,它封装了BouncyCastle的crypto中的RSAEngine,基本上,我很少单独使用RSAUtils,我更多的是结合DiegestUtils来使用。
页面调用服务器的一个类里面的方法,做下面的步骤就可以了,前提是你配置好了buffalo那个demo。
只需执行下面三个步骤,就可以完成一个简单的乘法调用。
=====================
Spring例子(使用于1.2以前的版本)
=====================
1) HTML页面上
/buffalo/WebContent/pages/simple.html
增加页面输入框
<h4>1 Multipy calculator</h4>
<p>
<input name="double4" type="text" class="input_text" id="double4" size="12">
*
<input name="double5" type="text" class="input_text" id="double5" size="12">
<input type="button" name="Submit" value=" = " onclick="cmdMulitply()">
<input name="double6" type="text" class="input_text" id="double6">
</p>
增加JS调用
function cmdMulitply(){
var double4 =parseFloat(Buffalo.getElementById("double4").value);
var double5 =parseFloat(Buffalo.getElementById("double5").value);
var d6Handle =Buffalo.getElementById("double6");
buffalo.remoteCall("hnisi_service.multiply",[double4,double5], function(reply) {
d6Handle.value = reply.getResult();
alert(reply.getResult());
})
}
2)/buffalo/JavaSource/demo/buffalo-service.properties文件
加入
# 调整所有的Service
hnisi_service=net.buffalo.demo.hnisi.HnisiService
3)/buffalo/JavaSource/demo/net/buffalo/demo/hnisi/HnisiService.java
增加multiply方法
package net.buffalo.demo.hnisi;
public class HnisiService {
public double multiply(double a, double b) {
System.out.println("Calling Multipy...,a="+a+", b="+b+" 结果="+a*b);
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
return a*b;
}
}
=====================
Spring例子
=====================
Buffalo的1.2版本加入了Spring功能,如果你想使用Spring特性,上述的过程如下:
1) HTML页面上
/buffalo/WebContent/pages/simple-spring-2.html
增加页面输入框
<h4>1 Multipy calculator</h4>
<p>
<input name="double4" type="text" class="input_text" id="double4" size="12">
*
<input name="double5" type="text" class="input_text" id="double5" size="12">
<input type="button" name="Submit" value=" = " onclick="cmdMulitply()">
<input name="double6" type="text" class="input_text" id="double6">
</p>
增加JS调用
function cmdMulitply(){
var double4 =parseFloat(Buffalo.getElementById("double4").value);
var double5 =parseFloat(Buffalo.getElementById("double5").value);
var d6Handle =Buffalo.getElementById("double6");
buffalo.remoteCall("hnisi_service.multiply",[double4,double5], function(reply) {
d6Handle.value = reply.getResult();
alert(reply.getResult());
})
}
2)/buffalo/JavaSource/demo/buffalo-service.properties文件
加入
# 调整所有的Service
hnisi_service=net.buffalo.demo.hnisi.HnisiService
3)/buffalo/JavaSource/demo/net/buffalo/demo/hnisi/HnisiService.java
增加multiply方法
package net.buffalo.demo.hnisi;
public class HnisiService {
public double multiply(double a, double b) {
System.out.println("Calling Multipy...,a="+a+", b="+b+" 结果="+a*b);
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
return a*b;
}
}
4)修改/buffalo/WebContent/WEB-INF/applicationContext.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean name="simpleService" class="net.buffalo.demo.simple.SimpleService"></bean>
<bean name="hnisiService" class="net.buffalo.demo.hnisi.HnisiService"></bean>
<bean name="numberService" class="net.buffalo.demo.numberguess.NumberGuessService"></bean>
<bean name="buffaloConfigBean" class="net.buffalo.service.BuffaloServiceConfigurer">
<property name="services">
<map>
<entry key="springSimpleService">
<ref bean="simpleService"/>
</entry>
<entry key="springNumberService">
<ref bean="numberService"/>
</entry>
<entry key="springHnisiService">
<ref bean="hnisiService"/>
</entry>
</map>
</property>
</bean>
</beans>
总体感觉是简洁,无须关注xmlhttp,告别xml让我感到有点欣慰。
这两天搞无线局域网搞死我了,本来局域网是很好搞的,但是偏偏是两栋楼之间做无线局域网,那两栋楼有200多米,因此需要定向天线。 A点:(构建无线局域网) 无线AP(DLink),ADSL Modem ,高增益定向天线 B点:(接入到A点的无限网)无线网卡(LinkSys),高增益定向天线 Solution: B点作为一个无线局域网的一个接入点,AP当作一个交换机用,跟我们平时的Switch没有区别。 以后有广州的朋友需要搞无线发送的朋友可以找我,太平洋电脑城2条天线要1千多块钱,Cable要40元/米,我是到无线厂找朋友自己组装的,2条天线加上10米Cable一共要155元:) 另外 LinkSys 迷你型 AP():368元 DLink 无线网卡:210元 该方案适合于那些在两栋楼之间共享上网的家庭,如果两边都有自己的局域网,想共享网络,需要买两个不带路由的AP来做桥接(Bridge),那种不带路由的AP比带路由的AP要贵得多! Anyway,该是享受无线上网带来的喜悦了,不用申请两条ADSL了:)
我本来想将UG发展成立足于Dev2dev, Blogjava和Matrix大融合的面对面的架构师论坛,大家有什么好建议,回复一下,谢谢!
不少人都没搞清楚Ktpass跟Ktab的用法,特此写一篇文章来叙说一下。
我假设你对Kerberos有所认识,可以读我的一篇文章<Weblogic Security In Action>中篇,里面初步介绍了Kerberos协议(基于Windows KDC)。
在Kerberos中,安全性完全是依赖于Share Secret,也就是,KDC跟Kerberos Service之间都共享着一条Key,Ktpass这个命令行工具承担着这样一个角色,它能够将非Windows Kerberos服务配置一个Service Principal,通常类似于HTTP/Service@DomainName,并且同时生成一个Keytbab,这样做的目的是在Windows域中的KDC和非Windows的服务(Kerberos Service)建立一种安全的信任关系,Keytab文件中就是存放着那条非常重要的跟KDC打交道的Secret Key。
你更改了Keytab中的Key,就必须同时更改Kerberos database中的Key。操作Keytab,JDK提供了一个很好的工具叫做KTab。
首先,在Windows域控制器上创建一个用户tomcat2005, 这是一个Windows的用户,我们使用Ktpass将一个Kerberos service (HTTP/tomcat@MYDAVID.ORG)Mapping到这个用户上面。Ktpass会修改当前用户在Windows AD中的用户登录名,你可以用setspn -L tomcat2005来查看究竟有多少Service Principal绑定到tomcat2005上。
C:\>ktpass -princ HTTP/tomcat@MYDAVID.ORG -mapuser tomcat2005 -pass tomcat2005 -out tomcat2005_keytab -crypto des-cbc-md5
Successfully mapped HTTP/tomcat to tomcat2005.
Key created.
Output keytab to tomcat2005_keytab:
Keytab version: 0x502
keysize 50 HTTP/tomcat@MYDAVID.ORG ptype 1 (KRB5_NT_PRINCIPAL) vno 1 etype 0x3 (DES-CBC-MD5) keylength 8 (0xb64540dace6e70d3)
Account has been set for DES-only encryption.
接着,执行,目的是往keytab上面增加新的service principal。
C:\>ktab -k tomcat2005_keytab -a HTTP/tomcat@MYDAVID.ORG
Password for HTTP/tomcat@MYDAVID.ORG:tomcat2005
Done!
Service key for HTTP/tomcat@MYDAVID.ORG is saved in C:\\tomcat2005_keytab
你可能问,Ktpass和Ktab都往keytab文件两面写Key,其实,他们都是写同样的Key,只不过Ktpass还有一个AD帐号Set SPN Name的作用。
还可以通过ktab -l -k tomcat2005_keytab, 来看看里面究竟有针对什么Service的Key
C:\>ktab -l -k tomcat2005_keytab
Keytab name: C:\\tomcat2005_keytab
KVNO Principal
--------------------------------
4 HTTP/tomcat@MYDAVID.ORG
KVNO是Service Key的更新序号,不需要理会,关键的是Principal。
Weblogic Security In Action(原创自david.turing)
【Weblogic Security In Action】 提交时间: Sep 28, 2005 5:41:16 PM |
|
|
摘要 本文将探讨Weblogic Platform中的安全框架以及在该框架下如何实现企业安全(Weblogic Enterprise Security,简称WLES)。 本文分为上中下三篇。 上篇主要阐述WLES的概念,将按照如下的思路,让读者对Weblogic安全框架有一个明晰的理解,并在此基础上明白Weblogic基本安全要素如User,Group,Role,Resource。并探讨在WLES下实现认证和授权的方法。 中篇主要阐述WLES的配置,重点讲述如何在WLS中配置SSL和证书,如何配置LDAP和数据库,如何实现Windows集成安全,如何在开源技术如CAS,SAML,SPNEGO等基础上实现单点登陆(Single Sign on,即SSO)。 下篇主要解释Weblogic Mbean机制,讲述如何实现自己的Custom Security Provider,并解释如何使用Weblogic Security Provider构造一个强大稳健的安全体系。
[上篇] 1, Weblogic Platform安全框架概述 2, Security Realm下的用户、组、角色、资源和安全策略 3, 认证与授权 [中篇] 4, 配置SSL与数字证书 5, Windows集成安全 6, 单点登陆(SSO) [下篇] 7, 实现自己的Security Provider 8, 在Security Provider上构造灵活的安全体系
|
上篇
中篇
中篇花的时间比较长,可能是我打字慢吧:)
有不少地方有纰漏,希望各位大虾指正,谢谢。
多年在Blogjava,Matrix,JavaEye游走后,我们彼此可能都很熟悉了,但这只是线上的,在线下,我们可能缺乏面对面交流的机会。今天,广州UserGroup成立了,广州UserGroup作为华南地区的中心枢纽,有着便捷的交通和广泛的J2EE群体基础。BEA广州UserGruop是对Matrix,Dev2Dev,JavaEye,BlogJava的一种不同的组织形式,它以活动讲座和面对面交流为主要方式。
今天联系了几位本地区多年为开源做出贡献的牛牛,他们对BEA广州UserGroup都寄予厚望和表示支持,包括Chirs,农民,白衣,char等。
我作为广州UserGroup的组织人员之一,希望此Group能为广大广东地区的,尤其是广州,深圳等地的J2EE爱好者提供一个值得信任的交流平台。
各位朋友,大家如果对户外讲座有什么好的建议(包括主题,时间地点,演讲专家推荐等),请到
http://dev2dev.bea.com.cn/bbs/forum.jspa?forumID=29304&start=0 发言。
今年内,希望组织一次广东地区(主要是广州深圳)的J2EE高手见面会。
Evaluating Oracle Single Sign-On
Many of you know about login.case.edu. It makes your lives much easier because now you only have to enter your password once for numerous web services. However, there is a problem with the service: it is too complicated. It is not too complicated for the average user, but for the people who implement it. Just look at the hoops you have to jump through to get it working on your own server. What's more is that it relies on a web server module (not everybody has access to the web server config files) and requires somebody in ITS to manually do work every time a new client wishes to use it. What is needed is an alternative.
Well, we are already running an Oracle Single Sign-On product, so let's use that! OK, let's evaluate the Oracle product.
- We are using it because it is required by the portal.
- It requires manual intervention every time a new client wishes to use it. Isn't this a reason why we are investigating alternative?
- The Oracle products easily integrate with it. Hooray! No more separate logins for the portal and the calendar.
- Writing external programs to authenticate against it requires the use of a C or Java SDK. (I can hear the screams of agony now).
- The module mod_osso appears to only be available for Oracle's Application Server. Does it work with IIS? No. Does it work with your standalone Apache? I don't know either. Judging from a Google search, I'd say it isn't promising. Most importantly, does it work with mod_auth_ldap? Well, we don't know. If it doesn't, there is nothing we can do because the module is closed source.
In summary, we are being forced to use Oracle Single Sign-On, but it works well with the Oracle Applications. No matter what we decide to do, we will have to use this product. If we decide to make it the only SSO service for the university, a significant amount of effort would be required for every new application deployed to use it. Would system administrators make this effort to configure it, or would they take the easy way out and just resort to the tried and true LDAP authentication? Also, any department that uses IIS to host web applications would be unable to use the service. Do we really want to deploy a single sign-on service that only a subset of the university can use?
In my next post, I will explore alternatives to Oracle Single Sign-On and how they could integrate with the Oracle applications.