当前位置: 首页 > 面试题库 >

数字签名SunMSCAPI提供程序和MS Crypto API

高钱青
2023-03-14
问题内容

我想与SunMSCAPI提供商签署文件。由于公共密钥和签名需要使用MS Crypto API导入。

通常,使用生成签名SHA1withRSA最终以big-endian到little-endian(字节顺序)转换为结尾。

//generate keystore with java keytool
$Keytool -genkey -alias tsign -keystore c:\test\tsignjks.p12 - keyalg rsa -storetype  pkcs12

在Java应用程序中:

//for signing and getting keystore, assuming windows certificate is installed
..ks = KeyStore.getInstance("Windows-MY","SunMSCAPI"); 
PrivateKey priv = ks.getKey("tsign",password); 
Signature rsa = Signature.getInstance("SHA1withRSA","SunMSCAPI"); 
rsa.initSign(priv);
.. 
rsa.update(buffer, 0, len);
..
byte[] realSig = rsa.sign();

//for writing public key for ms crypto api or exporting it from windows certificate store
Certificate cert = ks.getCertificate("tsign");
byte[] encodedCert = cert.getEncoded();
FileOutputStream certfos = new FileOutputStream("tsigncer.cer");
certfos.write(encodedCert);

//for writing signatures for ms crypto api
FileOutputStream sigfos = new FileOutputStream(targetPath + "/"
                + signatureName);
sigfos.write(realSig);

我相信SunMSCAPI可以解决我的问题,但是我不知道何时使用MS Crypto
API导入公钥,它永远不会在第一阶段导入(除非我将大字节序更改为小字节序),这是我的加密API代码。

LPCSTR file = "tsigncer.cer";
//LPCSTR file = "omsign.p12";
BOOL crypt_res = FALSE;

HCRYPTPROV crypt_prov_hndl = NULL;
 crypt_res = CryptAcquireContext(&crypt_prov_hndl, NULL, NULL, PROV_RSA_FULL, 0/*CRYPT_NEWKEYSET*/);
//crypt_res = CryptAcquireContext(&crypt_prov_hndl, NULL, NULL, PROV_DSS, CRYPT_VERIFYCONTEXT/*CRYPT_NEWKEYSET*/);

    if (!crypt_res) {
        HRESULT decode_hr = __HRESULT_FROM_WIN32(GetLastError());
        return decode_hr;
    }

    // Load key file
    HANDLE fileHandle = CreateFile(file, // name of the write
                       GENERIC_READ,          // open for writing
                       0,                      // do not share
                       NULL,                   // default security
                       OPEN_EXISTING,             // create new file only
                       FILE_ATTRIBUTE_NORMAL,  // normal file
                       NULL);                  // no attr. template

    if (fileHandle == INVALID_HANDLE_VALUE)
    {
        DWORD d = GetLastError();
        return -1;
    }

    BYTE buffer[2056];
    DWORD fileSize = 0;
    DWORD fileSizeResult = GetFileSize(fileHandle, &fileSize);

    DWORD numBytesRead = 0;
    BOOL fileLoadResult = ReadFile(fileHandle, (PVOID)buffer, fileSizeResult, &numBytesRead, NULL);

    // Import key
    BOOL result = ImportKey(crypt_prov_hndl, (LPBYTE)buffer, numBytesRead);
//result is always false..

问题答案:

如果使用MSCAPI,则假定您已将密钥添加到Microsoft证书存储中。您可以通过转到“
Internet属性”>“内容”>“证书”来检查该密钥是否存在,该列表为您提供了可用证书的列表。如果您的证书不存在,则无法使用。如果存在,则需要以下代码:

SunMSCAPI providerMSCAPI = new SunMSCAPI();
Security.addProvider(providerMSCAPI);
KeyStore ks = KeyStore.getInstance("Windows-MY");
ks.load(null, null);

从那里开始,代码是非常标准的。请查阅我的数字签名书以获取更多信息(该书是免费的)。

重要说明: 我忘了提到SunMSCAPI在64位版本的Java 6中不存在(我不了解Java 7)。您可以通过安装32位版本来解决此问题。



 类似资料:
  • 本文向大家介绍详解Java数字签名提供XML安全,包括了详解Java数字签名提供XML安全的使用技巧和注意事项,需要的朋友参考一下 用Java数字签名提供XML安全 众所周知,XML在产品和项目开发中起着非常重要的作用。通过XML文档可以获取很多信息,还可以使用XML文件进行CRUD(增加、查询、更新和 删除)操作。然而值得注意的是,我们如何确保XML中的数据是来自经过认证的可信和可靠的来源。关于

  • 有人知道TestNG如何根据为测试方法指定的数据提供者名称计算出数据提供者方法是什么吗? 我找到了这个解决方案:https://gist.github.com/ae6rt/3805639 但是,它没有考虑到数据提供者可能是: 在完全不同的类别中定义,或 在父类中定义,并且 该方法可以是静态的,也可以是非静态的 我试图自己破解一些东西,但后来我想我不可能是第一个试图解决这个问题的人,特别是因为显然T

  • 下面是我的app.js文件 下面是我的状态文件 我有一个模板,我想从那里导航到下一个状态 但是只要我点击这个锚标签,它就会把我导航回主页。(不去我打算去的州)。主要问题是URL(我猜)任何帮助都会很感激。

  • Entity Framework Core 通过一个提供程序模型来允许使用 EF 访问各种不同的数据库。一些概念对于大部分数据库是通用的,这些都包含在主要的 EF Core 组件中,包括 LINQ 的查询表达、事务以及从数据中加载出来后对象的变更跟踪。一些概念则是特定于个别提供程序,比如 SQL Server 提供程序允许你配置内存优化表(一个特定于 SQL Server 的功能),另外一些概念则

  • 我已经在文件中添加了所有相关build.gradle依赖项。尽管如此,当我尝试运行调用SOAP服务时,还是会出现以下错误。共享依赖项部分和错误详细信息。使用Java11。网上已经有很多答案,但似乎都不起作用。任何帮助/建议将是值得赞赏的。 低于错误跟踪

  • 我有以下问题 我有一个带有随机名称的测试,我必须记录我从数据提供者提供的两个测试参数。 我实现了一种方法,通过将它们连接到名称中,将它们记录为自定义处理的测试参数。 然而,TestNG还添加了未处理的参数(它们看起来像是随机生成的代码,带有包/类的名称和其他内容,如下图所示)。 是否有任何方法可以删除TestNG记录的数据提供程序测试参数?或者我可以用自定义数据提供程序测试参数覆盖它们吗? 顺便说