How to use Java produce Signature by USBKey under CryptoAPI/CSP
Perhaps someone need to use USB-KEY or other?Hardware Token?to generate Digital Signature , through Microsoft CryptoAPI.? Perhaps MS CryptoAPI is the only way for us?to access?Cryptography Device such as USB-Key. It is sure not a comfortable way because Java developers have to?call CAPI funtions throught JNI(Java Native Interface). So?there are some java-library to?CALL?CryptoAPI, but they are not free.
I hope to provide an OpenSource Java?Library to do this thing : SecureX[https://sourceforge.net/projects/securex]
Here is some demo of what?SecureX Library could do:
1, SecureX Library Arichtecture Demo
http://dev2dev.bea.com.cn/bbs/servlet/D2DServlet/download/29304-31620-211417-3031/securex.swf
2, SecureX USB-Key Demo
http://dev2dev.bea.com.cn/bbs/servlet/D2DServlet/download/29304-31620-213693-3060/HNISI_SecureX_USBKey.swf
OK, Came back to our topic, how to use java call CryptoAPI to produce signature.
You should know at least :
1, CryptoAPI?are just?a set of interface define by MS, and USB-Key Vendor just implement these interface so that our application can call the usb key to do some cryptographic operations(eg?Signature, Hash, Encryption). There are a lot of CSPs located in your windows system. CSP is implementation,? but we need not care about it, All we care is what CryptoAPI could do. See MSDN for more information.
2, For Java developer, they should use JNI to access CryptoAPI but it is not an easy thing since there are some encoding difference between JDK and Windows. For example, they should know how to convert the binary Private?key stream to Java PrivateKey Object.
3, Perhaps some?USB-Key vendor provide PKCS#11 CSP other than CryptoAPI CSP. PKCS#?CSP is? a RSA Standard [http://www.rsasecurity.com/rsalabs/node.asp?id=2133], It will be a good optional implement instead of CryptoAPI CSP.
Back to CryptoAPI CSP:
Java developer should do such a thing to generate a signature:












before we sign, we should provide a privatekey,? in the java world, private key is stored in JKS file(Java Keystore), we could get the keyEntry out through:






But?on windows,? private key is not stored in JKS, they stored in Windows Local CertStore or in USB-Key,and in most cases, private key are not allowed to Export!
In CryptoAPI's world, you should do the following things.







So, Java developer feel boring when he need to provide the private key.
The proper way is:
1,? Use Alias to get the privatekey:
???? (a) if the private key is exportable, we can get it and change it to a Java Object
???? (b) if the private key is not exportable, we get the private key handle.
2,? Sign the Hash
????? (a) if the private key is exportable,? sigutil.initSign(privateKey) would do this job.
????? (b) if the?private key is not exportable, we?pass?the?private key handle to CSP,?
and let CSP get the privatekey internally.
????
The program below is running under securex, and it can get the privatekey from
usb-key, and sign the data:



























































































How's it done?
1) Well, Suppose I USE an?USB E-Key(CSP Vendor:吉大正元www.jit.com.cn)
I know my PrivateKey Alias is? ,? Locate In "My"
I?get the private key?through CoreKeyStoreJNI Class which has native jni method(getKey), by which?I could
tell the csp which private key i want to use!
2) I get the file to byteArray which must be Hash before sign, because for Microsoft CAPI,? its signobject can accept hash object only.
3) when the

type the correct PIN , My JIT CSP will call the correct sign cryptographic operations through the?USB EKey drivers.
All the cryptographic operations(Hash, Sign) are performed on the USB-Key INTERNALLY, NOT by the KEY Drivers.
OK,then CSP get the signature and Signature Verify use only the Public Key?and need not access the private key, It can?perform by CSP or verify using JCE, as you like.
4) Haha, I've not yet told you that you need a DLL to Load before you call these API. Wait till I put my whole?project?to sourceforege?SecureX(http://securex.sourceforge.net/). Any Advice, please contact me on this blog or just join the QQ Group: 14966586
posted on 2006-07-11 13:24 david.turing 閱讀(7007) 評論(1) 編輯 收藏 所屬分類: Security領域 、BounyCastle&JCE