<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[汪云飞 ’s ToolBox]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[容颜不老，青春永驻]]></description>
<link>http://hi.baidu.com/wiselyman</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[使用 Spring 2.5 注释驱动的 IoC 功能]]></title>
        <link><![CDATA[http://hi.baidu.com/wiselyman/blog/item/f512a8ef44bde61cfcfa3ce1.html]]></link>
        <description><![CDATA[
		
		<a href="http://www.ibm.com/developerworks/cn/java/j-lo-spring25-ioc/">http://www.ibm.com/developerworks/cn/java/j-lo-spring25-ioc/</a> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/wiselyman/blog/category/hibernate%2Bspring">hibernate+spring</a>&nbsp;<a href="http://hi.baidu.com/wiselyman/blog/item/f512a8ef44bde61cfcfa3ce1.html#comment">查看评论</a>]]></description>
        <pubDate>2009年10月28日 星期三  10:39</pubDate>
        <category><![CDATA[hibernate+spring]]></category>
        <author><![CDATA[wiselyman]]></author>
		<guid>http://hi.baidu.com/wiselyman/blog/item/f512a8ef44bde61cfcfa3ce1.html</guid>
</item>

<item>
        <title><![CDATA[使用 Spring 2.5 基于注解驱动的 Spring MVC]]></title>
        <link><![CDATA[http://hi.baidu.com/wiselyman/blog/item/89af0d085b5271db63d986e1.html]]></link>
        <description><![CDATA[
		
		<a href="http://www.ibm.com/developerworks/cn/java/j-lo-spring25-mvc/">http://www.ibm.com/developerworks/cn/java/j-lo-spring25-mvc/</a> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/wiselyman/blog/category/hibernate%2Bspring">hibernate+spring</a>&nbsp;<a href="http://hi.baidu.com/wiselyman/blog/item/89af0d085b5271db63d986e1.html#comment">查看评论</a>]]></description>
        <pubDate>2009年10月28日 星期三  10:38</pubDate>
        <category><![CDATA[hibernate+spring]]></category>
        <author><![CDATA[wiselyman]]></author>
		<guid>http://hi.baidu.com/wiselyman/blog/item/89af0d085b5271db63d986e1.html</guid>
</item>

<item>
        <title><![CDATA[spring随记]]></title>
        <link><![CDATA[http://hi.baidu.com/wiselyman/blog/item/483b79098a0880a52fddd479.html]]></link>
        <description><![CDATA[
		
		<p><strong><font size="5">Bean scopes</font></strong></p>
<p><strong>sigleton：</strong></p>
<p>Spring singleton is best described as per container and per bean.</p>
<p>The singleton scope is the default scope in Spring.</p>
<p><strong>prototype：</strong></p>
<p>creation of a new bean instance every time a request for that specific bean is made。</p>
<p>use the prototype scope for all beans that are stateful, while the singleton scope should be used for stateless beans.</p>
<p>prototype-scoped bean as somewhat of a replacement for the Java 'new' operator.</p>
<p>Spring does not manage the complete lifecycle of a prototype bean。It is the responsibility of the client code to clean up prototype scoped objects and release any expensive resources that the prototype bean(s) are holding onto.</p>
<p><strong>request（web专用）、</strong><strong>session（web专用）、</strong><strong>globle session（web专用）</strong></p>
<p><strong>servlet 2.4+ web.xml</strong></p>
<p>&lt;web-app&gt;<br>
...<br>
&lt;listener&gt;<br>
&lt;listener-class&gt;org.springframework.web.context.request.RequestContextListener&lt;/listener-class&gt;<br>
&lt;/listener&gt;<br>
...<br>
&lt;/web-app&gt;</p>
<p><strong>servlet 2.3 web.xml</strong></p>
<p>&lt;web-app&gt;<br>
..<br>
&lt;filter&gt;<br>
&lt;filter-name&gt;requestContextFilter&lt;/filter-name&gt;<br>
&lt;filter-class&gt;org.springframework.web.filter.RequestContextFilter&lt;/filter-class&gt;<br>
&lt;/filter&gt;<br>
&lt;filter-mapping&gt;<br>
&lt;filter-name&gt;requestContextFilter&lt;/filter-name&gt;<br>
&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br>
&lt;/filter-mapping&gt;<br>
...<br>
&lt;/web-app&gt;</p>
<p>the global session scope is similar to the standard HTTP Session scope (described immediately above), and really only makes sense in the context of portlet-based web applications.</p>
<p>if you are writing a standard Servlet-based web application and you define one or more beans<br>
as having global session scope, the standard HTTP Session scope will be used, and no error will be raised.</p>
<p><font color="#ff0000">&lt;bean id=&quot;userPreferences&quot; class=&quot;com.foo.UserPreferences&quot; scope=&quot;session&quot;&gt;<br>
&lt;!-- this next element effects the proxying of the surrounding bean --&gt;<br>
&lt;aop:scoped-proxy/&gt;<br>
&lt;/bean&gt;</font></p>
<p><font color="#ff0000">&lt;!-- a singleton-scoped bean injected with a proxy to the above bean --&gt;<br>
&lt;bean id=&quot;userService&quot; class=&quot;com.foo.SimpleUserService&quot;&gt;<br>
&lt;!-- a reference to the proxied 'userPreferences' bean --&gt;<br>
&lt;property name=&quot;userPreferences&quot; ref=&quot;userPreferences&quot;/&gt;<br>
&lt;/bean&gt;<br>
&lt;/beans&gt;</font></p>
<p><font color="#000000"><font color="#00ff00">&lt;bean id=&quot;userPreferences&quot; class=&quot;com.foo.UserPreferences&quot; scope=&quot;session&quot;/&gt;<br>
&lt;bean id=&quot;userManager&quot; class=&quot;com.foo.UserManager&quot;&gt;<br>
&lt;property name=&quot;userPreferences&quot; ref=&quot;userPreferences&quot;/&gt;<br>
&lt;/bean&gt;</font><br>
From the above configuration it is evident that the singleton bean 'userManager' is being injected with a<br>
reference to the HTTP Session-scoped bean 'userPreferences'. The salient point here is that the<br>
'userManager' bean is a singleton... it will be instantiated exactly once per container, and its dependencies (in<br>
this case only one, the 'userPreferences' bean) will also only be injected (once!). This means that the<br>
'userManager' will (conceptually) only ever operate on the exact same 'userPreferences' object, that is the<br>
one that it was originally injected with. This is not what you want when you inject a HTTP Session-scoped<br>
bean as a dependency into a collaborating object (typically). Rather, what we do want is a single<br>
'userManager' object, and then, for the lifetime of a HTTP Session, we want to see and use a<br>
'userPreferences' object that is specific to said HTTP Session.</font></p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/wiselyman/blog/category/hibernate%2Bspring">hibernate+spring</a>&nbsp;<a href="http://hi.baidu.com/wiselyman/blog/item/483b79098a0880a52fddd479.html#comment">查看评论</a>]]></description>
        <pubDate>2009年09月27日 星期日  21:37</pubDate>
        <category><![CDATA[hibernate+spring]]></category>
        <author><![CDATA[wiselyman]]></author>
		<guid>http://hi.baidu.com/wiselyman/blog/item/483b79098a0880a52fddd479.html</guid>
</item>

<item>
        <title><![CDATA[1、1 JCA Design and Architecture（三）]]></title>
        <link><![CDATA[http://hi.baidu.com/wiselyman/blog/item/13869722dcf905f9d6cae2b2.html]]></link>
        <description><![CDATA[
		
		<p>上接<a href="http://hi.baidu.com/wiselyman/blog/item/3b4da601c3cf690c1c9583c2.html" target="_blank">1、1 JCA Design and Architecture（二）</a></p>
<div class="Section0" style="layout-grid:  15.6pt none">
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-weight: bold; font-size: 13pt; font-style: normal;  mso-spacerun:  yes ">Storing and Managing Keys</span><span style="font-weight: bold; font-size: 13pt; font-style: normal;  mso-spacerun:  yes ">（存储并管理<font face="FranklinGothic-DemiItal">key</font><font face="宋体">）</font></span><span style="font-weight: bold; font-size: 13pt; font-style: normal;  mso-spacerun:  yes "></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt;  mso-spacerun:  yes ">Keystore<font face="宋体">是</font><font face="Palatino-Roman">public keys</font></span><span style="font-size: 10.5pt;  mso-spacerun:  yes ">和<font face="Palatino-Roman">certificates</font></span><span style="font-size: 10.5pt;  mso-spacerun:  yes ">的数据库</span><span style="font-size: 10.5pt;  mso-spacerun:  yes ">。</span><span style="font-size: 10.5pt;  mso-spacerun:  yes "></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt;  mso-spacerun:  yes ">默认情况下，这个数据库是以名为<font face="Palatino-Roman">keystore</font><font face="宋体">的文件形式存在于用户的</font><font face="Palatino-Roman">home</font><font face="宋体">目录下。</font><font face="Palatino-Roman">SUN provider</font><font face="宋体">包提供这个功能通过一个私有的格式叫做</font><font face="Palatino-Roman">JKS</font><font face="宋体">。在这个文件里的每一个</font><font face="Palatino-Roman">private key</font><font face="宋体">都有密码保护，这个文件本身也有密码保护。</font><font face="Palatino-Roman">KeyStore</font><font face="宋体">引擎类提供一个健壮的接口来实现</font><font face="Palatino-Roman">keystore provider</font><font face="宋体">。</font></span><span style="font-size: 10.5pt;  mso-spacerun:  yes "></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt;  mso-spacerun:  yes ">KeyStore<font face="宋体">存储</font><font face="Palatino-Roman">2</font><font face="宋体">种类型的条目。</font></span><span style="font-size: 10.5pt;  mso-spacerun:  yes "></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt;  mso-spacerun:  yes ">第一、</span><span style="font-size: 10.5pt;  mso-spacerun:  yes ">一个<font face="Palatino-Roman">key</font><font face="宋体">条目</font></span><span style="font-size: 10.5pt;  mso-spacerun:  yes ">（<font face="Palatino-Roman">key entry</font><font face="宋体">）</font></span><span style="font-size: 10.5pt;  mso-spacerun:  yes ">，包含敏感的<font face="Palatino-Roman">key</font><font face="宋体">信息，如：</font><font face="Palatino-Roman">private key</font><font face="宋体">和</font></span><span style="font-size: 10.5pt;  mso-spacerun:  yes ">a</span><span style="font-size: 10.5pt;  mso-spacerun:  yes ">uthenticating certificate chain</span><span style="font-size: 10.5pt;  mso-spacerun:  yes ">或者一个秘密的<font face="Palatino-Roman">key</font></span><span style="font-size: 10.5pt;  mso-spacerun:  yes ">。</span><span style="font-size: 10.5pt;  mso-spacerun:  yes "></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt;  mso-spacerun:  yes ">第二、</span><span style="font-size: 10.5pt;  mso-spacerun:  yes ">一个可信证明条目（</span><span style="font-size: 9pt; font-style: italic;  mso-spacerun:  yes ">trusted certificate entry</span><span style="font-size: 10.5pt;  mso-spacerun:  yes ">），包含验证特定<font face="Palatino-Roman">public key</font><font face="宋体">的拥有者。</font></span><span style="font-size: 10.5pt;  mso-spacerun:  yes "></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt;  mso-spacerun:  yes "></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt;  mso-spacerun:  yes ">Keystore<font face="宋体">如何存储依赖于其实现；因此，它不是由引擎类指定的。</font><font face="Palatino-Roman">KeyStore </font><font face="宋体">引擎类提供方法来加载并保存一个</font><font face="Palatino-Roman">keystore</font><font face="宋体">，访问</font><font face="Palatino-Roman">entry</font><font face="宋体">的别名，决定</font><font face="Palatino-Roman">entry</font><font face="宋体">类型，管理</font><font face="Palatino-Roman">entry</font><font face="宋体">本身，并获得</font><font face="Palatino-Roman">keystore</font></span><span style="font-size: 10.5pt;  mso-spacerun:  yes ">的信息。</span><span style="font-size: 10.5pt;  mso-spacerun:  yes "></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt;  mso-spacerun:  yes ">标准的<font face="Palatino-Roman">getInstance</font><font face="宋体">方法可以用来创建</font><font face="Palatino-Roman">keystore</font><font face="宋体">。</font></span><span style="font-size: 10.5pt;  mso-spacerun:  yes "></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt;  mso-spacerun:  yes ">Load<font face="宋体">方法加载从指定的输入流加载</font><font face="Palatino-Roman">keystore</font><font face="宋体">。</font></span><span style="font-size: 10.5pt;  mso-spacerun:  yes ">可选的密码是用来验证<font face="Palatino-Roman">keystore</font><font face="宋体">完整性的方法。如果没有密码指定，完整性检查不会执行。</font></span><span style="font-size: 10.5pt;  mso-spacerun:  yes "></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt;  mso-spacerun:  yes ">传入<font face="Palatino-Roman">null</font><font face="宋体">到</font><font face="Palatino-Roman">input</font><font face="宋体">位置就会创建一个空的</font><font face="Palatino-Roman">keystore</font></span><span style="font-size: 10.5pt;  mso-spacerun:  yes "></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; color: rgb(0,0,255);  mso-spacerun:  yes ">final void load(InputStream stream, char[] password)</span><span style="font-size: 10.5pt; color: rgb(0,0,255);  mso-spacerun:  yes "></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt;  mso-spacerun:  yes ">&ldquo;<font face="Palatino-Roman">s</font></span><span style="font-size: 10.5pt;  mso-spacerun:  yes ">tore</span><span style="font-size: 10.5pt;  mso-spacerun:  yes ">&rdquo;</span><span style="font-size: 10.5pt;  mso-spacerun:  yes ">方法</span><span style="font-size: 10.5pt;  mso-spacerun:  yes ">保存当前的<font face="Palatino-Roman">keystore</font><font face="宋体">到指定的输出流。如果指定了密码，它用来计算</font><font face="Palatino-Roman">keystore</font><font face="宋体">数据的</font></span><span style="font-size: 10.5pt;  mso-spacerun:  yes ">校验和（<font face="Times New Roman">checksum</font><font face="宋体">）并加到输出流的尾部。校验和在加载执行完整性检查时使用。</font></span><span style="font-size: 10.5pt; color: rgb(0,0,255);  mso-spacerun:  yes "></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 9pt;  mso-spacerun:  yes "></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; color: rgb(0,0,255);  mso-spacerun:  yes ">final void store(OutputStream stream, char[] password)</span><span style="font-size: 10.5pt; color: rgb(0,0,255);  mso-spacerun:  yes "></span></p>
</div>
 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/wiselyman/blog/category/java%B8%DF%BC%B6">java高级</a>&nbsp;<a href="http://hi.baidu.com/wiselyman/blog/item/13869722dcf905f9d6cae2b2.html#comment">查看评论</a>]]></description>
        <pubDate>2009年09月14日 星期一  16:36</pubDate>
        <category><![CDATA[java高级]]></category>
        <author><![CDATA[wiselyman]]></author>
		<guid>http://hi.baidu.com/wiselyman/blog/item/13869722dcf905f9d6cae2b2.html</guid>
</item>

<item>
        <title><![CDATA[JAVA开发者最常去的20个英文网站(转)]]></title>
        <link><![CDATA[http://hi.baidu.com/wiselyman/blog/item/b5aed5b4352c26798ad4b2c4.html]]></link>
        <description><![CDATA[
		
		1.[http://www.javaalmanac.com] &ndash; Java开发者年鉴一书的在线版本. 要想快速查到某种Java技巧的用法及示例代码, 这是一个不错的去处.
<p>2.[http://www.onjava.com] &ndash; O&rsquo;Reilly的Java网站. 每周都有新文章.</p>
<p>3.[http://java.sun.com] &ndash; 官方的Java开发者网站 &ndash; 每周都有新文章发表.</p>
<p>4.[http://www.developer.com/java] &ndash; 由Gamelan.com 维护的Java技术文章网站.</p>
<p>5.[http://www.java.net] &ndash; Sun公司维护的一个Java社区网站.</p>
<p>6.[http://www.builder.com] &ndash; Cnet的Builder.com网站 &ndash; 所有的技术文章, 以Java为主.</p>
<p>7.[http://www.ibm.com/developerworks/java] &ndash; IBM的Developerworks技术网站; 这是其中的Java技术主页.</p>
<p>8.[http://www.javaworld.com] &ndash; 最早的一个Java站点. 每周更新Java技术文章.</p>
<p>9.[http://www.devx.com/java] &ndash; DevX维护的一个Java技术文章网站.</p>
<p>10.[http://www.fawcette.com/javapro] &ndash; JavaPro在线杂志网站.</p>
<p>11.[http://www.sys-con.com/java] &ndash; Java Developers Journal的在线杂志网站.</p>
<p>12.[http://www.javadesktop.org] &ndash; 位于Java.net的一个Java桌面技术社区网站.</p>
<p>13.[http://www.theserverside.com] &ndash; 这是一个讨论所有Java服务器端技术的网站.</p>
<p>14.[http://www.jars.com] &ndash; 提供Java评论服务. 包括各种framework和应用程序.</p>
<p>15.[http://www.jguru.com] &ndash; 一个非常棒的采用Q&amp;A形式的Java技术资源社区.</p>
<p>16.[http://www.javaranch.com] &ndash; 一个论坛，得到Java问题答案的地方，初学者的好去处。</p>
<p>17.[http://www.ibiblio.org/javafaq/javafaq.html] &ndash; comp.lang.java的FAQ站点 &ndash; 收集了来自comp.lang.java新闻组的问题和答案的分类目录.</p>
<p>18.[http://java.sun.com/docs/books/tutorial/] &ndash; 来自SUN公司的官方Java指南 &ndash; 对于了解几乎所有的java技术特性非常有帮助.</p>
<p>19.[http://www.javablogs.com] &ndash; 互联网上最活跃的一个Java Blog网站.</p>
<p>20.[http://java.about.com/] &ndash; 来自About.com的Java新闻和技术文章网站.</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/wiselyman/blog/category/java%BB%F9%B4%A1">java基础</a>&nbsp;<a href="http://hi.baidu.com/wiselyman/blog/item/b5aed5b4352c26798ad4b2c4.html#comment">查看评论</a>]]></description>
        <pubDate>2009年09月14日 星期一  06:23</pubDate>
        <category><![CDATA[java基础]]></category>
        <author><![CDATA[wiselyman]]></author>
		<guid>http://hi.baidu.com/wiselyman/blog/item/b5aed5b4352c26798ad4b2c4.html</guid>
</item>

<item>
        <title><![CDATA[1、1 JCA Design and Architecture（二）]]></title>
        <link><![CDATA[http://hi.baidu.com/wiselyman/blog/item/3b4da601c3cf690c1c9583c2.html]]></link>
        <description><![CDATA[
		
		<p>接<a target="_blank" href="http://hi.baidu.com/wiselyman/blog/item/f512a8efcd309f1cfcfa3c6d.html">1、1 JCA Design and Architecture（一）</a></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p>import java.security.Signature;<br>
import java.security.KeyPair;<br>
import java.security.PublicKey;<br>
import java.security.PrivateKey;<br>
import java.security.NoSuchAlgorithmException;<br>
import java.security.InvalidKeyException;<br>
import java.security.SignatureException;</p>
<p>public class SignatureExample {<br>
&nbsp;&nbsp;&nbsp;  public byte[] signData(byte[] data, PrivateKey key)<br>
&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  try {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Signature signer = Signature.getInstance(&quot;SHA1withDSA&quot;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  signer.initSign(key);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  signer.update(data);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return(signer.sign());<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch(NoSuchAlgorithmException nsae) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println(&quot;Exception: &quot; + nsae);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  nsae.printStackTrace();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch(InvalidKeyException ike) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println(&quot;Exception: &quot; + ike);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ike.printStackTrace();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch(SignatureException se) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println(&quot;Exception: &quot; + se);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  se.printStackTrace();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return(null);<br>
&nbsp;&nbsp;&nbsp;  }</p>
<p>&nbsp;&nbsp;&nbsp;  public boolean verifySig(byte[] data, PublicKey key, byte[] sig)<br>
&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  try {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Signature signer = Signature.getInstance(&quot;SHA1withDSA&quot;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  signer.initVerify(key);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  signer.update(data);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return(signer.verify(sig));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch(NoSuchAlgorithmException nsae) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println(&quot;Exception: &quot; + nsae);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  nsae.printStackTrace();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch(InvalidKeyException ike) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println(&quot;Exception: &quot; + ike);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ike.printStackTrace();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch(SignatureException se) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println(&quot;Exception: &quot; + se);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  se.printStackTrace();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return(false);<br>
&nbsp;&nbsp;&nbsp;  }</p>
<p>public static void main(String args[])<br>
&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  SignatureExample sigEx = new SignatureExample();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  KeyPairGeneratorExample kpge = new KeyPairGeneratorExample();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  KeyPair keyPair = kpge.generateKeyPair(717);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  byte[] data = {65,66,67,68,69,70,71,72,73,74};<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  byte[] digitalSignature = sigEx.signData(data, keyPair.getPrivate());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  boolean verified;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  // This verification will succeed<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  verified = sigEx.verifySig(data, keyPair.getPublic(), digitalSignature);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if(verified) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println(&quot;** The digital signature has been verified&quot;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } else {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println(&quot;** The digital signature is invalid, the wrong &quot; +<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &quot;key was used, or the data has been compromised&quot;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println(&quot;&quot;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  // Generate a new key pair. Guaranteed to be different and incompatible<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  // with first set.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  keyPair = kpge.generateKeyPair(517);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  // This verification will fail<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  verified = sigEx.verifySig(data, keyPair.getPublic(), digitalSignature);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if(verified) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println(&quot;** The digital signature has been verified&quot;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } else {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println(&quot;** The digital signature is invalid, the wrong &quot; +<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &quot;key was used, or the data has been compromised&quot;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  }<br>
}</p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; color: rgb(0,0,0); mso-spacerun: yes">KeyPairGeneratorExample类会在后面讨论，它用来获得公钥和密钥。数据使用密钥签名，使用公钥验证。</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; color: rgb(0,0,0); mso-spacerun: yes">//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<span style="font-size: 10.5pt; color: rgb(0,0,0); mso-spacerun: yes">
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-weight: bold; font-size: 13pt; font-style: normal; mso-spacerun: yes">Digital Key Creation and Management</span><span style="font-weight: bold; font-size: 13pt; font-style: normal; mso-spacerun: yes">(<font face="宋体">电子</font><font face="FranklinGothic-DemiItal">key</font><font face="宋体">的创建和管理</font><font face="FranklinGothic-DemiItal">)</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Security API<font face="宋体">有</font><font face="Palatino-Roman">2</font><font face="宋体">种形式的</font><font face="Palatino-Roman">key</font><font face="宋体">存在。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  透明形式的<font face="Palatino-Roman">key</font><font face="宋体">允许获得</font><font face="Palatino-Roman">key</font><font face="宋体">的具体信息，比如计算</font><font face="Palatino-Roman">key</font><font face="宋体">的算法参数。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  非透明形式的<font face="Palatino-Roman">key</font><font face="宋体">保持这些值隐藏并只允许你访问创建</font><font face="Palatino-Roman">key</font><font face="宋体">的算法、使用的编码和</font><font face="Palatino-Roman">key</font><font face="宋体">本身的编码形式。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  透明形式的<font face="Palatino-Roman">key</font><font face="宋体">继承叫做</font><font face="Palatino-Roman">KeySpec</font><font face="宋体">标记接口。因为是一个标记接口，接口里没有方法定义。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  在<font face="Palatino-Roman">java.security.spec</font><font face="宋体">包中Key的接口如下表：</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/wiselyman/pic/item/54fe6f5921b511012934f0fc.jpg"></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<span>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">和透明形式的<font face="Palatino-Roman">key</font><font face="宋体">相反，不透明形式继承自</font><font face="Palatino-Roman">Key</font><font face="宋体">接口，不像</font><font face="Palatino-Roman">KeySpec</font><font face="宋体">接口，</font><font face="Palatino-Roman">key</font><font face="宋体">接口定义了</font><font face="Palatino-Roman">3</font><font face="宋体">个方法，所有的实体类必须实现。这三个方法的描述如下：</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&ldquo;<font face="Palatino-Roman">algorithm</font><font face="宋体">&rdquo;方法返回一个</font><font face="Palatino-Roman">string</font><font face="宋体">表示使用创建</font><font face="Palatino-Roman">key</font><font face="宋体">的算法：</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">String algorithm()</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&ldquo;<font face="Palatino-Roman">getEncoded</font><font face="宋体">&rdquo;方法返回一个已编码版本</font><font face="Palatino-Roman">key</font><font face="宋体">，遵循标准编码格式，如</font></span><span style="font-size: 10.5pt; mso-spacerun: yes">X.509 or PKCS #8</span><span style="font-size: 10.5pt; mso-spacerun: yes">：</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">byte[] getEncoded()</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&ldquo;<font face="Palatino-Roman">getFormat</font><font face="宋体">&rdquo;方法返回用来编码</font><font face="Palatino-Roman">key</font><font face="宋体">的编码格式的名称。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">String getFormat()</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&ldquo;java</span><span style="font-size: 10.5pt; mso-spacerun: yes">.security.interfaces</span><span style="font-size: 10.5pt; mso-spacerun: yes">&rdquo;<font face="宋体">包含</font><font face="Palatino-Roman">12</font><font face="宋体">个接口直接继承自</font><font face="Palatino-Roman">Key interface</font><font face="宋体">。在</font><font face="Palatino-Roman">Java API</font><font face="宋体">中，有很多类型标准的</font><font face="Palatino-Roman">key</font><font face="宋体">。如下表：</font></span></p>
</span>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span><br>
</span><span><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/wiselyman/pic/item/8f203eaded4fb3224a36d6c4.jpg"></span></p>
<span>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  KeyFactory<font face="宋体">引擎类用来转换透明形式</font><font face="Palatino-Roman">key</font><font face="宋体">到非透明形式，反之亦然。 </font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  标准的<font face="Palatino-Roman">getInstance</font><font face="宋体">方法用来创建</font><font face="Palatino-Roman">KeyFactory</font><font face="宋体">。有</font><font face="Palatino-Roman">2</font><font face="宋体">个方法转换透明</font><font face="Palatino-Roman">key</font><font face="宋体">到非透明</font><font face="Palatino-Roman">key</font><font face="宋体">：</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  一种是为公钥一种为密钥。有<font face="Palatino-Roman">1</font><font face="宋体">个方法定义来反转这些操作。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  这些操作在下面描述：</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<span style="font-size: 10.5pt; mso-spacerun: yes">
<div class="Section0" style="layout-grid:  15.6pt none">
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">generatePublic<font face="宋体">和</font><font face="Palatino-Roman">generatePrivate</font></span><span style="font-size: 10.5pt; mso-spacerun: yes">方法接受透明形式<font face="Palatino-Roman">key</font><font face="宋体">（直接或间接继承</font><font face="Palatino-Roman">KeySpec</font><font face="宋体">自</font><font face="Palatino-Roman">KeySpec</font><font face="宋体">）</font></span><span style="font-size: 10.5pt; mso-spacerun: yes">并返回非透明的<font face="Palatino-Roman">public key</font><font face="宋体">或</font><font face="Palatino-Roman">private key</font><font face="宋体">：</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; color: rgb(0,0,255); mso-spacerun: yes">PublicKey generatePublic(KeySpec keySpec)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; color: rgb(0,0,255); mso-spacerun: yes">PrivateKey generatePrivate(KeySpec keySpec)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10.5pt; mso-spacerun: yes">getKeySpec <font face="宋体">方法接受非透明形式的</font><font face="Palatino-Roman">key</font><font face="宋体">通过</font><font face="Palatino-Roman">key</font><font face="宋体">参数</font></span><span style="font-size: 10.5pt; mso-spacerun: yes">，一个指定哪个<font face="Palatino-Roman">key specification </font><font face="宋体">被转换并返回的类：</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; color: rgb(0,0,255); mso-spacerun: yes">KeySpec getKeySpec(Key key, Class keySpec)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">更多的从客户端的角度考虑，<font face="Palatino-Roman">KeyPair</font><font face="宋体">和</font><font face="Palatino-Roman">KeyPairGenerator</font><font face="宋体">以及</font></span><span style="font-size: 10.5pt; mso-spacerun: yes">KeyStore<font face="宋体">引擎类是用来创建、存储并管理这些</font><font face="Palatino-Roman">public/private key</font><font face="宋体">和证书。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">KeyPair<font face="宋体">类定义下面</font><font face="Palatino-Roman">2</font><font face="宋体">个方法：</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; color: rgb(0,0,255); mso-spacerun: yes">PrivateKey getPrivate()</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; color: rgb(0,0,255); mso-spacerun: yes">PublicKey getPublic()</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">第一个方法返回正在被存储的<font face="Palatino-Roman">private key</font><font face="宋体">，第二个返回</font><font face="Palatino-Roman">public key</font><font face="宋体">。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">KeyPairGenerator<font face="宋体">引擎类用来产生</font><font face="Palatino-Roman">public/private key </font><font face="宋体">对，并使用</font><font face="Palatino-Roman">KeyPair</font><font face="宋体">类来存储它们。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">KeyPairGenerator<font face="宋体">引擎类产生一对</font><font face="Palatino-Roman">key</font><font face="宋体">是与算法无关的，是和</font><font face="Palatino-Roman">keyPairGenerator</font><font face="宋体">如何初始化有关。因为所有的算法使用基础</font></span><span style="font-size: 10.5pt; mso-spacerun: yes">的<font face="Palatino-Roman">size</font><font face="宋体">和</font></span><span style="font-size: 10.5pt; mso-spacerun: yes"> randomness</span><span style="font-size: 10.5pt; mso-spacerun: yes">（随机）</span><span style="font-size: 10.5pt; mso-spacerun: yes">的概念，初始化存在使得特定的算法不是必须的：</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; color: rgb(0,0,255); mso-spacerun: yes">void initialize(int keysize, SecureRandom random)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; color: rgb(0,0,255); mso-spacerun: yes">void initialize(int keysize)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">Keysize<font face="宋体">参数的含义是：对于每一个算法</font><font face="Palatino-Roman">keysize</font><font face="宋体">不同。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">其他的算法参数也是已给预先配置好的参数。例如：一个<font face="Palatino-Roman">DSA</font><font face="宋体">算法，基于特定的</font><font face="Palatino-Roman">keysize</font><font face="宋体">，会指派它的参数不同的值。如果一个随机数产生器不被传入，</font><font face="Palatino-Roman">radomness</font><font face="宋体">通过默认系统产生器产生。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">下面形式的</span><span style="font-size: 10.5pt; mso-spacerun: yes">initialize<font face="宋体">实现初始化基于特定的参数，通过</font><font face="Palatino-Roman">params</font><font face="宋体">参数传递。如果一个随机数字产生器没有传进，</font><font face="Palatino-Roman">radomness</font><font face="宋体">由系统产生：</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; color: rgb(0,0,255); mso-spacerun: yes">void initialize(AlgorithmParameterSpec params, SecureRandom random)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; color: rgb(0,0,255); mso-spacerun: yes">void initialize(AlgorithmParameterSpec params)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">下面方法创建并返回一个<font face="Palatino-Roman">KeyPair</font><font face="宋体">对象。每次调用这个方法都会返回单独和不同的</font><font face="Palatino-Roman">key</font><font face="宋体">对</font></span><span style="font-size: 10.5pt; mso-spacerun: yes">：</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; color: rgb(0,0,255); mso-spacerun: yes">KeyPair generateKeyPair()</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">现在有一个例子来实现<font face="Palatino-Roman">KeyGenerator</font><font face="宋体">类来产生</font><font face="Palatino-Roman">private key</font><font face="宋体">和</font><font face="Palatino-Roman">public key</font><font face="宋体">并存在</font><font face="Palatino-Roman">KeyPair</font><font face="宋体">对象里：</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 9pt; mso-spacerun: yes">import java.security.KeyPairGenerator;<br>
import java.security.KeyPair;<br>
import java.security.SecureRandom;<br>
import java.security.NoSuchAlgorithmException;<br>
import java.security.NoSuchProviderException;<br>
import java.security.PublicKey;<br>
import java.security.PrivateKey;<br>
public class KeyPairGeneratorExample {<br>
public KeyPair generateKeyPair(long seed)<br>
{<br>
try {<br>
// Get a DSA key generator from first<br>
// provider that provides it<br>
KeyPairGenerator keyGenerator =<br>
KeyPairGenerator.getInstance(&ldquo;DSA&rdquo;);<br>
// Get a random number generator using<br>
// algorithm SHA1PRNG from the SUN provider package.<br>
SecureRandom rng =<br>
SecureRandom.getInstance(&ldquo;SHA1PRNG&rdquo;, &ldquo;SUN&rdquo;);<br>
// Configure RNG and initialize key pair generator<br>
rng.setSeed(seed);<br>
keyGenerator.initialize(1024, rng);<br>
return(keyGenerator.generateKeyPair());<br>
} catch(NoSuchProviderException nspe) {<br>
System.out.println(&ldquo;Exception: &ldquo; + nspe);<br>
nspe.printStackTrace();<br>
} catch(NoSuchAlgorithmException nsae) {<br>
System.out.println(&ldquo;Exception: &ldquo; + nsae);<br>
nsae.printStackTrace();<br>
}<br>
return(null);<br>
}&nbsp;&nbsp;</span></p>
<div class="Section0" style="layout-grid:  15.6pt none">
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; mso-spacerun: yes">public static void main(String args[])</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; mso-spacerun: yes">{</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; mso-spacerun: yes">KeyPairGeneratorExample kpge = new KeyPairGeneratorExample();</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; mso-spacerun: yes">KeyPair kp = kpge.generateKeyPair(717);</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; mso-spacerun: yes">System.out.println(&ldquo;-- Public Key ----&rdquo;);</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; mso-spacerun: yes">PublicKey pubKey = kp.getPublic();</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; mso-spacerun: yes">System.out.println(&ldquo; Algorithm=&rdquo; + pubKey.getAlgorithm());</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; mso-spacerun: yes">System.out.println(&ldquo; Encoded=&rdquo; + pubKey.getEncoded());</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; mso-spacerun: yes">System.out.println(&ldquo; Format=&rdquo; + pubKey.getFormat());</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; mso-spacerun: yes">System.out.println(&ldquo;\n-- Private Key ----&rdquo;);</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; mso-spacerun: yes">PrivateKey priKey = kp.getPrivate();</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; mso-spacerun: yes">System.out.println(&ldquo; Algorithm=&rdquo; + priKey.getAlgorithm());</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; mso-spacerun: yes">System.out.println(&ldquo; Encoded=&rdquo; + priKey.getEncoded());</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; mso-spacerun: yes">System.out.println(&ldquo; Format=&rdquo; + priKey.getFormat());</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; mso-spacerun: yes">}</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; mso-spacerun: yes">}</span></p>
<span style="font-size: 8.5pt; mso-spacerun: yes">
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">这个类利用特定的随机数产生器<font face="Palatino-Roman">-</font></span><span style="font-size: 10.5pt; mso-spacerun: yes">SHA1PRNG<font face="宋体">（来自</font><font face="Palatino-Roman">SUN provider</font><font face="宋体">包）。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">你会看到<font face="Palatino-Roman">private</font><font face="宋体">和</font><font face="Palatino-Roman">public key</font><font face="宋体">的不同，输出结果：</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; color: rgb(0,0,255); mso-spacerun: yes">-- Public Key ----</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; color: rgb(0,0,255); mso-spacerun: yes">Algorithm=DSA</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; color: rgb(0,0,255); mso-spacerun: yes">Encoded=[B@1a46e30</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; color: rgb(0,0,255); mso-spacerun: yes">Format=X.509</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; color: rgb(0,0,255); mso-spacerun: yes">-- Private Key ----</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; color: rgb(0,0,255); mso-spacerun: yes">Algorithm=DSA</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; color: rgb(0,0,255); mso-spacerun: yes">Encoded=[B@3e25a5</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 8.5pt; color: rgb(0,0,255); mso-spacerun: yes">Format=PKCS#8</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">Public key<font face="宋体">的编码格式是</font><font face="Palatino-Roman">X509</font></span><span style="font-size: 10.5pt; mso-spacerun: yes">,private key<font face="宋体">的编码格式</font><font face="Palatino-Roman">PKCS#8</font><font face="宋体">。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes"><font face="宋体">下接：<a href="http://hi.baidu.com/wiselyman/blog/item/13869722dcf905f9d6cae2b2.html" target="_blank">1、1 JCA Design and Architecture（三）</a></font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
</span></div>
</div>
</span></span></span> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/wiselyman/blog/category/java%B8%DF%BC%B6">java高级</a>&nbsp;<a href="http://hi.baidu.com/wiselyman/blog/item/3b4da601c3cf690c1c9583c2.html#comment">查看评论</a>]]></description>
        <pubDate>2009年09月13日 星期日  18:22</pubDate>
        <category><![CDATA[java高级]]></category>
        <author><![CDATA[wiselyman]]></author>
		<guid>http://hi.baidu.com/wiselyman/blog/item/3b4da601c3cf690c1c9583c2.html</guid>
</item>

<item>
        <title><![CDATA[1、2 Java Cryptography Extension]]></title>
        <link><![CDATA[http://hi.baidu.com/wiselyman/blog/item/13869722c01109f9d7cae29a.html]]></link>
        <description><![CDATA[
		
		1.2 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/wiselyman/blog/category/java%B8%DF%BC%B6">java高级</a>&nbsp;<a href="http://hi.baidu.com/wiselyman/blog/item/13869722c01109f9d7cae29a.html#comment">查看评论</a>]]></description>
        <pubDate>2009年09月12日 星期六  18:47</pubDate>
        <category><![CDATA[java高级]]></category>
        <author><![CDATA[wiselyman]]></author>
		<guid>http://hi.baidu.com/wiselyman/blog/item/13869722c01109f9d7cae29a.html</guid>
</item>

<item>
        <title><![CDATA[1、1 JCA Design and Architecture（一）]]></title>
        <link><![CDATA[http://hi.baidu.com/wiselyman/blog/item/f512a8efcd309f1cfcfa3c6d.html]]></link>
        <description><![CDATA[
		
		<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">JCA<font face="宋体">形成了安全</font><font face="Times New Roman">API</font><font face="宋体">的核心。在设计之初，有</font><font face="Times New Roman">2</font><font face="宋体">个重要的原则。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">第一、<font face="Times New Roman">JCA</font><font face="宋体">是实现无关的且可互操作的。实现无关是通过加密服务提供者（</font><font face="Times New Roman">cryptography service providers</font><font face="宋体">）来实现的。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  一个<font face="Times New Roman">provider</font><font face="宋体">实现了一种加密服务（例如生成随机数字或者创建一个电子签名）。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  互操作性保证不同的<font face="Times New Roman">provider</font><font face="宋体">可以一起工作。例如，不同的</font><font face="Times New Roman">provider</font><font face="宋体">使用相同的算法，被一个</font><font face="Times New Roman">provider</font><font face="宋体">加密可以被另外一个</font><font face="Times New Roman">provider</font><font face="宋体">解密。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">第二、</span><span style="font-size: 10.5pt; mso-spacerun: yes">JCA<font face="宋体">是算法无关性和可扩展性的。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  算法无关性是通过引擎类（<font face="Times New Roman">engine classes</font><font face="宋体">：提供特定的加密服务，如密钥生成器或者信息摘要服务）的规范来实现的。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  算法可扩展性确保这些引擎类可以很容易的用新的算法更新。</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">JDK<font face="宋体">包含一些默认的加密服务提供者，在名称为</font><font face="Times New Roman">SUN</font><font face="宋体">的包底下，有如下</font><font face="Times New Roman">provider</font><font face="宋体">：</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&#10065; Implementation of DSA (Digital Signature Algorithm)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&#10065; Implementation of MD5 and SHA-1 message digest algorithms</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&#10065; Key pair generator to generate public and private key pairs for the DSA algorithm</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&#10065; DSA algorithm parameter generator</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&#10065; DSA algorithm parameter manager</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&#10065; DSA key factory that supports converting public keys to and from private keys</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&#10065; SHA1PRNG pseudo-random number generator</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&#10065; X.509 Certificate path builder and validator for PKIX</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&#10065; A certificate store using the PKIX LDAP V2 Schema</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&#10065; Certificate factory for X.509 certificates and Certificate Revocation Lists (CRLs)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&#10065; A keystore</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">所有的<font face="Times New Roman">provider</font><font face="宋体">将会做详细的讨论。所有的例子都是使用</font><font face="Times New Roman">SUN</font><font face="宋体">包的默认的</font><font face="Times New Roman">provider</font><font face="宋体">的实现。如果你使用第三方的</font><font face="Times New Roman">provider</font><font face="宋体">包，请参考第三方文档。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<span style="font-size: 10.5pt; mso-spacerun: yes">
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-weight: bold; font-size: 10.5pt; mso-spacerun: yes">引擎类（</span><span style="font-weight: bold; font-size: 10.5pt; mso-spacerun: yes">Engine Classes</span><span style="font-weight: bold; font-size: 10.5pt; mso-spacerun: yes">）</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;  一个引擎类提供一个特定加密服务的接口。这个接口规定程序员如何使用特定的服务。一个特定的引擎类可以有许多不同的实现，例如电子签名的实现使用<font face="Times New Roman">SHA-1</font><font face="宋体">或者</font><font face="Times New Roman">MD5</font><font face="宋体">算法。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">每一个引擎类都有对应的服务提供接口（<font face="Times New Roman">SPI</font><font face="宋体">），</font><font face="Times New Roman">SPI</font><font face="宋体">是一个被引擎类封装的抽象类。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;  作为引擎类，<font face="Times New Roman">SPI</font><font face="宋体">类必须被继承。每一个引擎类都有一个工厂类可以用来创建引擎类的实例，使用</font><font face="Times New Roman">getInstance</font><font face="宋体">工厂方法。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">JDK<font face="宋体">定义了</font><font face="Times New Roman">12</font><font face="宋体">个引擎类，有</font><font face="Times New Roman">3</font><font face="宋体">个（</font></span><span style="font-size: 10.5pt; mso-spacerun: yes">certificate path classes </span><span style="font-size: 10.5pt; mso-spacerun: yes">和</span><span style="font-size: 10.5pt; mso-spacerun: yes">the certificate</span><span style="font-size: 10.5pt; mso-spacerun: yes"> </span><span style="font-size: 10.5pt; mso-spacerun: yes">store</span><span style="font-size: 10.5pt; mso-spacerun: yes">）是在<font face="Times New Roman">jdk1.4</font><font face="宋体">引入的。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">这些引擎类的描述如下：</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes"><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/wiselyman/pic/item/b505202efe3b2f7b4ec22667.jpg"></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<span style="font-size: 10.5pt; mso-spacerun: yes">
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">SPI<font face="宋体">类的命名规则是将</font><font face="Times New Roman">Spi</font><font face="宋体">加到</font><font face="Times New Roman">engine class</font><font face="宋体">名称后面，例如</font><font face="Times New Roman">SecureRadom </font><font face="宋体">的</font><font face="Times New Roman">SPI</font><font face="宋体">是</font><font face="Times New Roman">SecureRadomSpi</font><font face="宋体">。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">每一个<font face="Times New Roman">engine class</font><font face="宋体">都有一个</font><font face="Times New Roman">getInstance</font><font face="宋体">方法用来请求一个特定的算法并请求一个特定的</font><font face="Times New Roman">provider</font><font face="宋体">。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">安装一个不同的<font face="Times New Roman">provider</font><font face="宋体">包 通过放置</font><font face="Times New Roman">JAR</font><font face="宋体">文件到你的</font><font face="Times New Roman">classpath</font><font face="宋体">或者部署</font><font face="Times New Roman">JAR</font><font face="宋体">文件作为你</font><font face="Times New Roman">JRE</font><font face="宋体">的扩展。</font><font face="Times New Roman">Provider</font><font face="宋体">一定要放置在</font><font face="Times New Roman">java.security</font><font face="宋体">文件的列表里。这个文件可以再你</font><font face="Times New Roman">JDK</font><font face="宋体">或者</font><font face="Times New Roman">JRE</font><font face="宋体">安装目录的</font><font face="Times New Roman">lib/security</font><font face="宋体">目录里找到。文件里的属性以以下的形式出现：</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">security.provider.n=masterClassName</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&ldquo;<font face="Times New Roman">n</font><font face="宋体">&rdquo;用数字替代，例如</font><font face="Times New Roman">1</font><font face="宋体">或</font><font face="Times New Roman">2</font><font face="宋体">。当没有特定</font><font face="Times New Roman">provider</font><font face="宋体">的时候，会从上向下搜索获得</font><font face="Times New Roman">engine class</font><font face="宋体">的</font><font face="Times New Roman">getInstance</font><font face="宋体">方法。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&ldquo;<font face="Times New Roman">masterClassName </font><font face="宋体">&rdquo;用</font><font face="Times New Roman">provider</font><font face="宋体">包里的有资格的类全名去代替。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes"><font face="Times New Roman">JDK 6.0</font><font face="宋体">文件里指定</font><font face="Times New Roman">provider</font><font face="宋体">如下：</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">security.provider.1=sun.security.provider.Sun</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">security.provider.2=sun.security.rsa.SunRsaSign</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">security.provider.3=com.sun.net.ssl.internal.ssl.Provider</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">security.provider.4=com.sun.crypto.provider.SunJCE</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">security.provider.5=sun.security.jgss.SunProvider</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">security.provider.6=com.sun.security.sasl.Provider</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">security.provider.8=sun.security.smartcardio.SunPCSC</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">security.provider.9=sun.security.mscapi.SunMSCAPI</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">下一步，对每一个<font face="Times New Roman">engine class</font><font face="宋体">进行讲解。例子的实现使用的</font><font face="Times New Roman">SUN</font><font face="宋体">提供的包。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<span style="font-size: 10.5pt; mso-spacerun: yes">
<div class="Section0" style="layout-grid:  15.6pt none">
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: bold; font-size: 10.5pt; mso-spacerun: yes">Calculating and Verifying Message Digests<font face="宋体">（计算和验证信息摘要）</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">MessageDigest<font face="宋体">引擎类接受随意长度的</font><font face="Times New Roman">byte</font><font face="宋体">数组作为输入并计算出定长的</font><font face="Times New Roman">hash</font><font face="宋体">值，被叫做消息摘要。这是一个单向的操作。有一个消息摘要不能得到原始的输入信息。如果这样可以的话，这个世界上肯定有一个最好的压缩算法存在。因此，你可以将消息摘要看做数据的&ldquo;指纹&rdquo;，因为每一个输入集成为唯一的</font><font face="Times New Roman">hash</font><font face="宋体">值。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">现在看一看工厂建立方法。所有的引擎类都是这样创建，所以在这里详细描述。每一个引擎类都有三个静态方法：</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">static [engine class name] getInstance(String algorithm)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">static [engine class name] getInstance(String algorithm,</span><span style="font-size: 10.5pt; mso-spacerun: yes">String provider)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">static [engine class name] getInstance(String algorithm,</span><span style="font-size: 10.5pt; mso-spacerun: yes">Provider provider)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<span style="font-size: 10.5pt; mso-spacerun: yes">
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">后<font face="Times New Roman">2</font><font face="宋体">种形式的</font><font face="Times New Roman">getInstance</font><font face="宋体">方法可以指定特定的</font><font face="Times New Roman">provider</font><font face="宋体">。最后一种允许你传入一个</font><font face="Times New Roman">provider</font><font face="宋体">的实例，第二种形式允许你使用</font><font face="Times New Roman">provider</font><font face="宋体">的名字。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">&nbsp;&nbsp;  所有的字符串，包括算法都是大小写敏感的。<font face="Times New Roman">[engine class name] </font><font face="宋体">引擎类的类名代替。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<span style="font-size: 10.5pt; mso-spacerun: yes"><font face="宋体">
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">SUN<font face="宋体">提供的包里有</font><font face="Times New Roman">2</font><font face="宋体">种消息摘要算法：</font><font face="Times New Roman">MD5</font><font face="宋体">和</font><font face="Times New Roman">SHA-1</font><font face="宋体">。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">MD5<font face="宋体">算法接受参数并生成</font><font face="Times New Roman">128</font><font face="宋体">位的消息摘要。</font><font face="Times New Roman">SHA-1</font><font face="宋体">是</font><font face="Times New Roman">Secure Hash Algorithm</font><font face="宋体">的缩写，提供</font><font face="Times New Roman">160</font><font face="宋体">位的消息摘要。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<span style="font-size: 10.5pt; mso-spacerun: yes">
<div class="Section0" style="layout-grid:  15.6pt none">
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">在调用<font face="Times New Roman">getInstance</font><font face="宋体">工厂方法之后，一个已初始化的</font><font face="Times New Roman">MessageDigest </font><font face="宋体">就存在了。下一步是提供带有输入的</font><font face="Times New Roman">MessageDigest</font><font face="宋体">并计算出消息摘要。有三个方法传递输入数据到</font><font face="Times New Roman">MessageDigest</font><font face="宋体">：</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">void update(byte input)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">void update(byte[] input)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">void update(byte[] input, int offset, int len)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">第一种形式接受简单的字节输入。第二种接受字节数组，最后一种接受字节数组，并允许计算子数组的消息摘要（开始位置<font face="Times New Roman">offset</font><font face="宋体">，输入的大小是</font><font face="Times New Roman">len</font><font face="宋体">）。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<span style="font-size: 10.5pt; mso-spacerun: yes">
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">有三种方法计算消息摘要，返回字节数组。</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">byte[] digest()</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">byte[] digest(byte[] input)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">int digest(byte[] buf, int offset, int len)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">第一个<font face="Times New Roman">digest</font><font face="宋体">方法基于</font><font face="Times New Roman">update</font><font face="宋体">方法中已输入参数来计算消息摘要。第二个方法基于输入参数到方法中并返回消息摘要。第三种基于基于</font><font face="Times New Roman">update</font><font face="宋体">方法然后存储消息摘要到</font><font face="Times New Roman">buf</font><font face="宋体">字节数组并传递作为参数。</font><font face="Times New Roman">Len</font><font face="宋体">参数指定消息摘要的可用最大长度。</font><font face="Times New Roman">Offset</font><font face="宋体">指定在数组里，消息摘要从哪里开始返回值是</font><font face="Times New Roman">buf</font><font face="宋体">里存的字节的个数。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">你可以使用<font face="Times New Roman">MessageDigest</font><font face="宋体">引擎类来保证数据的完整性。假设你在编写一个全局性的数据安全性和完整性的系统组件。你要确认数据没有没更改过。一种方法就是：在传输的时候，存储这些和敏感数据对应的消息摘要。这些信息摘要值被存在基础系统里，然后每一个数据在到达目的地后，这些信息摘要可被重新计算。可以开发一个组件从基础系统里查找消息摘要并和新计算的信息摘要做比较。下面这个例子就是计算消息摘要并和已经查找到的消息摘要比较：</font></span></p>
</span>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt">import java.security.MessageDigest;<br>
&nbsp;&nbsp;&nbsp;  import java.security.NoSuchAlgorithmException;</p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt">public class MessageDigestExample {<br>
public static void main(String args[]) {<br>
&nbsp;&nbsp;  try {<br>
&nbsp;&nbsp;&nbsp;  MessageDigest sha = MessageDigest.getInstance(&quot;SHA-1&quot;);<br>
&nbsp;&nbsp;&nbsp;  byte[] data1 = { 65, 66, 67, 68, 69 };<br>
&nbsp;&nbsp;&nbsp;  byte[] data2 = { 70, 71, 72, 73, 74 };<br>
&nbsp;&nbsp;&nbsp;  sha.update(data1);<br>
&nbsp;&nbsp;&nbsp;  sha.update(data2);<br>
&nbsp;&nbsp;&nbsp;  byte[] msgDigest = sha.digest();<br>
&nbsp;&nbsp;&nbsp;  // Can also combine the final update with digest like this:<br>
&nbsp;&nbsp;&nbsp;  // byte[] msgDigest = sha.digest(data2);<br>
&nbsp;&nbsp;&nbsp;  System.out.println(&quot;--- Message Digest ---&quot;);<br>
&nbsp;&nbsp;&nbsp;  for (int i = 0; i &lt; msgDigest.length; i++) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;  System.out.print(msgDigest[i] + &quot; &quot;);<br>
&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  System.out.println(&quot;&quot;);<br>
&nbsp;&nbsp;  } catch (NoSuchAlgorithmException nsae) {<br>
&nbsp;&nbsp;&nbsp;  System.out.println(&quot;Exception: &quot; + nsae);<br>
&nbsp;&nbsp;&nbsp;  nsae.printStackTrace();<br>
&nbsp;&nbsp;  }<br>
}</p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">输出入下：</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">--- Message Digest ---</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; mso-spacerun: yes">-97 103 -17 -58 -81 -87 95 26 -17 -101 51 81 -42 -80 29 126 5 -111 -73 72</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes">这个数字数组可以重新计算并和接收端做比较来保证传递是否完整。</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<span style="font-size: 10.5pt; mso-spacerun: yes">
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: bold; font-size: 10.5pt; mso-spacerun: yes">Digital Signing and Verification of Data<font face="宋体">（数字签名和数据验证）</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">使用密钥来实现电子签名数据，使用公钥来实现签名是否被验证完成。这能保证数据来源自特定的人，这个人使用密钥来签名，就像信用卡发票签名一样。密钥用来签名一组字节，并生成一个短的、定长的签名。签名可以通过公钥验证。这个过程在下图中显示。</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">这里主要是从编程的角度来看<font face="Times New Roman">DSA</font><font face="宋体">算法。实际上，</font><font face="Times New Roman">DSA</font><font face="宋体">算法与信息摘要算法</font><font face="Times New Roman">MD5</font><font face="宋体">或者</font><font face="Times New Roman">SHA-1</font><font face="宋体">一起使用。信息摘要和密钥一起作为</font><font face="Times New Roman">DSA</font><font face="宋体">算法的输入。另一方面，数据被再一次编码成信息摘要，同时和公钥作为</font><font face="Times New Roman">DSA</font><font face="宋体">的输入来验证数据的完整性。</font></span></p>
</span>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; mso-spacerun: yes"><span style="font-size: 10.5pt; mso-spacerun: yes"><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/wiselyman/pic/item/5e80594ecc596f22b2de0565.jpg"></span></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<span style="font-size: 10.5pt; mso-spacerun: yes"><span style="font-size: 10.5pt; mso-spacerun: yes">
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">和信息摘要一样，电子签名算法也有<font face="Times New Roman">2</font><font face="宋体">个重要的原则。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">第一个原则是和密钥对应的公钥可以用来验证数据的完整性。</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">第二个原则是数字签名和公钥不暴露任何关于密钥的东西。</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">实际的签名对象可以有三种状态。如下：</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">签名状态&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  描述</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">UNINITIALIZED&nbsp;&nbsp;<font face="宋体">假定是创立之后立即的状态</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">SIGN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font face="宋体">意味着对象正在为签名初始化。在</font><font face="Times New Roman">initSign</font><font face="宋体">之后设置。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">VERIFY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font face="宋体">意味着对象已被初始化正在为验证签名。在</font><font face="Times New Roman">initVerify</font><font face="宋体">之后设置</font></span></p>
</span></span>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">SUN<font face="宋体">提供的</font><font face="Times New Roman">DSA</font><font face="宋体">算法的实现是</font><font face="Times New Roman">Digital Signature Standard (DSS)</font><font face="宋体">的一部分。</font><font face="Times New Roman">SHA-1</font><font face="宋体">和</font><font face="Times New Roman">MD5</font><font face="宋体">都能用于</font><font face="Times New Roman">DSA</font><font face="宋体">算法。引擎类的值是显而易见的。所以将消息摘要功能和数字签名功能结合是很简单的。和</font><font face="Times New Roman">MessageDigest</font><font face="宋体">引擎类一样，</font><font face="Times New Roman">Signature</font><font face="宋体">引擎类也有三个相同的</font><font face="Times New Roman">getInstance</font><font face="宋体">方法。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">一个<font face="Times New Roman">Signature</font><font face="宋体">类必须被初始化，然后使用下面方法来准备数字签名数据：</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">final void initSign(PrivateKey privateKey)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">在这个方法被调用之后，<font face="Times New Roman">Signature</font><font face="宋体">类的状态是</font><font face="Times New Roman">SIGN</font><font face="宋体">。下一步将数据发送到</font><font face="Times New Roman">Signature</font><font face="宋体">对象并实际上对数据进行签名。通过</font><font face="Times New Roman">update</font><font face="宋体">和</font><font face="Times New Roman">sign</font><font face="宋体">方法实现：</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">final void update(byte b)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">final void update(byte[] data)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">final void update(byte[] data, int offset, int len)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">//////////////////////////////////////////////////////////////////////</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">final byte[] sign()</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">final int sign(byte[] outbuf, int offset, int len)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">当<font face="Times New Roman">sign</font><font face="宋体">方法返回之后，</font><font face="Times New Roman">Signature</font><font face="宋体">对象留在</font><font face="Times New Roman">SIGN</font><font face="宋体">状态并且有了密钥，如果想有不同的密钥调用</font><font face="Times New Roman">initSign</font><font face="宋体">方法。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">另外一个操作，<font face="Times New Roman">Signature</font><font face="宋体">引擎类可以支持验证数据。</font><font face="Times New Roman">Signature</font><font face="宋体">对象必须使用</font><font face="Times New Roman">initVerify</font><font face="宋体">来验证数据：</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">final void initVerify(PublicKey publicKey)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">final void initVerify(Certificate certificate)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">
<div class="Section0" style="layout-grid:  15.6pt none">
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">Public key <font face="宋体">和 </font><font face="Times New Roman">certificate </font><font face="宋体">都能验证数字签名。在</font><font face="Times New Roman">initVerify</font><font face="宋体">调用后，</font><font face="Times New Roman">Signature</font><font face="宋体">为</font><font face="Times New Roman">VERIFY</font><font face="宋体">状态。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">Update<font face="宋体">方法用来发送数据到</font><font face="Times New Roman">Signature</font><font face="宋体">对象来做验证。用法和发送数据来签名相同。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">验证的方法被调用，然后决定数据的签名和公钥与密钥是否匹配：</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">final boolean verify(byte[] signature)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">final boolean verify(byte[] signature, int offset, int length)</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">verify<font face="宋体">返回后，</font><font face="Times New Roman">Signature</font><font face="宋体">对象留在了</font><font face="Times New Roman">VERIFY</font><font face="宋体">状态。如果想使用不同的公钥调用</font><font face="Times New Roman">initVerify</font><font face="宋体">方法。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"> </p>
<span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">一个经常使用公钥和密钥的方式是<font face="Times New Roman">:</font><font face="宋体">签名然后验证交流的源头。</font></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">例如：假定你为一个政府承包商工作，任务是构建一个安全交流系统，本质上是安全的电子邮件系统。安全的电子邮件的客户端一定要有数字签名信息发出并且有验证到达的信息的能力。产生和管理<font face="Times New Roman">key</font><font face="宋体">的细节后面讨论。假设</font><font face="Times New Roman">key</font><font face="宋体">都存在。你将开发一个有签名和验证的安全沟通：</font></span></p>
<span style="font-weight: normal; font-size: 10.5pt; mso-spacerun: yes">
<div class="Section0" style="layout-grid:  15.6pt none">
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"> </p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt">下接：<a href="http://hi.baidu.com/wiselyman/blog/item/3b4da601c3cf690c1c9583c2.html" target="_blank">1、1 JCA Design and Architecture（二）</a></p>
</div>
</span></span></div>
</span></span></div>
</span></font></span></span></div>
</span></span></span> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/wiselyman/blog/category/java%B8%DF%BC%B6">java高级</a>&nbsp;<a href="http://hi.baidu.com/wiselyman/blog/item/f512a8efcd309f1cfcfa3c6d.html#comment">查看评论</a>]]></description>
        <pubDate>2009年09月11日 星期五  17:26</pubDate>
        <category><![CDATA[java高级]]></category>
        <author><![CDATA[wiselyman]]></author>
		<guid>http://hi.baidu.com/wiselyman/blog/item/f512a8efcd309f1cfcfa3c6d.html</guid>
</item>

<item>
        <title><![CDATA[Java Security--Java安全机制]]></title>
        <link><![CDATA[http://hi.baidu.com/wiselyman/blog/item/45881f3889fcfbf8b311c7fa.html]]></link>
        <description><![CDATA[
		
		<p>Java提供了2种实现安全机制的方法：</p>
<p><strong>Java Cryptography</strong>提供给用户identification/authentication 和数字信息签名。</p>
<p><strong>Java Authentication and Authorization Services</strong> 提供了编程式的访问控制和用户授权，基于许可和安全策略授权访问程序特征。</p>
<p>安全机制的Java实现解决了很多标准的安全机制的实现，例如：访问控制（access control），公钥/私钥(public/private key)生成和管理，电子内容的签名，和电子证书的管理。</p>
<div class="tit"><strong>1、JCA 和JCE</strong></div>
<div class="date">2009年09月11日 星期五 17:13</div>
<p>
<table style="table-layout: fixed; width: 100%">
    <tbody>
        <tr>
            <td>
            <div class="cnt">
            <p>.Java Cryptography Architecture (JCA)在JDK1.1中被引进。自从最初的版本，JCA从提供电子签名和消息摘要到证书管理到粒度合理可配置的访问控制的API。</p>
            <p>安全机制实现的另外重要特性有加密数据的交流，密钥管理和互换，和消息验证代码{MessageAuthentication Code (MAC)}的支持。</p>
            <p>这些特性都可以再Java Cryptography Extension（JCE中）找到。JCE是在JDK1.4的时被集成的。</p>
            <p>将JCA和JCE的功能结合，可以让你有一个完善的安全机制和加密相关的安全需求的系统实现。</p>
            <p>&nbsp;&nbsp;  <a target="_blank" href="http://hi.baidu.com/wiselyman/blog/item/f512a8efcd309f1cfcfa3c6d.html">1、1 JCA 设计和架构</a></p>
            <p>&nbsp;&nbsp;  <a target="_blank" href="http://hi.baidu.com/wiselyman/blog/item/13869722c01109f9d7cae29a.html">1、2 Java Cryptography Extension</a></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><strong>2、使用JAAS实现安全</strong></p>
<p><strong>未完。。。</strong></p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/wiselyman/blog/category/java%B8%DF%BC%B6">java高级</a>&nbsp;<a href="http://hi.baidu.com/wiselyman/blog/item/45881f3889fcfbf8b311c7fa.html#comment">查看评论</a>]]></description>
        <pubDate>2009年09月11日 星期五  07:26</pubDate>
        <category><![CDATA[java高级]]></category>
        <author><![CDATA[wiselyman]]></author>
		<guid>http://hi.baidu.com/wiselyman/blog/item/45881f3889fcfbf8b311c7fa.html</guid>
</item>

<item>
        <title><![CDATA[给List中的整数排序]]></title>
        <link><![CDATA[http://hi.baidu.com/wiselyman/blog/item/ca800623c306aa4793580754.html]]></link>
        <description><![CDATA[
		
		ArrayList<integer> list=new ArrayList<integer>();
list.add(2);
list.add(5);
list.add(3);
Collections.sort(list) 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/wiselyman/blog/category/java%BB%F9%B4%A1">java基础</a>&nbsp;<a href="http://hi.baidu.com/wiselyman/blog/item/ca800623c306aa4793580754.html#comment">查看评论</a>]]></description>
        <pubDate>2009年09月09日 星期三  12:53</pubDate>
        <category><![CDATA[java基础]]></category>
        <author><![CDATA[wiselyman]]></author>
		<guid>http://hi.baidu.com/wiselyman/blog/item/ca800623c306aa4793580754.html</guid>
</item>


</channel>
</rss>