【问题标题】:Java security - MSCAPI provider: How to use without password popup?Java 安全 - MSCAPI 提供程序:如何在不弹出密码的情况下使用?
【发布时间】:2009-01-30 12:39:38
【问题描述】:

我已经设法在我的应用程序中使用了Sun's MSCAPI provider。我现在遇到的问题是它总是弹出一个窗口,要求输入密码,即使我已经在代码中提供了密码。这是个问题,因为我需要网络服务中的加密功能。

这是我现在拥有的代码:

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();

这很好用,但是当最后一行运行时,我会弹出一个询问密码的窗口。我该如何预防?

【问题讨论】:

    标签: java security cryptography cryptoapi


    【解决方案1】:

    MSCAPI 提供程序不支持向 CAPI 提供密码:

    假定必须提供密码的应用程序支持兼容模式。它允许(但忽略)非空密码。该模式默认启用。 (1)

    要通过 CAPI 设置密码,您必须使用未记录的 KP_KEYEXCHANGE_PIN 或 KP_SIGNATURE_PIN 调用 CryptSetKeyParam,并希望您的底层硬件令牌提供商支持它。 (它们并非完全没有文档 - Windows CE 和 Windows Mobile 的文档提到它们(2) 并且它们包含在头文件中)。

    【讨论】:

    【解决方案2】:

    我的猜测是 Windows 正在弹出弹出窗口。

    使用证书导入向导再次导入您的密钥,但请确保您没有选中“密码”屏幕上的以下选项。

    [_] 启用强私钥保护。如果启用此选项,则每次应用程序使用私钥时都会提示您。

    【讨论】:

    • 感谢您的回答,但我无法重新导入证书,因为它不是文件,而是我正在使用的硬件令牌。
    • Java 代码中的密码为空。当我第一次将令牌插入 USB 并运行 Java 应用程序时,会显示来自令牌中间件的弹出窗口并且可以访问私钥。但是当我第二次或更多次运行应用程序时,应用程序会冻结。我必须再次删除并插入令牌。
    【解决方案3】:

    我解决了这个问题,设置提供者如下:

    signeData = gen.generate(content, ks.getProvider());

    在哪里

    ksKeyStore

    genCMSSignedDataGenerator

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-20
      • 2018-12-14
      • 1970-01-01
      • 2018-11-03
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多