﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-David.Turing's Security Blog-随笔分类-BounyCastle&amp;JCE</title><link>http://www.blogjava.net/security/category/11353.html</link><description>Java Security, CAPICOM, CryptoAPI/CSP, BouncyCastle, Openssl, JCE/JCA, SSO, CAS, Tivoli, CA, PKI
&lt;br&gt;
&lt;font color="#00f100"&gt;本站内容只兼容IE浏览器&lt;/font&gt;
&lt;br&gt;
&lt;font color="#00f100"&gt;重要的文章包均含本人的PGP签名，本人愿意对自己的言论负责&lt;/font&gt;
&lt;br&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 10:19:27 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 10:19:27 GMT</pubDate><ttl>60</ttl><item><title>重新实现JCAPI的JCE Provider</title><link>http://www.blogjava.net/security/archive/2006/07/18/JCE_Provider_For_crytpoAPI.html</link><dc:creator>david.turing</dc:creator><author>david.turing</author><pubDate>Tue, 18 Jul 2006 04:06:00 GMT</pubDate><guid>http://www.blogjava.net/security/archive/2006/07/18/JCE_Provider_For_crytpoAPI.html</guid><wfw:comment>http://www.blogjava.net/security/comments/58720.html</wfw:comment><comments>http://www.blogjava.net/security/archive/2006/07/18/JCE_Provider_For_crytpoAPI.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/security/comments/commentRss/58720.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/security/services/trackbacks/58720.html</trackback:ping><description><![CDATA[The Pheox JCAPI (<a href="http://pheox.com/download">http://pheox.com/download</a>) 提供一个JCE Provider可以直接操作Microsoft 操作系统本地证书库/私钥的。JCAPI用一个jcapi.dll封装了这些复杂性，这个dll负责调用Windows内置的CSP来完成加密签名哈希等密码运算。<br />JCAPI.DLL属于轻量级的中间层类库，它让Java开发者免去对待CSP的细节，比如获得一个CSP的Handle。<br />JCAPI.dll提供了下面的JNI调用：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">00000001</span><span style="COLOR: #000000">    10002AA0    _Java_com_pheox_jcapi_CoreCipherJNI_decrypt@</span><span style="COLOR: #000000">24</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000002</span><span style="COLOR: #000000">    100021A0    _Java_com_pheox_jcapi_CoreCipherJNI_encrypt@</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000003</span><span style="COLOR: #000000">    100027A0    _Java_com_pheox_jcapi_CoreCipherJNI_encryptWithPrivateKey@</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000004</span><span style="COLOR: #000000">    10001E10    _Java_com_pheox_jcapi_CoreCipherJNI_getPrivateKeySize@</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000005</span><span style="COLOR: #000000">    </span><span style="COLOR: #000000">10003610</span><span style="COLOR: #000000">    _Java_com_pheox_jcapi_CoreKeyStoreJNI_aliases@</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000006</span><span style="COLOR: #000000">    100039D0    _Java_com_pheox_jcapi_CoreKeyStoreJNI_containsAlias@</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000007</span><span style="COLOR: #000000">    10005E50    _Java_com_pheox_jcapi_CoreKeyStoreJNI_createBase64Hash@</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000008</span><span style="COLOR: #000000">    10003B30    _Java_com_pheox_jcapi_CoreKeyStoreJNI_deleteEntry@</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000009</span><span style="COLOR: #000000">    10003DA0    _Java_com_pheox_jcapi_CoreKeyStoreJNI_getCertificate@</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000"><br />0000000A    10003FE0    _Java_com_pheox_jcapi_CoreKeyStoreJNI_getCertificateChain@</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000"><br />0000000B    </span><span style="COLOR: #000000">10004530</span><span style="COLOR: #000000">    _Java_com_pheox_jcapi_CoreKeyStoreJNI_getKey@</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000"><br />0000000C    10004C00    _Java_com_pheox_jcapi_CoreKeyStoreJNI_isKeyEntry@</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000"><br />0000000D    10004E00    _Java_com_pheox_jcapi_CoreKeyStoreJNI_setCertificateEntry@</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000"><br />0000000E    </span><span style="COLOR: #000000">10005020</span><span style="COLOR: #000000">    _Java_com_pheox_jcapi_CoreKeyStoreJNI_setKeyEntry@</span><span style="COLOR: #000000">44</span><span style="COLOR: #000000"><br />0000000F    10005CA0    _Java_com_pheox_jcapi_CoreKeyStoreJNI_size@</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000010</span><span style="COLOR: #000000">    100062A0    _Java_com_pheox_jcapi_CoreSignatureJNI_hashFinal@</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000011</span><span style="COLOR: #000000">    10005F80    _Java_com_pheox_jcapi_CoreSignatureJNI_hashInit@</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000012</span><span style="COLOR: #000000">    </span><span style="COLOR: #000000">10006140</span><span style="COLOR: #000000">    _Java_com_pheox_jcapi_CoreSignatureJNI_hashUpdate@</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000013</span><span style="COLOR: #000000">    </span><span style="COLOR: #000000">10006430</span><span style="COLOR: #000000">    _Java_com_pheox_jcapi_CoreSignatureJNI_sign@</span><span style="COLOR: #000000">28</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000014</span><span style="COLOR: #000000">    10006F60    _Java_com_pheox_jcapi_CoreSignatureJNI_verify@</span><span style="COLOR: #000000">28</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000015</span><span style="COLOR: #000000">    10007CF0    _Java_com_pheox_jcapi_CoreUtilJNI_addPKCS11CSP@</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000016</span><span style="COLOR: #000000">    </span><span style="COLOR: #000000">10007880</span><span style="COLOR: #000000">    _Java_com_pheox_jcapi_CoreUtilJNI_createCertEntryStore@</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000017</span><span style="COLOR: #000000">    10007C20    _Java_com_pheox_jcapi_CoreUtilJNI_getAddedPKCS11CSPs@</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000018</span><span style="COLOR: #000000">    100078E0    _Java_com_pheox_jcapi_CoreUtilJNI_getCSP@</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000019</span><span style="COLOR: #000000">    10008F10    _Java_com_pheox_jcapi_CoreUtilJNI_getCertStoreFriendlyName@</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000"><br />0000001A    100089C0    _Java_com_pheox_jcapi_CoreUtilJNI_getCertificateFriendlyName@</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000"><br />0000001B    </span><span style="COLOR: #000000">10007500</span><span style="COLOR: #000000">    _Java_com_pheox_jcapi_CoreUtilJNI_getJCAPIDLLVersion@</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000"><br />0000001C    </span><span style="COLOR: #000000">10007520</span><span style="COLOR: #000000">    _Java_com_pheox_jcapi_CoreUtilJNI_getMSCSPs@</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000"><br />0000001D    </span><span style="COLOR: #000000">10009010</span><span style="COLOR: #000000">    _Java_com_pheox_jcapi_CoreUtilJNI_getMSCertStoreNames@</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000"><br />0000001E    10007E20    _Java_com_pheox_jcapi_CoreUtilJNI_getPKCS11DLLName@</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000"><br />0000001F    100083F0    _Java_com_pheox_jcapi_CoreUtilJNI_getPKCS11TokenInfo@</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000020</span><span style="COLOR: #000000">    10007B50    _Java_com_pheox_jcapi_CoreUtilJNI_getSupportedPKCS11CSPs@</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000021</span><span style="COLOR: #000000">    100077A0    _Java_com_pheox_jcapi_CoreUtilJNI_init@</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000022</span><span style="COLOR: #000000">    10007F40    _Java_com_pheox_jcapi_CoreUtilJNI_isPKCS11PrivateKey@</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000023</span><span style="COLOR: #000000">    10007D90    _Java_com_pheox_jcapi_CoreUtilJNI_removePKCS11CSP@</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000024</span><span style="COLOR: #000000">    10008F90    _Java_com_pheox_jcapi_CoreUtilJNI_reportMemStatus@</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000025</span><span style="COLOR: #000000">    </span><span style="COLOR: #000000">10008360</span><span style="COLOR: #000000">    _Java_com_pheox_jcapi_CoreUtilJNI_setCallbackPinCode@</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000026</span><span style="COLOR: #000000">    100083B0    _Java_com_pheox_jcapi_CoreUtilJNI_setCertOpenStoreFlags@</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">00000027</span><span style="COLOR: #000000">    10008C80    _Java_com_pheox_jcapi_CoreUtilJNI_setCertificateFriendlyName@</span><span style="COLOR: #000000">16</span></div>它调用的类库其实还是crypt32.dll和ADVAPI32.dll.<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">crypt32.dll:<br />0000002C    CertEnumSystemStore<br /></span><span style="COLOR: #000000">00000041</span><span style="COLOR: #000000">    CertGetCertificateContextProperty<br />0000008B    CryptFindLocalizedName<br /></span><span style="COLOR: #000000">00000056</span><span style="COLOR: #000000">    CertRegisterSystemStore<br /></span><span style="COLOR: #000000">00000097</span><span style="COLOR: #000000">    CryptHashCertificate<br /></span><span style="COLOR: #000000">00000061</span><span style="COLOR: #000000">    CertSetCertificateContextProperty<br /></span><span style="COLOR: #000000">00000019</span><span style="COLOR: #000000">    CertCreateCertificateContext<br /></span><span style="COLOR: #000000">00000004</span><span style="COLOR: #000000">    CertAddCertificateContextToStore<br /></span><span style="COLOR: #000000">00000044</span><span style="COLOR: #000000">    CertGetIssuerCertificateFromStore<br />0000001E    CertDeleteCertificateFromStore<br /></span><span style="COLOR: #000000">00000029</span><span style="COLOR: #000000">    CertEnumCertificatesInStore<br />0000007C    CryptDecodeObject<br />0000009C    CryptImportPublicKeyInfo<br /></span><span style="COLOR: #000000">00000050</span><span style="COLOR: #000000">    CertOpenStore<br /></span><span style="COLOR: #000000">00000032</span><span style="COLOR: #000000">    CertFindCertificateInStore<br />0000000F    CertCloseStore<br />0000003C    CertFreeCertificateContext</span></div><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">导入, ADVAPI32.dll<br />顺序 (示意)    名字<br />000000A8    CryptSignHashA<br /></span><span style="COLOR: #000000">00000099</span><span style="COLOR: #000000">    CryptGetHashParam<br />0000008B    CryptDestroyHash<br />0000009D    CryptHashData<br /></span><span style="COLOR: #000000">00000088</span><span style="COLOR: #000000">    CryptCreateHash<br /></span><span style="COLOR: #000000">00000094</span><span style="COLOR: #000000">    CryptExportKey<br /></span><span style="COLOR: #000000">00000089</span><span style="COLOR: #000000">    CryptDecrypt<br />0000009F    CryptImportKey<br />0000008F    CryptEncrypt<br />0000009C    CryptGetUserKey<br />0000009A    CryptGetKeyParam<br />0000008C    CryptDestroyKey<br /></span><span style="COLOR: #000000">00000085</span><span style="COLOR: #000000">    CryptAcquireContextA<br />000000A0    CryptReleaseContext<br />000000AA    CryptVerifySignatureA<br /></span><span style="COLOR: #000000">00000092</span><span style="COLOR: #000000">    CryptEnumProvidersA<br />000001C9    RegCloseKey<br />000001EC    RegQueryValueExA<br />000001F9    RegSetValueExA<br />000001CD    RegCreateKeyExA<br />000001E2    RegOpenKeyExA<br />000000A1    CryptSetHashParam</span></div><br />在标准的CryptoAPI函数上的封装是有必要的，因为从Java程序员的角度，我们不需要太关心CSP，我们希望直接进行Cryptography运算。<br /><br />JCAPI这个provider提供3个SPI的实现，<br /><li><code>java.security.KeyStoreSpi</code></li><li><code>java.security.SignatureSpi</code></li><li><code>javax.crypto.CipherSpi</code><br /><br />也就是，我们通过Java应用程序可以直接借助于JCE API来调用CryptoAPI。 
<p>这个JCE API算法支持下面的基本操作</p><ul><li>Add, remove, list and access X.509 certificates. 
</li><li>Add, remove, access and export RSA private keys. 
</li><li>Create signatures with RSA private keys using the following algorithms: 
<ul><li>SHA1withRSA 
</li><li>MD5withRSA 
</li><li>MD2withRSA </li></ul></li><li>Verify signatures with RSA public keys. 
</li><li>Encrypt/decrypt data with RSA public/private keys using the following algorithm, mode and padding: 
<ul><li>RSA/ECB/PKCS1Padding </li></ul></li><li>Wrap and unwrap symmetric- and asymmetric keys with RSA key pairs through MS CAPI and PKCS#11. 
</li><li>Built-in support for tested PKCS#11 CSP manufacturers that is compliant with the functions required by JCAPI. 
</li><li>Dynamically adding/removing of PKCS#11 CSPs into JCAPI. 
</li><li>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. 
</li><li>List and configure MS CAPI system (certificate) stores. 
</li><li>Use a MS CAPI system (certificate) store as an un-trusted store. 
</li><li>Set and get MS CAPI friendly names for certificates. 
</li><li>Get MS CAPI friendly names for system (certificate) stores. 
</li><li>Get detailed information about your PKCS#11 hardware token through the JCAPI PKCS#11 information class. 
</li><li>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. 
</li><li>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. 
</li><li>JCAPI X.509 Factory plug-in. Use this plug-in to transparently replace any other X.509 certificate factories used by your Java system. 
</li><li>JCAPI is signed with a qualified code signing certificate that is trusted by all modern web browsers which makes it suitable in trusted applets. </li></ul><p>JCE API支持一下的系统，我只是在Windows2000上测试通过，其他平台我不能保证破解能正常使用。 </p><ul><li>Windows 98 
</li><li>Windows 98 SE 
</li><li>Windows ME 
</li><li>Windows 2000 
</li><li>Windows XP </li></ul><p>JCE 支持JDK1.4以上，JDK1.3稍微为麻烦，要自己配制JCE和JSSE </p><ul><li>Java 1.3.1 with JCE 1.2.2 and JSSE 1.0.3 
</li><li>Java 1.4 
</li><li>Java 1.5 </li></ul><p>我已经在吉大正元的eSafe钥匙上通过测试，其他钥匙提供商可以发邮件给我，或者给Usb钥匙我去测试。<br /><br />JCAPI的时间限制比较容易去除，但由于JNI层以上的代码做了大量混淆，我不得不重写这个JCE Provider，最起码要实现<font face="Courier New">KeyStoreSpi，SignatureSpi和CipherSpi。</font></p></li><li><p>JCAPI的JCE Provider我将会在下个月提供</p></li><img src ="http://www.blogjava.net/security/aggbug/58720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/security/" target="_blank">david.turing</a> 2006-07-18 12:06 <a href="http://www.blogjava.net/security/archive/2006/07/18/JCE_Provider_For_crytpoAPI.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>How to use Java produce Signature by USBKey under CryptoAPI/CSP</title><link>http://www.blogjava.net/security/archive/2006/07/11/java_cryptoapi_csp_signature.html</link><dc:creator>david.turing</dc:creator><author>david.turing</author><pubDate>Tue, 11 Jul 2006 05:24:00 GMT</pubDate><guid>http://www.blogjava.net/security/archive/2006/07/11/java_cryptoapi_csp_signature.html</guid><wfw:comment>http://www.blogjava.net/security/comments/57638.html</wfw:comment><comments>http://www.blogjava.net/security/archive/2006/07/11/java_cryptoapi_csp_signature.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/security/comments/commentRss/57638.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/security/services/trackbacks/57638.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: How to use Java produce Signature by USBKey under CryptoAPI/CSP.&nbsp;&nbsp;<a href='http://www.blogjava.net/security/archive/2006/07/11/java_cryptoapi_csp_signature.html'>阅读全文</a><img src ="http://www.blogjava.net/security/aggbug/57638.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/security/" target="_blank">david.turing</a> 2006-07-11 13:24 <a href="http://www.blogjava.net/security/archive/2006/07/11/java_cryptoapi_csp_signature.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hacking getcsp of pheox</title><link>http://www.blogjava.net/security/archive/2006/07/04/56609.html</link><dc:creator>david.turing</dc:creator><author>david.turing</author><pubDate>Tue, 04 Jul 2006 14:52:00 GMT</pubDate><guid>http://www.blogjava.net/security/archive/2006/07/04/56609.html</guid><wfw:comment>http://www.blogjava.net/security/comments/56609.html</wfw:comment><comments>http://www.blogjava.net/security/archive/2006/07/04/56609.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/security/comments/commentRss/56609.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/security/services/trackbacks/56609.html</trackback:ping><description><![CDATA[<p>package com.pheox.jcapi.test;</p>
		<p>import com.pheox.jcapi.CoreSignatureJNI;<br />import com.pheox.jcapi.CoreUtilJNI;<br />import com.pheox.jcapi.JCAPIJNIException;</p>
		<p>public class getcsp {<br /> <br />    public static void main(String[] args) {<br />     <br />//        String g = "MIIDrTCCA2ugAwIBAgICAeYwCwYHKoZIzjgEAwUAMIGQMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEjAQBgNVBAcTCVBhbG8gQWx0bzEdMBsGA1UEChMUU3VuIE1pY3Jvc3lzdGVtcyBJbmMxIzAhBgNVBAsTGkphdmEgU29mdHdhcmUgQ29kZSBTaWduaW5nMRwwGgYDVQQDExNKQ0UgQ29kZSBTaWduaW5nIENBMB4XDTA1MDEyMTIyNDc1MloXDTEwMDEyNTIyNDc1MlowVDEdMBsGA1UEChMUU3VuIE1pY3Jvc3lzdGVtcyBJbmMxIzAhBgNVBAsTGkphdmEgU29mdHdhcmUgQ29kZSBTaWduaW5nMQ4wDAYDVQQDEwVQaGVveDCCAbgwggEsBgcqhkjOOAQBMIIBHwKBgQD9f1OBHXUSKVLfSpwu7OTn9hG3UjzvRADDHj+AtlEmaUVdQCJR+1k9jVj6v8X1ujD2y5tVbNeBO4AdNG/yZmC3a5lQpaSfn+gEexAiwk+7qdf+t8Yb+DtX58aophUPBPuD9tPFHsMCNVQTWhaRMvZ1864rYdcq7/IiAxmd0UgBxwIVAJdgUI8VIwvMspK5gqLrhAvwWBz1AoGBAPfhoIXWmz3ey7yrXDa4V7l5lK+7+jrqgvlXTAs9B4JnUVlXjrrUWU/mcQcQgYC0SRZxI+hMKBYTt88JMozIpuE8FnqLVHyNKOCjrh4rs6Z1kW6jfwv6ITVi8ftiegEkO8yk8b6oUZCJqIPf4VrlnwaSi2ZegHtVJWQBTDv+z0kqA4GFAAKBgQD2cHtWHnwO9pOZx9H0uUoLZGKE3iwvVAkUwzVqVEgT4fMG70icn2dII/RABPtXW6Zai87iIg7zC975qeeEznBee7ll/8HFFe8H4IL3tPCf+/TigELMORl3ySd8lzD1mEZMYUL6Rc16T3ZJ3iUxfrJJiN815SZ8qrDkHAtS1Hhot6OBjTCBijARBglghkgBhvhCAQEEBAMCBBAwDgYDVR0PAQH/BAQDAgXgMB0GA1UdDgQWBBRkqtvyzwWOJd+aZikkKKFLDTaqbDAfBgNVHSMEGDAWgBRl4vSGydNO8JFOWKJq9dh4WprBpjAlBgNVHREEHjAcgRp0b21teS5ncmFuZGVmb3JzQHBoZW94LmNvbTALBgcqhkjOOAQDBQADLwAwLAIUdTerIDsy5CLjjPffwoO4rYWZ4kECFAyrKdfe2Qj5T5MWse9EhMD951Wt";</p>
		<p>  try {<br />   System.loadLibrary("JCAPI");<br />   System.out.println("Load Library Successfully!");<br />  } catch(UnsatisfiedLinkError e) {</p>
		<p>   e.printStackTrace();<br />  }<br />  CoreUtilJNI core=new CoreUtilJNI();<br />  <br />  String[] mscsp=core.getMSCSP();<br />  <br />  for(int i=0;i&lt;mscsp.length;i++)<br />   System.out.println(mscsp[i]);<br />  System.out.println("done");<br />  <br />  <br />  String content="1234567890abcdefghij+sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss";<br />  <br />  byte[] data = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};<br />  <br />  data=content.getBytes();<br />  <br />  try<br />        {<br />            int[] d= CoreSignatureJNI.hashInit("SHA1");<br />            CoreSignatureJNI.hashUpdate(d, data);<br />            byte abyte1[] = CoreSignatureJNI.hashFinal(d);<br />            <br />            System.out.println(""+new String(abyte1));<br />            return;<br />        }<br />        catch(JCAPIJNIException jcapijniexception)<br />        {<br />         jcapijniexception.printStackTrace();<br />        }<br />  <br />  <br />  <br />  <br />  <br /> }</p>
		<p>}<br /></p><img src ="http://www.blogjava.net/security/aggbug/56609.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/security/" target="_blank">david.turing</a> 2006-07-04 22:52 <a href="http://www.blogjava.net/security/archive/2006/07/04/56609.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java KeyStore的类型</title><link>http://www.blogjava.net/security/archive/2006/05/22/Java_KeyStore_Type.html</link><dc:creator>david.turing</dc:creator><author>david.turing</author><pubDate>Sun, 21 May 2006 17:57:00 GMT</pubDate><guid>http://www.blogjava.net/security/archive/2006/05/22/Java_KeyStore_Type.html</guid><wfw:comment>http://www.blogjava.net/security/comments/47396.html</wfw:comment><comments>http://www.blogjava.net/security/archive/2006/05/22/Java_KeyStore_Type.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/security/comments/commentRss/47396.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/security/services/trackbacks/47396.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 总结各种Java KeyStoreType&nbsp;&nbsp;<a href='http://www.blogjava.net/security/archive/2006/05/22/Java_KeyStore_Type.html'>阅读全文</a><img src ="http://www.blogjava.net/security/aggbug/47396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/security/" target="_blank">david.turing</a> 2006-05-22 01:57 <a href="http://www.blogjava.net/security/archive/2006/05/22/Java_KeyStore_Type.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>计算HMAC</title><link>http://www.blogjava.net/security/archive/2006/05/21/java_hmac_sample.html</link><dc:creator>david.turing</dc:creator><author>david.turing</author><pubDate>Sun, 21 May 2006 09:05:00 GMT</pubDate><guid>http://www.blogjava.net/security/archive/2006/05/21/java_hmac_sample.html</guid><wfw:comment>http://www.blogjava.net/security/comments/47303.html</wfw:comment><comments>http://www.blogjava.net/security/archive/2006/05/21/java_hmac_sample.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/security/comments/commentRss/47303.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/security/services/trackbacks/47303.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">Message Authentication Code (MAC)</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是用于确信信息在传输过程中没有被修改过，体现了信息完整性，</span>
				<span lang="EN-US">MAC</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有很多种算法，大部分算法用于简单的场景（如文件传输），他们都有效，但如果用于都未曾考虑会被恶意攻击的情况，在密码学领域中，更多被应用的是</span>
				<span lang="EN-US">HMAC</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span>
				<span lang="EN-US">HMAC</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">更安全，因为它是基于</span>
				<span lang="EN-US">Key</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的。</span>
				<span lang="EN-US">HMAC</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是使用诸如</span>
				<span lang="EN-US">MD5,SHA-1</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等散列算法构造</span>
				<span lang="EN-US">MAC</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">HMAC</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在这样一种场景中被应用：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">巴赫尔、穆罕默德是为伊拉克临时政府中不同的伊斯兰派系，由于美国已经在伊拉克设置了大量情报机构，他们担心政府部内部文件在网络传输可能被美国情报局修改，考虑起见，巴赫尔、穆罕默德决定使用</span>
				<span lang="EN-US">MAC</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">技术：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">1，<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">他们商榷一个简单的密钥</span>
				<span lang="EN-US">Key1</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">2，<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">他们商榷一种可靠的</span>
				<span lang="EN-US">HMAC</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">算法，如</span>
				<span lang="EN-US">HMACSHA1</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">3，<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">他们每次发送政府审批报告前，都用</span>
				<span lang="EN-US">HMACSHA1</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行计算，并将该</span>
				<span lang="EN-US">hmac</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">值</span>
				<span lang="EN-US">x1</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">附带发送给对方</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">4，<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对方接收到文件，将文件进行一次</span>
				<span lang="EN-US">HMAC</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的计算，得出新的</span>
				<span lang="EN-US">hmac</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">值</span>
				<span lang="EN-US">x2</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，对比</span>
				<span lang="EN-US">x1</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">x2</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，可以知道文件是否在中途被修改过。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注意，上述的步骤如果不考虑恶意攻击者，可以使用消息摘要，恶意攻击者可以修改你的文件，然后重新帮你计算摘要，最后替换你的摘要：（</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关于</span>
				<span lang="EN-US">HMAC</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的更多标准，可以参考</span>
				<span lang="EN-US">RFC2104</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span>
		</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">package</span>
				<span style="COLOR: #000000"> org.dev2dev.security.test.mac;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.io.File;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.io.IOException;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.security.InvalidKeyException;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.security.NoSuchAlgorithmException;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.crypto.KeyGenerator;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.crypto.Mac;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.crypto.SecretKey;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> org.dev2dev.common.FileUtils;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_330_1275_Open_Image" onclick="this.style.display='none'; Codehighlighter1_330_1275_Open_Text.style.display='none'; Codehighlighter1_330_1275_Closed_Image.style.display='inline'; Codehighlighter1_330_1275_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_330_1275_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_330_1275_Closed_Text.style.display='none'; Codehighlighter1_330_1275_Open_Image.style.display='inline'; Codehighlighter1_330_1275_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> TestHmac</span>
				<span id="Codehighlighter1_330_1275_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_330_1275_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_334_357_Open_Image" onclick="this.style.display='none'; Codehighlighter1_334_357_Open_Text.style.display='none'; Codehighlighter1_334_357_Closed_Image.style.display='inline'; Codehighlighter1_334_357_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_334_357_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_334_357_Closed_Text.style.display='none'; Codehighlighter1_334_357_Open_Image.style.display='inline'; Codehighlighter1_334_357_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span>
						<span id="Codehighlighter1_334_357_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span>
						<span id="Codehighlighter1_334_357_Open_Text">
								<span style="COLOR: #008000">/**</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  * </span>
								<span style="COLOR: #808080">@param</span>
								<span style="COLOR: #008000"> args<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  </span>
								<span style="COLOR: #008000">*/</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img id="Codehighlighter1_399_1272_Open_Image" onclick="this.style.display='none'; Codehighlighter1_399_1272_Open_Text.style.display='none'; Codehighlighter1_399_1272_Closed_Image.style.display='inline'; Codehighlighter1_399_1272_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_399_1272_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_399_1272_Closed_Text.style.display='none'; Codehighlighter1_399_1272_Open_Image.style.display='inline'; Codehighlighter1_399_1272_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">static</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> main(String[] args) </span>
						<span id="Codehighlighter1_399_1272_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_399_1272_Open_Text">
								<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_410_1130_Open_Image" onclick="this.style.display='none'; Codehighlighter1_410_1130_Open_Text.style.display='none'; Codehighlighter1_410_1130_Closed_Image.style.display='inline'; Codehighlighter1_410_1130_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_410_1130_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_410_1130_Closed_Text.style.display='none'; Codehighlighter1_410_1130_Open_Image.style.display='inline'; Codehighlighter1_410_1130_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />     </span>
								<span style="COLOR: #0000ff">try</span>
								<span style="COLOR: #000000"> </span>
								<span id="Codehighlighter1_410_1130_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_410_1130_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">首先需要生成Hmac的key，有比较多种方法，HmacSHA1，算法类型可以参考<a class="" title="KeyGenerator算法列表" href="/openssl/articles/SUNJCE_agorithm.html" target="_blank">KeyGenerator算法列表</a></span> <br /><span style="COLOR: #008000">              // 本例子用KeyGenerator生成key，实际上,key可以保存起来，也可以被分发给其他人<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">         KeyGenerator keyGen </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> KeyGenerator.getInstance(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">HmacMD5</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">); </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">         SecretKey key </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> keyGen.generateKey();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         Mac mac </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Mac.getInstance(key.getAlgorithm());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         mac.init(key);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />             <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         File infile</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> File(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">c:\\1.txt</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] inputbyte</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /><img id="Codehighlighter1_774_831_Open_Image" onclick="this.style.display='none'; Codehighlighter1_774_831_Open_Text.style.display='none'; Codehighlighter1_774_831_Closed_Image.style.display='inline'; Codehighlighter1_774_831_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_774_831_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_774_831_Closed_Text.style.display='none'; Codehighlighter1_774_831_Open_Image.style.display='inline'; Codehighlighter1_774_831_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_774_831_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_774_831_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    inputbyte </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> FileUtils.getBytesFromFile(infile);<br /><img id="Codehighlighter1_855_885_Open_Image" onclick="this.style.display='none'; Codehighlighter1_855_885_Open_Text.style.display='none'; Codehighlighter1_855_885_Closed_Image.style.display='inline'; Codehighlighter1_855_885_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_855_885_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_855_885_Closed_Text.style.display='none'; Codehighlighter1_855_885_Open_Image.style.display='inline'; Codehighlighter1_855_885_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   }</span></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (IOException e) </span><span id="Codehighlighter1_855_885_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_855_885_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    e.printStackTrace();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />   }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] digest </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> mac.doFinal(inputbyte);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> If desired, convert the digest into a string</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">         String HmacB64 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> sun.misc.BASE64Encoder().encode(digest);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         System.out.println(</span><span style="COLOR: #000000">"计算的HMAC </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span> Hmac<span style="COLOR: #000000">B64);<br /><img id="Codehighlighter1_1162_1196_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1162_1196_Open_Text.style.display='none'; Codehighlighter1_1162_1196_Closed_Image.style.display='inline'; Codehighlighter1_1162_1196_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1162_1196_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1162_1196_Closed_Text.style.display='none'; Codehighlighter1_1162_1196_Open_Image.style.display='inline'; Codehighlighter1_1162_1196_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />     }</span></span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">catch</span>
								<span style="COLOR: #000000"> (InvalidKeyException e) </span>
								<span id="Codehighlighter1_1162_1196_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_1162_1196_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      e.printStackTrace();<br /><img id="Codehighlighter1_1233_1267_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1233_1267_Open_Text.style.display='none'; Codehighlighter1_1233_1267_Closed_Image.style.display='inline'; Codehighlighter1_1233_1267_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1233_1267_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1233_1267_Closed_Text.style.display='none'; Codehighlighter1_1233_1267_Open_Image.style.display='inline'; Codehighlighter1_1233_1267_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />     }</span>
								</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">catch</span>
								<span style="COLOR: #000000"> (NoSuchAlgorithmException e) </span>
								<span id="Codehighlighter1_1233_1267_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_1233_1267_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      e.printStackTrace();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />     }</span>
								</span>
								<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div><img src ="http://www.blogjava.net/security/aggbug/47303.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/security/" target="_blank">david.turing</a> 2006-05-21 17:05 <a href="http://www.blogjava.net/security/archive/2006/05/21/java_hmac_sample.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>