gpt4 book ai didi

java - 使用 SunMSCAPI 签署文档并抑制 "Enter PIN"对话框

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:01:14 28 4
gpt4 key购买 nike

我正在开发一个使用证书 token 签署文档的 Java 代码。到目前为止,一切都很好,但我想取消“输入 pin”对话框,因为我正在存储用户的 pin,这样他/她就不需要每次都输入它。这里真正的问题是这段代码将以批处理模式运行(没有用户交互)。我知道一旦输入, key 可能在内存中,因此短时间内不需要再次输入。但我不能依赖它,我需要提供 PIN 码。这是我目前的代码(它只是一个示例,可能不完整也无法工作):

protected KeyStore loadKeyStoreFromSmartCard()  {
keyStore = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
keyStore.load(null, null);
return keyStore;
}

public void signDocument(byte[] conteudoParaAssinar, String certAlias) {
char[] pass = (char[]) null;
PrivateKey key = (PrivateKey) loadKeyStoreFromSmartCard.getKey(certAlias, pass);
Certificate[] chain = loadKeyStoreFromSmartCard(true).getCertificateChain(certAlias);
CertStore certsAndCRLs = CertStore.getInstance("Collection", new CollectionCertStoreParameters(Arrays.asList(chain)), "BC");
X509Certificate cert = (X509Certificate) chain[0];
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
gen.addSigner(key, cert, CMSSignedDataGenerator.DIGEST_SHA1);
gen.addCertificatesAndCRLs(certsAndCRLs);
CMSProcessable data = new CMSProcessableByteArray(conteudoParaAssinar);
CMSSignedData signed = gen.generate(data, true, "SunMSCAPI");
byte[] envHex = signed.getEncoded();
}

编辑

我听说过 CryptSetProvParam PP_KEYEXCHANGE_PIN 女巫可能是解决方案,但我不知道如何从 java 中调用它。我找到的所有示例都是针对 .net 的。

最佳答案

我曾经实现过类似的东西,但不幸的是智能卡驱动程序有问题,因此驱动程序有时会尝试调出驱动程序本身实现的 native PIN 回调。但让我们假设您的驱动程序在这方面做得更好。

首先,你需要实现一个CallbackHandler ,文档很好地概述了这个概念。在您的情况下,它是 PasswordCallback处理起来很有趣。

接下来,如下创建您的 KeyStore(省略异常处理)

Provider provider = Security.getProvider("SunMSCAPI");
CallbackHandler cbh = // your implementation
KeyStore.ProtectionParameter protection = new KeyStore.CallbackHandlerProtection(cbh);
//get a handle of the CAPI KeyStore as before
KeyStore.Builder keystoreBuilder = KeyStore.Builder.newInstance("Windows-MY",
provider,
protection);
KeyStore store = keystoreBuilder.getKeyStore();

然后,要访问私钥,请执行以下操作:

KeyStore.Entry ke = store.getEntry(alias, null);
if (!(ke instanceof KeyStore.PrivateKeyEntry))
throw new RuntimeException("The entry is not a private key.");
PrivateKey key = ((KeyStore.PrivateKeyEntry) ke).getPrivateKey();

提供商将自动生成适当的 PasswordCallback 以发送到您的 CallbackHandler。处理回调时,您只需传递缓存的密码即可。

不用说,密码缓存通常是不受欢迎的;)

关于java - 使用 SunMSCAPI 签署文档并抑制 "Enter PIN"对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6496565/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com