摘要: 介绍单点登陆(SSO)的原理与实践经验,包括Yale CAS, Kerberos SPNEGO, SAML SSO等方式,并深入SSO协议与原理,最后会介绍各种SSO的基本配置方法。
阅读全文
最近有网友在Dev2dev问,
访问
https://yourmachine:8843/webapp的时候,客户端提交了空的证书窗口,如下图所示
如果使用的是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,做法跟上面一样。
摘要: 在网上收集了不少WS-Security的资料,组织了一下成都BEA UserGroup之WS-Security演讲的PPT初稿,不知道是否有遗漏,欢迎指点。
阅读全文
摘要: PGP共享平台已经建立(www.pgp.org.cn),拥有一把PGP钥匙是一件很Cool的事情,保护Privacy就从现在做起
阅读全文
摘要: 如何使用Winscp和puttygen连接Sourceforge的shell service/web
阅读全文
摘要: Explain why CAS can't logout? 解释CAS SSO一个很重要的问题
阅读全文
摘要: edu.yale.its.tp.cas.client.CASAuthenticationException: Unable to validate ProxyTicketValidator
unable to find valid certification path to requested target
阅读全文
摘要: CeltiXfire入主Apache,将如何影响Axis2的地位?
阅读全文
通常,良好的架构都会有很好的异常处理模式,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服务之间的纽带。
摘要: AXIS2究竟要不要用, AXIS2跟XFIRE的差别是什么?
阅读全文
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: 凡事不要只看表象
[该GIF经过
Gif4J库处理]
异常:分析器已达到由应用程序设置的实体扩展限制"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解决!
摘要: 本文介绍如何让XFire跟WebService Security结合起来,目前为止,XFire选择了WSS4J(支持WS-Security1.0标准),我为SpringSide加入了WSS4J的3个认证例子(UsernameToken模式,Encrypt模式,Sign模式),大家可以到Springside SVN下载。
阅读全文
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一下就知道了。
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:
- 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我将会在下个月提供
摘要: 使用Gif4j实现gif图片的水印嵌入
阅读全文
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.>
摘要: How to use Java produce Signature by USBKey under CryptoAPI/CSP.
阅读全文
今天运气很好,被广州电台新闻风云榜记者钟慧采访了,并且领取了Team5 Hair Salon的洗头礼券。钟慧是一个很Nice and Pretty的女孩,如果我没google错,她应该来自于中山大学国际法的05届研究生,呵呵。女研究生俺还是有能力去应付的......
《新闻风云榜》是一个娱乐化包装的新闻节目(6:30pm-7:00pm),是广州电台一台就转型打造成新闻资讯广播的重要节目。
对于现代的IT人,繁忙的工作后,经常需要吸收一些社会新闻信息,有两个非常棒的悠闲节目,一个是广州电视台的《新闻日日睇》和广州电台的《新闻风云榜》。
我回忆了几个采访片断:
钟慧:对新闻风云榜的看法
我:很不错,能接受众多群众的反馈和观点,下一个陈扬节目。
钟慧:觉得新闻风云榜有什么可以改进的地方
我:已经很好,该节目有潜力,将会越来越好,但需要处理好中立的观点立场,观点不要过于偏激;同时,要大胆一些,敢于接受批评,正面观点固然需要,但也不要拒绝持对立观点的听众的意见,否则媒体的中立立场就缺乏前提条件了: )
钟慧:昨天你在电台类比黄建翔的“意大利万岁”成“国民党万岁”,给我们造成了不少压力,我们都被批评了。
我:我觉得我的表达有问题,我可能口快说错了(附:当时我打电话去新闻风云榜,发表我对黄建翔作为一个中央台解说员发表过激观点的非理性,我的观点当然不是“国民党万岁”,而是用“国民党万岁”来类比黄建翔观点的偏激性,在此,我再次澄清我的观点,如果你是一个台湾选民,你可能会呼喊“国民党万岁”或者“民进党万岁”,你有这样的权利,但黄建翔当时的角色不是一个“选民”,他难道没有想到电视观众中有“澳大利亚万岁”的球迷?仅代表个人观点和立场,并希望用此类比批评黄健翔做法的不适时性,并非批评黄健翔的个人品质问题。
除了对我的采访被她录音了,我也录了音,真不错,想不到《新闻风云榜》的节目组会这么榜,现在收听率已经升至本地区中游,FM96.2,作为我自己,下班时候(6点到6点半)可以听听电台,偶尔还可以发表一下言论,而且还能听到别人的观点和发表自己的观点,真是件快事。
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
摘要: 第三次BEA UserGroup总结
阅读全文
摘要: 本文设计了一个Java的随机序列,在此基础上产生了一个数字水印,并提供了水印图片,悬赏能破解水印信息的破解者。
阅读全文
-----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-----
摘要: CAS抓包分析,简单看看从login到serviceValidate的参数传递过程
阅读全文
摘要: 总结各种Java KeyStoreType
阅读全文
这是过去一周,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
向所有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
国人一定要加油了。
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
|
|
摘要: 最近,通过
Google
做
UserGroup
广告,发现每个Java关键字的最低竞价都是不一样的,几个常用的Sun关键字在google的竞价最低费用:
关键字
...
阅读全文
目前,GZ UserGroup成员只需要交纳5元即可享有2级域名的权利。
希望大家努力筹够100元。
目前,承诺交纳费用的人员有
david.turing
simon.liang
Rayman