David.Turing's blog

 

[原创] SSO(Single Sign-on) in Action(上篇)

     摘要: 介绍单点登陆(SSO)的原理与实践经验,包括Yale CAS, Kerberos SPNEGO, SAML SSO等方式,并深入SSO协议与原理,最后会介绍各种SSO的基本配置方法。  阅读全文

posted @ 2006-10-02 16:27 david.turing 阅读(56209) | 评论 (33)编辑 收藏

灵感之源的Guardio/Defendio究竟值多少钱?

     摘要:   阅读全文

posted @ 2006-09-29 21:04 david.turing 阅读(3175) | 评论 (9)编辑 收藏

Tomcat/Weblogic在SSL握手中,IE提交证书窗口为空的问题

最近有网友在Dev2dev问,
访问https://yourmachine:8843/webapp的时候,客户端提交了空的证书窗口,如下图所示
no_certificate_for_ssl.gif

如果使用的是Tomcat,则需要检查JDK/Jre/lib/security下的cacerts是否包含了客户端用户
的Key所对应的CA证书,如果没有,则客户端出现上述窗口,因为,服务器端不
会不信任为客户端的Private Key所签名的ca证书!

如果使用Weblogic,需要要区分Use Custom Indentity和Use Java Keystore两种方式,
前者,往Weblogic的JKS导入客户端PK所对应的CA证书(链),后者,检查
Jre/lib/security的cacerts,做法跟上面一样。

posted @ 2006-09-27 11:38 david.turing 阅读(3480) | 评论 (1)编辑 收藏

发现GDCA USBKey(电子钥匙)的CSP数字签名实现存在缺陷

     摘要: 怀疑GDCA的签名实现存在缺陷  阅读全文

posted @ 2006-09-26 17:33 david.turing 阅读(5578) | 评论 (6)编辑 收藏

9月23日成都WS-Security演讲内容稿

     摘要: 在网上收集了不少WS-Security的资料,组织了一下成都BEA UserGroup之WS-Security演讲的PPT初稿,不知道是否有遗漏,欢迎指点。  阅读全文

posted @ 2006-09-22 01:03 david.turing 阅读(5684) | 评论 (4)编辑 收藏

Java安全概述

     摘要: 总结Java安全的5个重要方面  阅读全文

posted @ 2006-09-21 00:39 david.turing 阅读(7049) | 评论 (2)编辑 收藏

中国应该有自己的PGP群体

     摘要: PGP共享平台已经建立(www.pgp.org.cn),拥有一把PGP钥匙是一件很Cool的事情,保护Privacy就从现在做起  阅读全文

posted @ 2006-09-15 00:38 david.turing 阅读(2675) | 评论 (4)编辑 收藏

SourceForge Shell/Web使用指南

     摘要: 如何使用Winscp和puttygen连接Sourceforge的shell service/web  阅读全文

posted @ 2006-09-11 21:52 david.turing 阅读(2066) | 评论 (0)编辑 收藏

解释CAS Logout问题

     摘要: Explain why CAS can't logout? 解释CAS SSO一个很重要的问题  阅读全文

posted @ 2006-09-07 22:16 david.turing 阅读(14569) | 评论 (7)编辑 收藏

Yale CAS异常问题总结(2)Unable to validate ProxyTicketValidator之unable to find valid certification path to requested target

     摘要: edu.yale.its.tp.cas.client.CASAuthenticationException: Unable to validate ProxyTicketValidator
unable to find valid certification path to requested target  阅读全文

posted @ 2006-09-06 09:08 david.turing 阅读(11303) | 评论 (5)编辑 收藏

Yale CAS异常问题总结(1)Unable to validate ProxyTicketValidator之HTTPS hostname wrong: should be.....

严重: edu.yale.its.tp.cas.client.CASAuthenticationException: Unable to validate ProxyTicketValidator [[edu.yale.its.tp.cas.client.ProxyTicketValidator prox
yList=[null] [edu.yale.its.tp.cas.client.ServiceTicketValidator casValidateUrl=[https://192.168.1.111:8443/cas/proxyValidate] ticket=[ST-0-9h7Mx5HK3pfsdxRv
MD3y] service=[http%3A%2F%2F192.168.1.222%3A8080%2Fservlets-examples%2Fservlet%2FHelloWorldExample] renew=false]]]


这个CAS异常是从CAS Client里面抛出,是当我们不使用证书的CN去访问域名的时候(比如下文是用IP访问而且证书的CN是该IP对应的域名而非该IP),CASClient无法信任,因为你证书的CN命名写着abc.com,192.168.1.111这个IP是无法被CAS Client识别。

edu.yale.its.tp.cas.client.CASAuthenticationException: Unable to validate ProxyTicketValidator [[edu.yale.its.tp.cas.client.ProxyTicketValidator proxyList = [ null ] [edu.yale.its.tp.cas.client.ServiceTicketValidator casValidateUrl = [https: // 192.168.1.111:8443/cas/proxyValidate] ticket=[ST-0-9h7Mx5HK3pfsdxRvMD3y] service=[http%3A%2F%2F192.168.1.222%3A8080%2Fservlets-examples%2Fservlet%2FHelloWorldExample] renew=false]]]
    at edu.yale.its.tp.cas.client.CASReceipt.getReceipt(CASReceipt.java: 52 )
    at edu.yale.its.tp.cas.client.filter.CASFilter.getAuthenticatedUser(CASFilter.java:
455 )
    at edu.yale.its.tp.cas.client.filter.CASFilter.doFilter(CASFilter.java:
378 )
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
202 )
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:
173 )
    at filters.ExampleFilter.doFilter(ExampleFilter.java:
101 )
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
202 )
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:
173 )
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:
213 )
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:
178 )
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:
432 )
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:
126 )
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:
105 )
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:
107 )
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:
148 )
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:
869 )
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:
664 )
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:
527 )
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:
80 )
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:
684 )
    at java.lang.Thread.run(Thread.java:
595 )
Caused by: java.io.IOException: HTTPS hostname wrong:  should be 
< 192.168 . 1.111 >
    at sun.net.www.protocol.https.HttpsClient.checkURLSpoofing(HttpsClient.java:
493 )
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:
418 )
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:
170 )
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:
905 )
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:
234 )
    at edu.yale.its.tp.cas.util.SecureURL.retrieve(SecureURL.java:
84 )
    at edu.yale.its.tp.cas.client.ServiceTicketValidator.validate(ServiceTicketValidator.java:
212 )
    at edu.yale.its.tp.cas.client.CASReceipt.getReceipt(CASReceipt.java:
50 )

解决办法:
用域名访问,域名就是证书的CN。

posted @ 2006-09-05 18:20 david.turing 阅读(9411) | 评论 (4)编辑 收藏

CeltiXfireProposal让Axis2在Apache的地位被动摇?

     摘要: CeltiXfire入主Apache,将如何影响Axis2的地位?  阅读全文

posted @ 2006-08-28 13:51 david.turing 阅读(4283) | 评论 (5)编辑 收藏

思考Spring拦截技术与Web Service异常处理的结合

通常,良好的架构都会有很好的异常处理模式,Web Service也不例外。
例外的是,当你的项目比较庞大的时候,你的业务方法可能很多并且你并不了解他们的内部实现。
作为一个优秀的Web Service架构师,你需要解决Web服务跟这些业务异常的结合问题。

现实是我们都不想关心这些业务类的实现,尽管这些异常从Java类抛出,并且Web服务必须处理这些
异常,起码,你需要让客户端知道:web服务端抛出异常。

以XFire为例, 假设有一个Web服务A和一个调用A的客户端B
A服务端 B客户端
当B->A发起一个Web服务请求,A抛出异常的时候,会直接new XFireFault并扔向XFire客户端。
解耦思路带领下,应该先将异常处理剥离出来。
于是,有
A服务-A异常处理handler  B客户端-B异常处理handler
这样,从架构的角度,A/B均无需考虑异常问题。

XFire客户端可以通过addFaultHandler来增加异常处理,XFire服务端则可以通过典型的AOP异常拦截来隔离
业务逻辑和Web服务之间的纽带。

posted @ 2006-08-26 00:24 david.turing 阅读(3273) | 评论 (2)编辑 收藏

跟XFire对比, AXIS2是垃圾吗?

     摘要: AXIS2究竟要不要用, AXIS2跟XFIRE的差别是什么?  阅读全文

posted @ 2006-08-23 12:40 david.turing 阅读(15960) | 评论 (18)编辑 收藏

Amazing GIF

If your eyes follow the movement of the rotating pink dot, you will only see one color: PINK

If you stare at the black + in the center, the moving dot turns to GREEN

Now, concentrate on the black + in the center of the picture...

After a short period of time, all the pink dots will slowly disappear, and you will only see a green dot rotating.

It's amazing how our brain works. There really is no green dot, and the pink ones really don't disappear.

This gif prove the chinese famous saying:  凡事不要只看表象

coverConsWatermarked_smooth.gif

[该GIF经过Gif4J库处理]

posted @ 2006-08-19 09:35 david.turing 阅读(1486) | 评论 (1)编辑 收藏

解决异常:Parser has reached the entity expansion limit "64,000" set by the Application

异常:分析器已达到由应用程序设置的实体扩展限制"64,000"

用JDOM分析一个超大的xml文件,大概20M,估计有很多Elements:

  SAXBuilder saxbuilder = null;
  Document doc_all=null;

  saxbuilder = new SAXBuilder(); // 新建立构造器
  
  try {
   FileInputStream xmlfile=new FileInputStream("verybig.xml");
   doc_all=saxbuilder.build(xmlfile); // 读入文件
  } catch (FileNotFoundException e) {
   System.err.println("缺少文件!请检查");
   System.exit(-1);
  } catch (JDOMException e) {
   System.err.println("解析XML模板文件出错!请检查");
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }

抛出异常:
reached the entity expansion limit "64,000" set by the Application.
        at TErrorHandler.fatalError(XMLError.java:198)
        at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3342)
        at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3333)
        at org.apache.crimson.parser.Parser2.expandEntityInContent(Parser2.java:2667)
        at org.apache.crimson.parser.Parser2.maybeReferenceInContent(Parser2.java:2569)
        at org.apache.crimson.parser.Parser2.content(Parser2.java:1980)
        at org.apache.crimson.parser.Parser2.maybeElement(Parser2.java:1654)
        at org.apache.crimson.parser.Parser2.content(Parser2.java:1926)
        at org.apache.crimson.parser.Parser2.maybeElement(Parser2.java:1654)
        at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:634)
        at org.apache.crimson.parser.Parser2.parse(Parser2.java:333)
        at org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:448)
        at org.apache.crimson.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:185)
        at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:76)
        at XMLError.DOMRead(XMLError.java:101)
        at XMLError.main(XMLError.java:30)

中文翻译是:分析器已达到由应用程序设置的实体扩展限制"64,000"

原来是JAXP的bug,换JDK1.5解决!

posted @ 2006-08-10 16:22 david.turing 阅读(1123) | 评论 (0)编辑 收藏

[原创]实施WebService Security[WS-Security1.0]的Encrypt和Sign模式(XFire+WSS4J)

     摘要: 本文介绍如何让XFire跟WebService Security结合起来,目前为止,XFire选择了WSS4J(支持WS-Security1.0标准),我为SpringSide加入了WSS4J的3个认证例子(UsernameToken模式,Encrypt模式,Sign模式),大家可以到Springside SVN下载。  阅读全文

posted @ 2006-08-08 09:09 david.turing 阅读(22311) | 评论 (42)编辑 收藏

在SpringSide实现XFire Webservice认证

XFire官方网站提供的基于Webservice认证的例子有问题,在新版本的XFire1.1.2中编译不通过,不过这也是小Case,我后来折腾了一下,为SpringSide提供了一个简单的Webservice认证功能。
XFire跟Spring的天然融合,让我们可以少努力10年就能简单地在Spring中使用Webservice的强大魅力,我从AXIS专向XFire有一些冲动,也吃了不少亏,但受REST一族的强力吹捧,感觉还是值得尝试的,因此,在公司的系统中也把Axis彻底换了XFire。

回到SpringSide,我大概介绍一下如何配置一个真正实用的XFire验证服务。
SpringSide中的XFire配置文件放在:
SpringSide-bookstore\src\org\springside\bookstore\plugins\webservice\applicationContext-webservice-server.xml
我们在里面定义各个Webservice,该文件其实对应于XFire官方的XFire-Servlet.xml
看看下面的BookService,这是一个典型的Webservice服务,红色的inHandlers是我挂上去的。它的意思是所有访问BookService的请求都会被先送到authenticationHandler去处理,我们的验证逻辑可以在里面进行。
    <!--Web Service 在SpringMVC中的URL 路径映射-->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <value>/BookService=bookWebService</value>
        </property>
        <property name="inHandlers">
            <ref bean="authenticationHandler"/>
        </property>

    </bean>

我们接着看看authenticationHandler的代码:
我们在SpringSide中通过header方式向服务器提供验证信息(另外一种更简单的方式是创建一个Login的webservice服务,然后在XFire Session中建立Token信息)。
package org.springside.bookstore.plugins.webservice.authentication;

import org.apache.log4j.Logger;
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.exchange.InMessage;
import org.codehaus.xfire.fault.XFireFault;
import org.codehaus.xfire.handler.AbstractHandler;
import org.jdom.Element;
import org.jdom.Namespace;


/**
 * XFire的回调的Handler,在XFire配置文件中配置
 * Server端的认证模块,回调处理模块
 * 
 * ClientAuthHandler跟AuthenticationHandler要一起用,或者都不用
 * 
 * 
@author  david.turing
 * @blog  openssl.blogjava.net
 *
 
*/
public class AuthenticationHandler extends AbstractHandler {
    
private static final Logger log = Logger.getLogger(AuthenticationHandler.class);
    
    
public void invoke(MessageContext context) throws Exception {
        
        log.info(
"#AuthenticationHandler is invoked");
        InMessage message
=context.getInMessage();
        
        
final Namespace TOKEN_NS = Namespace.getNamespace("SpringSide","http://service.webservice.plugins.bookstore.springside.org");  
        
        
if(message.getHeader()==null)
        {
            
throw new XFireFault("GetRelation Service Should be Authenticated",
                    XFireFault.SENDER);
        }
        
        Element token 
= message.getHeader().getChild("AuthenticationToken", TOKEN_NS);
        
if (token == null)
        {
            
throw new XFireFault("Request must include authentication token.",
                                 XFireFault.SENDER);
        }

        String username 
= token.getChild("Username", TOKEN_NS).getValue();
        String password 
= token.getChild("Password", TOKEN_NS).getValue();

        System.out.println(
"username="+username);        
        System.out.println(
"password="+password);
        
        
if(username==null||password==null)
            
throw new XFireFault("Supplied Username and Password Please",
                    XFireFault.SENDER);
        
        
/**
         * 检查用户名密码是否正确
         
*/
        PasswordAuthenticationManager pamanager
=new PasswordAuthenticationManager();
        
if(!pamanager.authenticate(username,password))
            
throw new XFireFault("Authentication Fail! Check username/password",
                    XFireFault.SENDER);
 
        
    }
}
注意,XFireFault异常是往客户端抛的,Webservice Client应该学会catch XFireFault.

服务器端就是这么简单,看看客户端的TestCase
package org.springside.bookstore.plugins.webservice.service;

import java.lang.reflect.Proxy;
import java.net.MalformedURLException;
import java.util.List;

import org.codehaus.xfire.client.Client;
import org.codehaus.xfire.client.XFireProxy;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import org.springside.bookstore.commons.domain.Book;
import org.springside.bookstore.plugins.webservice.authentication.ClientAuthHandler;

import junit.framework.TestCase;

public class BookServiceWithAuthenticationTestCase extends TestCase {

    
protected void setUp() throws Exception {
        
super.setUp();
    }

    
protected void tearDown() throws Exception {
        
super.tearDown();
    }
    
    
public void getBookFromWebservice() throws Exception{
    
          Service serviceModel 
= new ObjectServiceFactory()
                .create(BookService.
class);
        BookService service 
= null;
        
        
try {
            service
=(BookService) new XFireProxyFactory().create(
                    serviceModel,
                    
"http://localhost:8080/springside/service/BookService");
        } 
catch (MalformedURLException e) {
            e.printStackTrace();
        }
        
        Client client 
= ((XFireProxy) Proxy.getInvocationHandler(service)).getClient();
        
//挂上ClientAuthHandler,提供认证
        client.addOutHandler(new ClientAuthHandler());
        List list 
= service.findBooksByCategory(null);
        assertNotNull(list);
        
for(int i=0;i<list.size();i++)
            System.out.println(((Book)list.get(i)).getName());
    }

}

你应该看到上面的client.addOutHandler(new ClientAuthHandler());
没错,它跟服务器端的AuthenticationHandler是一对,一起使用的!
也就是,每个被送往WebService服务的请求都被ClientAuthHandler处理过了。
看看ClientAuthHandler做了些什么:
package org.springside.bookstore.plugins.webservice.authentication;

import org.apache.log4j.Logger;
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.handler.AbstractHandler;
import org.jdom.Element;
import org.jdom.Namespace;

/**
 * 客户端端的认证模块,回调处理模块
 * 每个需要认证的WebService方法都可以挂这个Handler
 * 
 * 仅用于Demo,从解耦和易用性出发,
 * 没有跟Acegi结合,你可以任意扩展
 * 默认用户名/密码是admin/admin
 * 
 * ClientAuthHandler跟AuthenticationHandler要一起用,或者都不用
 * 
 * 
@author  david.turing
 *
 * @blog openssl.blogjava.net
 
*/    
public class ClientAuthHandler extends AbstractHandler {
        
private static final Logger log = Logger.getLogger(ClientAuthHandler.class);
        
        
//客户端自己配置用户名密码或者更安全的KeyStore方式
        private String username = "admin";
        
private String password = "admin";
        
        
public ClientAuthHandler() {
        }
        
        
public ClientAuthHandler(String username,String password) {
            
this.username = username;
            
this.password = password;
        }
        
        
public void setUsername(String username) {
            
this.username = username;
        }
        
        
public void setPassword(String password) {
            
this.password = password;
        }
        
        
public void invoke(MessageContext context) throws Exception {
                        
            
/*******************************************
             * Soap Header方式
             * 从Soap Header中获取用户名密码
             ******************************************
*/
            
final Namespace ns = Namespace.getNamespace("SpringSide","http://service.webservice.plugins.bookstore.springside.org");  
            Element el 
= new Element("header",ns);

            Element auth 
= new Element("AuthenticationToken", ns);
            Element username_el 
= new Element("Username",ns);
            username_el.addContent(username);
            Element password_el 
= new Element("Password",ns);
            password_el.addContent(password);
            auth.addContent(username_el);
            auth.addContent(password_el);
            el.addContent(auth);            
            context.getCurrentMessage().setHeader(el);            
            log.info(
"ClientAuthHandler done!");
        }
    }

不就是往header里面注入username,password!

在SpringSide中,所有的Spring配置文件都被小白分散到各个Module中去了,Wuyu原先是在Plugin中提供Webservice功能,因此,我仍然在Plugin中创建XFire接口。
SpringSide的Spring配置文件放在:
SpringSide-bookstore\webapp\WEB-INF\springmvc-servlet.xml
该文件定义了Plugin的xml:
AuthenticationHandler这个Bean需要先定义在Plugins-servlet.xml中,其它很简单,大家去Try一下就知道了。

posted @ 2006-07-25 23:48 david.turing 阅读(8752) | 评论 (4)编辑 收藏

重新实现JCAPI的JCE Provider

The Pheox JCAPI (http://pheox.com/download) 提供一个JCE Provider可以直接操作Microsoft 操作系统本地证书库/私钥的。JCAPI用一个jcapi.dll封装了这些复杂性,这个dll负责调用Windows内置的CSP来完成加密签名哈希等密码运算。
JCAPI.DLL属于轻量级的中间层类库,它让Java开发者免去对待CSP的细节,比如获得一个CSP的Handle。
JCAPI.dll提供了下面的JNI调用:
00000001    10002AA0    _Java_com_pheox_jcapi_CoreCipherJNI_decrypt@24
00000002    100021A0    _Java_com_pheox_jcapi_CoreCipherJNI_encrypt@20
00000003    100027A0    _Java_com_pheox_jcapi_CoreCipherJNI_encryptWithPrivateKey@20
00000004    10001E10    _Java_com_pheox_jcapi_CoreCipherJNI_getPrivateKeySize@12
00000005    10003610    _Java_com_pheox_jcapi_CoreKeyStoreJNI_aliases@16
00000006    100039D0    _Java_com_pheox_jcapi_CoreKeyStoreJNI_containsAlias@12
00000007    10005E50    _Java_com_pheox_jcapi_CoreKeyStoreJNI_createBase64Hash@12
00000008    10003B30    _Java_com_pheox_jcapi_CoreKeyStoreJNI_deleteEntry@12
00000009    10003DA0    _Java_com_pheox_jcapi_CoreKeyStoreJNI_getCertificate@12
0000000A    10003FE0    _Java_com_pheox_jcapi_CoreKeyStoreJNI_getCertificateChain@
20
0000000B    
10004530    _Java_com_pheox_jcapi_CoreKeyStoreJNI_getKey@12
0000000C    10004C00    _Java_com_pheox_jcapi_CoreKeyStoreJNI_isKeyEntry@
12
0000000D    10004E00    _Java_com_pheox_jcapi_CoreKeyStoreJNI_setCertificateEntry@
16
0000000E    
10005020    _Java_com_pheox_jcapi_CoreKeyStoreJNI_setKeyEntry@44
0000000F    10005CA0    _Java_com_pheox_jcapi_CoreKeyStoreJNI_size@
16
00000010    100062A0    _Java_com_pheox_jcapi_CoreSignatureJNI_hashFinal@12
00000011    10005F80    _Java_com_pheox_jcapi_CoreSignatureJNI_hashInit@12
00000012    10006140    _Java_com_pheox_jcapi_CoreSignatureJNI_hashUpdate@16
00000013    10006430    _Java_com_pheox_jcapi_CoreSignatureJNI_sign@28
00000014    10006F60    _Java_com_pheox_jcapi_CoreSignatureJNI_verify@28
00000015    10007CF0    _Java_com_pheox_jcapi_CoreUtilJNI_addPKCS11CSP@16
00000016    10007880    _Java_com_pheox_jcapi_CoreUtilJNI_createCertEntryStore@8
00000017    10007C20    _Java_com_pheox_jcapi_CoreUtilJNI_getAddedPKCS11CSPs@8
00000018    100078E0    _Java_com_pheox_jcapi_CoreUtilJNI_getCSP@12
00000019    10008F10    _Java_com_pheox_jcapi_CoreUtilJNI_getCertStoreFriendlyName@12
0000001A    100089C0    _Java_com_pheox_jcapi_CoreUtilJNI_getCertificateFriendlyName@
12
0000001B    
10007500    _Java_com_pheox_jcapi_CoreUtilJNI_getJCAPIDLLVersion@8
0000001C    
10007520    _Java_com_pheox_jcapi_CoreUtilJNI_getMSCSPs@8
0000001D    
10009010    _Java_com_pheox_jcapi_CoreUtilJNI_getMSCertStoreNames@8
0000001E    10007E20    _Java_com_pheox_jcapi_CoreUtilJNI_getPKCS11DLLName@
12
0000001F    100083F0    _Java_com_pheox_jcapi_CoreUtilJNI_getPKCS11TokenInfo@
12
00000020    10007B50    _Java_com_pheox_jcapi_CoreUtilJNI_getSupportedPKCS11CSPs@8
00000021    100077A0    _Java_com_pheox_jcapi_CoreUtilJNI_init@12
00000022    10007F40    _Java_com_pheox_jcapi_CoreUtilJNI_isPKCS11PrivateKey@12
00000023    10007D90    _Java_com_pheox_jcapi_CoreUtilJNI_removePKCS11CSP@12
00000024    10008F90    _Java_com_pheox_jcapi_CoreUtilJNI_reportMemStatus@8
00000025    10008360    _Java_com_pheox_jcapi_CoreUtilJNI_setCallbackPinCode@12
00000026    100083B0    _Java_com_pheox_jcapi_CoreUtilJNI_setCertOpenStoreFlags@12
00000027    10008C80    _Java_com_pheox_jcapi_CoreUtilJNI_setCertificateFriendlyName@16
它调用的类库其实还是crypt32.dll和ADVAPI32.dll.
crypt32.dll:
0000002C    CertEnumSystemStore
00000041    CertGetCertificateContextProperty
0000008B    CryptFindLocalizedName
00000056    CertRegisterSystemStore
00000097    CryptHashCertificate
00000061    CertSetCertificateContextProperty
00000019    CertCreateCertificateContext
00000004    CertAddCertificateContextToStore
00000044    CertGetIssuerCertificateFromStore
0000001E    CertDeleteCertificateFromStore
00000029    CertEnumCertificatesInStore
0000007C    CryptDecodeObject
0000009C    CryptImportPublicKeyInfo
00000050    CertOpenStore
00000032    CertFindCertificateInStore
0000000F    CertCloseStore
0000003C    CertFreeCertificateContext

导入, ADVAPI32.dll
顺序 (示意)    名字
000000A8    CryptSignHashA
00000099    CryptGetHashParam
0000008B    CryptDestroyHash
0000009D    CryptHashData
00000088    CryptCreateHash
00000094    CryptExportKey
00000089    CryptDecrypt
0000009F    CryptImportKey
0000008F    CryptEncrypt
0000009C    CryptGetUserKey
0000009A    CryptGetKeyParam
0000008C    CryptDestroyKey
00000085    CryptAcquireContextA
000000A0    CryptReleaseContext
000000AA    CryptVerifySignatureA
00000092    CryptEnumProvidersA
000001C9    RegCloseKey
000001EC    RegQueryValueExA
000001F9    RegSetValueExA
000001CD    RegCreateKeyExA
000001E2    RegOpenKeyExA
000000A1    CryptSetHashParam

在标准的CryptoAPI函数上的封装是有必要的,因为从Java程序员的角度,我们不需要太关心CSP,我们希望直接进行Cryptography运算。

JCAPI这个provider提供3个SPI的实现,
  • java.security.KeyStoreSpi
  • java.security.SignatureSpi
  • javax.crypto.CipherSpi

    也就是,我们通过Java应用程序可以直接借助于JCE API来调用CryptoAPI。

    这个JCE API算法支持下面的基本操作

    • Add, remove, list and access X.509 certificates.
    • Add, remove, access and export RSA private keys.
    • Create signatures with RSA private keys using the following algorithms:
      • SHA1withRSA
      • MD5withRSA
      • MD2withRSA
    • Verify signatures with RSA public keys.
    • Encrypt/decrypt data with RSA public/private keys using the following algorithm, mode and padding:
      • RSA/ECB/PKCS1Padding
    • Wrap and unwrap symmetric- and asymmetric keys with RSA key pairs through MS CAPI and PKCS#11.
    • Built-in support for tested PKCS#11 CSP manufacturers that is compliant with the functions required by JCAPI.
    • Dynamically adding/removing of PKCS#11 CSPs into JCAPI.
    • Private key call-back interface for PKCS#11 providers. You can provide your own preferred Java call-back implementation to be called whenever a private key is accessed through PKCS#11.
    • List and configure MS CAPI system (certificate) stores.
    • Use a MS CAPI system (certificate) store as an un-trusted store.
    • Set and get MS CAPI friendly names for certificates.
    • Get MS CAPI friendly names for system (certificate) stores.
    • Get detailed information about your PKCS#11 hardware token through the JCAPI PKCS#11 information class.
    • Use JCAPI supported plug-ins. A JCAPI plug-in is a signed JAR file that extends or enhances the functionality of JCAPI without the need of recompiling JCAPI.
    • JCAPI SSL plugin. Use this plug-in to simplify the work of integrating the JCAPI key store for SSL enabled applications. The plug-in transparently supports both the old JSSE version for Java 1.3, and the newer versions included in Java 1.4 and higher. This plug-in transparently supports the PKCS#11 implementation as defined in Java 5. Your JCAPI supported hardware keys can be plugged in and used immediately for SSL. JCAPI will automatically configure the token for you by setting the correct slot identity to use etc.
    • JCAPI X.509 Factory plug-in. Use this plug-in to transparently replace any other X.509 certificate factories used by your Java system.
    • JCAPI is signed with a qualified code signing certificate that is trusted by all modern web browsers which makes it suitable in trusted applets.

    JCE API支持一下的系统,我只是在Windows2000上测试通过,其他平台我不能保证破解能正常使用。

    • Windows 98
    • Windows 98 SE
    • Windows ME
    • Windows 2000
    • Windows XP

    JCE 支持JDK1.4以上,JDK1.3稍微为麻烦,要自己配制JCE和JSSE

    • Java 1.3.1 with JCE 1.2.2 and JSSE 1.0.3
    • Java 1.4
    • Java 1.5

    我已经在吉大正元的eSafe钥匙上通过测试,其他钥匙提供商可以发邮件给我,或者给Usb钥匙我去测试。

    JCAPI的时间限制比较容易去除,但由于JNI层以上的代码做了大量混淆,我不得不重写这个JCE Provider,最起码要实现KeyStoreSpi,SignatureSpi和CipherSpi。

  • JCAPI的JCE Provider我将会在下个月提供

  • posted @ 2006-07-18 12:06 david.turing 阅读(3940) | 评论 (4)编辑 收藏

    BEA AquaLogic Enterprise Security(ALES) 2.2 Released

         摘要:   阅读全文

    posted @ 2006-07-17 22:26 david.turing 阅读(1536) | 评论 (0)编辑 收藏

    发布GIF4J破解版

         摘要: 使用Gif4j实现gif图片的水印嵌入  阅读全文

    posted @ 2006-07-17 10:32 david.turing 阅读(6964) | 评论 (6)编辑 收藏

    Certificate chain received from 客户端- 192.168.10.10 was not trusted causing SSL handshake failure

    SSL握手会有很多意想不到的Exception, 其中很多都是因为没有配置好cacerts导致的。
    以Tomcat为例,你需要在conf/server.xml中指定你的keystore并且配置好KeyAlias,
    同时,Tomcat会到JAVA_HOME/jre/lib/security目录下读取cacerts文件。
    在Weblogic中,你也需要配置Trust.jks和Identity.jks(可以参考WebLoigc Security In Action)。

    问题是,IE究竟根据什么来提交证书(包含私钥的证书)?
    很简单,服务器提交他的证书到客户端,客户端会根据服务器的证书的DN,检索本地私钥,
    选择那些由此DN签发证书X,然后确定使用X对应的本地私钥,用于SSL握手。
    cacerts是JDK容器信任的证书列表,如果cacerts中没有包含客户端私钥对应的证书链中的
    信任证书,则服务器会拒绝任何从客户端的SSL请求。
    典型的Weblogic日志就是:
    <Certificate chain received from 客户端- 192.168.10.10 was not trusted causing SSL handshake failure.>

    posted @ 2006-07-13 17:48 david.turing 阅读(9608) | 评论 (3)编辑 收藏

    How to use Java produce Signature by USBKey under CryptoAPI/CSP

         摘要: How to use Java produce Signature by USBKey under CryptoAPI/CSP.  阅读全文

    posted @ 2006-07-11 13:24 david.turing 阅读(6925) | 评论 (1)编辑 收藏

    接受广州电台新闻风云榜[FM96.2]记者钟慧的个人采访

    今天运气很好,被广州电台新闻风云榜记者钟慧采访了,并且领取了Team5 Hair Salon的洗头礼券。钟慧是一个很Nice and Pretty的女孩,如果我没google错,她应该来自于中山大学国际法的05届研究生,呵呵。女研究生俺还是有能力去应付的......
    新闻风云榜》是一个娱乐化包装的新闻节目(6:30pm-7:00pm),是广州电台一台就转型打造成新闻资讯广播的重要节目。
    对于现代的IT人,繁忙的工作后,经常需要吸收一些社会新闻信息,有两个非常棒的悠闲节目,一个是广州电视台的《新闻日日睇》和广州电台的《新闻风云榜》。

    我回忆了几个采访片断:

    钟慧:对新闻风云榜的看法
    我:很不错,能接受众多群众的反馈和观点,下一个陈扬节目。

    钟慧:觉得新闻风云榜有什么可以改进的地方
    我:已经很好,该节目有潜力,将会越来越好,但需要处理好中立的观点立场,观点不要过于偏激;同时,要大胆一些,敢于接受批评,正面观点固然需要,但也不要拒绝持对立观点的听众的意见,否则媒体的中立立场就缺乏前提条件了: )

    钟慧:昨天你在电台类比黄建翔的“意大利万岁”成“国民党万岁”,给我们造成了不少压力,我们都被批评了。
    我:我觉得我的表达有问题,我可能口快说错了(附:当时我打电话去新闻风云榜,发表我对黄建翔作为一个中央台解说员发表过激观点的非理性,我的观点当然不是“国民党万岁”,而是用“国民党万岁”来类比黄建翔观点的偏激性,在此,我再次澄清我的观点,如果你是一个台湾选民,你可能会呼喊“国民党万岁”或者“民进党万岁”,你有这样的权利,但黄建翔当时的角色不是一个“选民”,他难道没有想到电视观众中有“澳大利亚万岁”的球迷?仅代表个人观点和立场,并希望用此类比批评黄健翔做法的不适时性,并非批评黄健翔的个人品质问题。

    除了对我的采访被她录音了,我也录了音,真不错,想不到《新闻风云榜》的节目组会这么榜,现在收听率已经升至本地区中游,FM96.2,作为我自己,下班时候(6点到6点半)可以听听电台,偶尔还可以发表一下言论,而且还能听到别人的观点和发表自己的观点,真是件快事。

    posted @ 2006-06-28 23:42 david.turing 阅读(3152) | 评论 (11)编辑 收藏

    A Java Sample For jCaptcha

         摘要: 一个简单的jcaptcha例子  阅读全文

    posted @ 2006-06-20 22:10 david.turing 阅读(2615) | 评论 (1)编辑 收藏

    GZUG之Captcha深度对抗比赛开始

    Captcha项目是Completely Automated Public Turing Test to Tell Computers and Humans Apart (全自动区分计算机和人类的图灵测试)的简称。
    CAPTCHA的目的是区分计算机和人类的一种程序算法,这种程序必须能生成并评价人类能很容易通过但计算机却通不过的测试。这个要求本身就是悖论,因为这意味着一个CAPTCHA必须能生成一个它自己不能通过的测试。
    大家可以看看CAPTCHA的一个例子

    人类能够比较容易识别图片中的字母,但如果编写计算机程序,难度就非常大了。
    按照Lenore Blum的说法,任何的图片中的内容都能被识别,不存在一种计算程序生成的图片不能被计算机程序识别出来。
    于是,比赛开始了,有人站到Captcha一方,有人站到破译Captcha的一方.......

    如今,GZUG的两位牛人已经开始了这个游戏,有兴趣的朋友请加入到我们的对抗比赛(QQ群:16699048):

    CYT(Coremail的主要设计者)加入了Captcha一方。
    灵感之源 (Guardio/Definio的Designer)加入了破译Captcha的一方。

    游戏规则是:Captcha方公布一系列的图片,破译Captcha的一方提供程序能够分析这些图片中的内容,如果破译方提供的应用程序能够以高于10%的识别率识别出图片内容,则判定破译方获胜。获胜方将得到BEA UG礼品一份!

    游戏奖品参见:
    http://dev2dev.bea.com.cn/bbs/gift!default.jspa

    关于Captcha的信息,参考下面的链接
    Captcha方:
    Captcha项目:http://www.captcha.net/
    jCaptcha项目:http://jcaptcha.sourceforge.net/

    破译Captcha方:
    http://www.cs.sfu.ca/~mori/research/gimpy/
    http://sam.zoy.org/pwntcha/
    http://www.brains-n-brawn.com/default.aspx?vDir=aicaptcha

    posted @ 2006-06-19 12:41 david.turing 阅读(2538) | 评论 (0)编辑 收藏

    BEA广州UserGroup6月3日活动手札

         摘要: 第三次BEA UserGroup总结  阅读全文

    posted @ 2006-06-16 01:10 david.turing 阅读(1700) | 评论 (2)编辑 收藏

    挑战随机序列---悬赏破解基于PRNG的Hacker

         摘要: 本文设计了一个Java的随机序列,在此基础上产生了一个数字水印,并提供了水印图片,悬赏能破解水印信息的破解者。  阅读全文

    posted @ 2006-06-13 09:44 david.turing 阅读(3937) | 评论 (5)编辑 收藏

    第三次BEA UG活动讲义下载

         摘要: 第三次UG安全研讨会讲义下载  阅读全文

    posted @ 2006-06-12 13:13 david.turing 阅读(1688) | 评论 (3)编辑 收藏

    0Day FTP服务器帐号密码

    -----BEGIN PGP MESSAGE-----
    Version: PGP Desktop 9.0.5 - Enterprise license

    qANQR1DBwEwDOgsSuXd//TEBB/9u6juG8R0ufJTe772f29JFGnMYhYvCNzIo5ei+
    GDkJXZbyMUgbeQc8scjWItoquiZ7+I2nHBwvlP9bgwpkVIn7spaJLm9uaGvz4u4n
    WVWSQfFFn2nl2tAQN5cRNhD3rzSP6zQPnDRELcNEz4JwfXYiApYcImUTQZh79Mhn
    PX87OqjH+66KpcNTomDsKcgjnZaDJUrKiJ7PVavMWn++SnIPaoGbzODnzRauaCNP
    1dUa2ia493Xja1gNqnQoSfLAVG4MsUFe4qKOn35eWtiVYFH8AoNrIlaW6XYPl9FR
    iqmkOxycGXgnt3zh2zO4uSD77ifsNkZ13uLSupwNIbiIMIIGwcFOAwf8TMrgt1+u
    EAgAhsbiaHkva437hPcE9wJpzCadXbn62/6NpOK/P6Mr6IabFYuePOJf43aI6Uy1
    4PMX/cVWtUbD3nF1Ntal8JtFaH4yUdr5WPvVxaQnzngZ304Nf6fO10VQT9jN3Eu5
    0FVsJ2CjetY4fV+ORdyvWJR7sl09cZ+n/1MrBh2L3zco+6vC8zPKKhygLiP6Hw00
    A/LBf1G6MLSzbqrr3p/uURgju6uF3nlW5BuxM1pXRVMeNPQLGnR931dX6UukPtzm
    L5pl1jNqNQ1uMtWdMHXKmr+jdAvsxae/cqOil+6zMMhh2RFmE1i3CGEXuWl4cX/M
    hLB/diRXIwZviS9w1IGC5ZkXMggA3UX56R/EZlSwPnj7h8XlG4Ikb0hV9acD0Mv2
    FIHOMZBJZHyHJcEV+RjwTy+rCpWp7sUQ0a7scQgZeeleJjJ0duzDKFAPhTAkFsVi
    pkgHD30zHSJ8142XdbSgYSYR8wKo4xADPmaGTOnml0Y2tBhdL3c9KyfHcfigM3b9
    AQ8zLrGSgjHJ/nh+Xltv6wESjg1n+gPIiPwab71z2asEyPAebMw/61Am7hxVPxLs
    EqHI0QLTFiS6FvphUzhLDlfoztWNB+FgAiD1SKb0UzCDF76wTsvuIHjpPFcfbCIf
    GCd7sBc8++eGmiyIOghw/HANYCyhgWNyhgsXeMYIZ81o1xGcN8k641c2LI0ZANeW
    g5TWluOjysejDyLv7hOS6kVCKcBW+B6mv8sb1X4RacuBM9TTRWgsOMJHQEybStBV
    zg==
    =joRo
    -----END PGP MESSAGE-----

    posted @ 2006-06-04 23:22 david.turing 阅读(9444) | 评论 (10)编辑 收藏

    CAS协议的抓包分析

         摘要: CAS抓包分析,简单看看从login到serviceValidate的参数传递过程  阅读全文

    posted @ 2006-05-26 11:27 david.turing 阅读(4285) | 评论 (0)编辑 收藏

    Java KeyStore的类型

         摘要: 总结各种Java KeyStoreType  阅读全文

    posted @ 2006-05-22 01:57 david.turing 阅读(5477) | 评论 (1)编辑 收藏

    计算HMAC

    Message Authentication Code (MAC) 是用于确信信息在传输过程中没有被修改过,体现了信息完整性, MAC 有很多种算法,大部分算法用于简单的场景(如文件传输),他们都有效,但如果用于都未曾考虑会被恶意攻击的情况,在密码学领域中,更多被应用的是 HMAC HMAC 更安全,因为它是基于 Key 的。 HMAC 是使用诸如 MD5,SHA-1 等散列算法构造 MAC

    HMAC 在这样一种场景中被应用:

    巴赫尔、穆罕默德是为伊拉克临时政府中不同的伊斯兰派系,由于美国已经在伊拉克设置了大量情报机构,他们担心政府部内部文件在网络传输可能被美国情报局修改,考虑起见,巴赫尔、穆罕默德决定使用 MAC 技术:

    1,  他们商榷一个简单的密钥 Key1

    2,  他们商榷一种可靠的 HMAC 算法,如 HMACSHA1

    3,  他们每次发送政府审批报告前,都用 HMACSHA1 进行计算,并将该 hmac x1 附带发送给对方

    4,  对方接收到文件,将文件进行一次 HMAC 的计算,得出新的 hmac x2 ,对比 x1 x2 ,可以知道文件是否在中途被修改过。

    注意,上述的步骤如果不考虑恶意攻击者,可以使用消息摘要,恶意攻击者可以修改你的文件,然后重新帮你计算摘要,最后替换你的摘要:(

           关于 HMAC 的更多标准,可以参考 RFC2104

    package  org.dev2dev.security.test.mac;

    import  java.io.File;
    import  java.io.IOException;
    import  java.security.InvalidKeyException;
    import  java.security.NoSuchAlgorithmException;

    import  javax.crypto.KeyGenerator;
    import  javax.crypto.Mac;
    import  javax.crypto.SecretKey;

    import  org.dev2dev.common.FileUtils;

    public   class  TestHmac {

     
    /**
      * 
    @param  args
      
    */

     
    public   static   void  main(String[] args)  {
         
    try   {
             
    // 首先需要生成Hmac的key,有比较多种方法,HmacSHA1,算法类型可以参考KeyGenerator算法列表 
                  // 本例子用KeyGenerator生成key,实际上,key可以保存起来,也可以被分发给其他人
             KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5"); 
             SecretKey key = keyGen.generateKey();
             Mac mac 
    = Mac.getInstance(key.getAlgorithm());
             mac.init(key);
                 
             File infile
    =new File("c:\\1.txt");
             
    byte[] inputbyte=null;
       
    try {
        inputbyte 
    = FileUtils.getBytesFromFile(infile);
       }
     catch (IOException e) {
        e.printStackTrace();
       }

             
    byte[] digest = mac.doFinal(inputbyte);
         
             
    // If desired, convert the digest into a string
             String HmacB64 = new sun.misc.BASE64Encoder().encode(digest);
             System.out.println(
    "计算的HMAC ="+ HmacB64);
         }
      catch  (InvalidKeyException e)  {
          e.printStackTrace();
         }
      catch  (NoSuchAlgorithmException e)  {
          e.printStackTrace();
         }
     

     }


    }

    posted @ 2006-05-21 17:05 david.turing 阅读(1553) | 评论 (1)编辑 收藏

    Sourceforge最近一段时间排名前50的Project

    这是过去一周,SF排名前50的Projects!

    Rank     Project Name      Percentile
      
    1      ZK  -  Ajax but no JavaScript      100.000
      
    2      Gaim      99.999
      
    3      FCKeditor      99.999
      
    4      XOOPS Dynamic Web CMSAccepting Donations      99.998
      
    5      OpenWFEAccepting Donations      99.997
      
    6       7 - Zip      99.997
      
    7      phpMyAdminAccepting Donations      99.996
      
    8      aMSN      99.996
      
    9      FileZillaAccepting Donations      99.995
      
    10      KoLmafiaAccepting Donations      99.994
      
    11      StellariumAccepting Donations      99.994
      
    12      MiKTeXAccepting Donations      99.993
      
    13      Compiere ERP  +  CRM Business SolutionAccepting Donations      99.992
      
    14      InkscapeAccepting Donations      99.992
      
    15      KeePass Password SafeAccepting Donations      99.991
      
    16      XUIAccepting Donations      99.991
      
    17      Gallery      99.990
      
    18      TV - Browser  -  A free EPGAccepting Donations      99.989
      
    19      AzureusAccepting Donations      99.989
      
    20      PHP For Applications  -  PHP FrameworkAccepting Donations      99.988
      
    21      RSSOwl  |  RSS  /  RDF  /  Atom NewsreaderAccepting Donations      99.987
      
    22      JasperReports      99.987
      
    23      ndiswrapperAccepting Donations      99.986
      
    24      PhpGedViewAccepting Donations      99.986
      
    25      PDFCreatorAccepting Donations      99.985
      
    26      Asterisk@HomeAccepting Donations      99.984
      
    27      Extended BitTorrent Client and TrackerAccepting Donations      99.984
      
    28      Wicket      99.983
      
    29      WebCalendarAccepting Donations      99.982
      
    30      MediaCoderAccepting Donations      99.982
      
    31      IT ++       99.981
      
    32      Coppermine Photo Gallery      99.981
      
    33      soapUI      99.980
      
    34      guliverkli      99.979
      
    35      Ares Galaxy      99.979
      
    36      Owl Intranet KnowledgebaseAccepting Donations      99.978
      
    37      freePBXAccepting Donations      99.977
      
    38      BitPim      99.977
      
    39      UFO:Alien Invasion NG      99.976
      
    40      Password SafeAccepting Donations      99.976
      
    41      Cellocity Linux For Cell Processors / PS3sAccepting Donations      99.975
      
    42      MinGW  -  Minimalist GNU  for  Windows      99.974
      
    43      Notepad ++ Accepting Donations      99.974
      
    44      PCGen :: An RPG Character GeneratorAccepting Donations      99.973
      
    45      Firebird      99.972
      
    46      Enterprise CRM and Groupware SystemAccepting Donations      99.972
      
    47      ClamWin Free AntivirusAccepting Donations      99.971
      
    48      G3D  -  3D EngineAccepting Donations      99.971
      
    49      eXistAccepting Donations      99.970
      
    50      Sahi  -  Web Automation and Test Tool      99.969

    posted @ 2006-05-18 21:56 david.turing 阅读(2678) | 评论 (5)编辑 收藏

    关于支持Stroll拖动的SWT Table的设计方法

    蛋蛋同志问起:

    ( 2006 - 05 - 18   13 : 49 : 48 )   邢红瑞( 50128986 )
    david师傅,SWT中Table如何出现横向滚动条


    其实方法很简单,就是用一个scrolledComposite包住这个Table,呵呵

      protected   void  createContents()  {
      setText(
    " SWT Application " );
      setSize(
    500 375 );

      
    final  ScrolledComposite scrolledComposite  =   new  ScrolledComposite( this , SWT.BORDER  |  SWT.H_SCROLL  |  SWT.V_SCROLL);
      
    final  Composite composite  =   new  Composite(scrolledComposite, SWT.NONE);
      table 
    =   new  Table(composite, SWT.BORDER);
    .


    效果如下图:

    swttable.gif

    posted @ 2006-05-18 14:25 david.turing 阅读(3336) | 评论 (0)编辑 收藏

    绿色Putty的做法——将putty session保存到一个reg文件中

    cyt最近要搞绿色工具箱,本人友情赞助了一个WinOrganizer破解绿色版本,另外,cyt还需要一个putty附带session的功能,但putty的session都是保存到注册表,如果绿色化,只能靠一些额外的手段。

    putty主站介绍一种办法,就是把sesssion记录导入到注册表中去,一个bat文件就行了,当然,绿色在外,不太希望在客户的主机上留下痕迹,所以,用完putty,bat还需要把客户的注册表中的session信息!
    下面的putty.bat来自于sgtatham的blog:

    @ECHO OFF
    regedit 
    / s putty.reg
    regedit 
    / s puttyrnd.reg
    start 
    / w putty.exe
    regedit 
    / e puttynew.reg HKEY_CURRENT_USER\Software\SimonTatham\PuTTY
    copy puttynew.reg putty.reg
    del puttynew.reg
    regedit 
    / s puttydel.reg


    该批处理文件需要两个额外的文件
    PUTTYRND.REG 用于设置which sets upPUTTY.RND种子文件的初始位置(安全考虑)
    PUTTYDEL.REG 销毁主机上的session记录的痕迹,并保存到现有的文件中去。.

    PUTTYDEL.REG:

    				
    REGEDIT4

    [ -HKEY_CURRENT_USER\Software\SimonTatham\PuTTY ]

    PUTTYRND.REG file:

    				
    REGEDIT4
     
    [ HKEY_CURRENT_USER\Software\SimonTatham\PuTTY ]
      "RandSeedFile"="u:\putty.rnd"

    putty.rnd是种子文件,放在绿色工具箱中(如u盘)即可。

    posted @ 2006-05-18 13:38 david.turing 阅读(3248) | 评论 (1)编辑 收藏

    请gmail用户警惕gmail.cn

    向所有Gmail用户告诫,切勿用gmail帐号登陆gmail.cn!!
    该网站可能会记录下你的gmail密码!!
    gmail.cn属于非法抢注域名,我本人对此事感到遗憾。
    下面是gmail.cn的域名信息:

    Domain Name: gmail.cn
    ROID: 20030801s10001s00869606-cn
    Domain Status: ok
    Registrant Organization: 爱思美北京信息科技有限公司
    Registrant Name: 爱思美
    Administrative Email: yanjie@ism.net.cn
    Sponsoring Registrar: 厦门华商盛世网络有限公司
    Name Server:ns.ism.net.cn
    Name Server:ns2.ism.net.cn
    Registration Date: 2003-08-01 17:48
    Expiration Date: 2009-08-01 17:48

    posted @ 2006-05-17 15:05 david.turing 阅读(1512) | 评论 (0)编辑 收藏

    几个PageRank=10的网站,中国网站一个都没有

    国人一定要加油了。

    Title:
    PR
    Backlinks
    URL:
    Adobe
    10
    82,600
    Adobe Acrobat
    10
    617,000
     World Wide Web Consortium
    10
    166,000
    Macromedia
    10
    31,600
     Energy.gov
    10
    43,000
     Apple - QuickTime
    10
     31,200
     Keio University
    10
    4,020
    National Aeronautics and Space Administration
    10
    64,400
    Apple Computers
    10
    74,400
    U.S Goverment Official Portal
    10
    192,000
    Google Search
    10
    3,830,000
    W3C CSS Validation Service
    10
    322,000
    The European Research Consortium for Informatics and Mathematics
    10
    1,540
    MIT Laboratory for Computer Science
    10
    4,200
    National Science Foundation
    10
    27,100
    The New York Times
    10
    189,000
    Language Tools
    10
    10,800
    Real Media
    10
    130,000
    The Web Standards Project
    10
    12,900
    Stat Counter
    10
    1,330,000


    posted @ 2006-05-16 14:14 david.turing 阅读(1239) | 评论 (0)编辑 收藏

    Google对几个Java关键字的最低竞价

         摘要: 最近,通过 Google 做 UserGroup 广告,发现每个Java关键字的最低竞价都是不一样的,几个常用的Sun关键字在google的竞价最低费用: 关键字 ...  阅读全文

    posted @ 2006-05-14 15:14 david.turing 阅读(2008) | 评论 (2)编辑 收藏

    广州UserGroup将启用gzug.org域名

    目前,GZ UserGroup成员只需要交纳5元即可享有2级域名的权利。
    希望大家努力筹够100元。

    目前,承诺交纳费用的人员有
    david.turing
    simon.liang
    Rayman

    posted @ 2006-05-11 21:05 david.turing 阅读(1371) | 评论 (8)编辑 收藏

    仅列出标题
    共4页: 上一页 1 2 3 4 下一页 

    导航

    统计

    常用链接

    留言簿(110)

    我参与的团队

    随笔分类(126)

    随笔档案(155)

    文章分类(9)

    文章档案(19)

    相册

    搜索

    积分与排名

    最新随笔

    最新评论

    阅读排行榜

    评论排行榜