Revisando el changlog de Java 6, me he encontrado con una grata sorpresa.
Hasta ahora para acceder a los servicios de criptografía que ofrece Windows( y sus drivers instalado) era necesario recurrir al uso de JNI y programar las rutinas necesarias en C++.
Hace un año realizamos esa implementación pero resulto ser demasiado inestable, por lo que quedo en el olvido.
Ahora veo que en la lista de features que trae Java 6, tenemos:
6318171: Enable access to Microsoft CryptoAPI (CAPI) keystores and cryptographic operations
Por lo que se simplifica drásticamente el desarrollo de este tipo de soluciones. Ejemplo extraído de la documentación oficial de Java 6:
KeyStore ks = KeyStore.getInstance("Windows-MY"); // Note: When a security manager is installed, // the following call requires SecurityPermission // "authProvider.SunMSCAPI". ks.load(null, null); byte[] data = ... String alias = "myRSA"; PrivateKey privKey = (PrivateKey) ks.getKey(alias, null); Certificate cert = ks.getCertificate(alias); Provider p = ks.getProvider(); Signature sig = Signature.getInstance("SHA1withRSA", p); sig.initSign(privKey); sig.update(data); byte[] signature = sig.sign(); System.out.println("tGenerated signature..."); sig.initVerify(cert); sig.update(data); if (sig.verify(signature)) { System.out.println("tSignature verified!"); }