我设法在我的应用程序中使用Sun的MSCAPI提供程序。我现在遇到的问题是,即使我在代码中提供了密码,它也总是会弹出一个窗口,要求输入密码。这是一个问题,因为我需要Web服务中的加密功能。
这是我现在拥有的代码:
String alias = "Alias to my PK"; char[] pass = "MyPassword".toCharArray(); KeyStore ks = KeyStore.getInstance("Windows-MY"); ks.load(null, pass); Provider p = ks.getProvider(); Signature sig = Signature.getInstance("SHA1withRSA",p); PrivateKey key = (PrivateKey) ks.getKey(alias, pass) sig.initSign(key); sig.update("Testing".getBytes()); sig.sign();
这很好用,但是在最后一行运行时,我弹出一个对话框,要求输入密码。我该如何预防?
MSCAPI提供程序不支持将密码提供给CAPI:
假定必须提供密码的应用程序支持兼容模式。它允许(但忽略)非空密码。默认情况下启用该模式。(1)
要通过CAPI设置密码,您必须使用未记录的KP_KEYEXCHANGE_PIN或KP_SIGNATURE_PIN 调用CryptSetKeyParam,并希望您的基础硬件令牌提供者支持它。(它们并非完全没有文档-Windows CE和Windows Mobile的文档中提到了它们(2),它们包含在头文件中)。