问题标签 [capicom]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
991 浏览

.net - 如何找到用于对我的数据进行 AES 加密的初始化向量 CAPICOM?

我有一个用 Classic ASP 编写的应用程序,它通过 CAPICOM 加密数据并将其存储在数据库中。加密代码看起来像这样(经典的 ASP,VB。为简洁起见稍微简化了一点):

现在,我有一个 .NET 应用程序需要读取这些数据并对其进行解密。在使用该类之前,我已经在 .NET 中完成了与 AES 兼容的加密/解密RijndaelManaged,我希望我可以使用相同的方法来解密这些数据。但是,我不知道如何让它与 CAPICOM 的加密数据一起使用,因为RijndaelManaged在调用时需要您传递一个密钥和一个初始化向量RijndaelManaged.CreateEncryptor,而 CAPICOM 不采用初始化向量。我假设 CAPICOM 必须使用初始化向量,但不公开它。我怎样才能找到那个向量?

0 投票
1 回答
3997 浏览

c# - 是否可以在远程 Windows 服务器上确定证书私钥的文件名?

我正在尝试确定存储在远程 Windows (2k3/2k8) 机器上的证书私钥的文件名,但遇到了一些困难。我对微软的 CryptAPI 也不是很熟悉,所以我正在寻找你能提供的任何帮助。

本练习的目的是查找安装在远程计算机上且满足特定条件的带有私钥的证书,并确保为其私钥文件分配正确的权限。虽然我可以在文件夹级别分配权限,但我更愿意只在必要的私钥文件级别分配权限(出于显而易见的原因)。

这是场景,假设具有类似管理权限的服务帐户正在访问证书存储:

  1. 我使用来自 C# 的以下调用使用 p/invoke 检索远程证书存储:

    [DllImport("CRYPT32", EntryPoint = "CertOpenStore", CharSet = CharSet.Unicode, SetLastError = true)] public static extern IntPtr CertOpenStore(int storeProvider, int encodingType, int hcryptProv, int flags, string pvPara);

    IntPtr storeHandle = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_LOCAL_MACHINE, string.Format(@"\{0}{1}", serverName, name));

  2. 然后我使用 CertEnumCertificatesInStore 来检索我想要评估的证书。

    [DllImport("CRYPT32", EntryPoint = "CertEnumCertificatesInStore", CharSet = CharSet.Unicode, SetLastError = true)] public static extern IntPtr CertEnumCertificatesInStore(IntPtr storeProvider, IntPtr prevCertContext); IntPtr certCtx = IntPtr.Zero;certCtx = CertEnumCertificatesInStore(storeHandle, certCtx);

  3. 如果证书符合我的条件,我会从 CertEnumCertificatesInStore 调用返回的 IntPtr 创建一个 X509Certificate2 实例,例如:

    X509Certificate2 当前 = 新 X509Certificate2(certCtx);

  4. 一旦我有了我感兴趣的证书的 X509Certificate2 实例,我就会调用CryptAcquireCertificatePrivateKey来获取私钥提供程序:

    [DllImport("crypt32", CharSet = CharSet.Unicode, SetLastError = true)] internal extern static bool CryptAcquireCertificatePrivateKey(IntPtr pCert, uint dwFlags, IntPtr pvReserved, ref IntPtr phCryptProv, ref int pdwKeySpec, ref bool pfCallerFreeProv);

    //cert 是一个 X509Certificate2

    CryptAcquireCertificatePrivateKey(cert.Handle, 0, IntPtr.Zero, ref hProvider, ref _keyNumber, ref freeProvider);

  5. 为了检索私钥文件名,我尝试从 hProvider 请求唯一容器名称作为 pData,例如:

    [DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true)] internal extern static bool CryptGetProvParam(IntPtr hCryptProv, CryptGetProvParamType dwParam, IntPtr pvData, ref int pcbData, uint dwFlags);

    IntPtr pData = IntPtr.Zero;CryptGetProvParam(hProvider, PP_UNIQUE_CONTAINER, pData, ref cbBytes, 0));

到目前为止,上述所有步骤都在本地运行良好(服务器名 == 本地机器名);但是,为存储在远程计算机的本地计算机证书存储中的证书返回的唯一容器名称(私钥文件名)不会呈现为我在下面看到的实际私钥文件名:

w2k3:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys

ws08: \ProgramData\Microsoft\Crypto\RSA\MachineKeys

例如,如果我直接在远程机器上运行上述步骤,我会得到一个私钥文件名 AAAAAAA-111111,但如果我远程运行它们,我会得到一个私钥 BBBBBBBB-2222222。此外,如果我在本地安装远程证书并在本地计算机上运行这些步骤,我会得到相同的私钥名称 BBBBBBBB-2222222。

很可能我觉得我可能在第 4 步中遗漏了一个警告,即调用 CryptAcquireCertificatePrivateKey。可能是此调用依赖于本地机器的身份来生成将用于存储私钥 blob 的唯一容器的名称。

更新

经过一些进一步的研究,我发现了一个博客,其中详细说明了如何在此处创建私钥容器的文件名。

一旦您拥有由 CertGetCertificateContextProperty 获得的容器名称,您可以使用该博客中描述的方法在任何机器上获取私钥容器名称,而不是使用 CryptAcquireCertificatePrivateKey。此处的代码显示了如何获取私钥容器名称,以便您可以生成私钥文件名。* 免责声明 - 我很确定这可能会发生变化,甚至可能不完整,但我会发布它以防将来对其他人有所帮助*

结构和 P/Invoke:

0 投票
1 回答
2582 浏览

ms-access - ms Access 中的散列

我正在尝试在 ms 访问中散列密码(最好是 MD5 或 SHA-1)。我找到了 Capicom,它在学校的 Windows XP 上运行良好。但是,在家访问似乎并不想识别它。是否有任何替代方案可以在 XP 和 Windows 7 上使用且不涉及添加外部库?

如果需要外部库,我如何将它添加到我的数据库的 VB 代码中。谢谢。

e:任何需要安装的东西,例如.dll文件,都是不可能的,因为我无法在学校使用它(我的问题是找到可以在家里和学校工作的东西,这样我就可以有效地工作我的项目)

0 投票
2 回答
5278 浏览

php - 如何使用 PHP 从浏览器检查数字签名

我有一个在浏览器中签署文本字符串的 Javascript。它在 Internet Explorer 下使用 CAPICOM,在 Mozilla 浏览器下使用 window.crypto。在签名过程之后,我收到一个 BASE64 编码的签名。

我使用 HTTPS 将签名和文本字符串上传到带有 PHP 应用程序的网络服务器。从 SSL (HTTPS) 我收到用户的证书。从这个证书中,我可以提取用户的公钥。

现在我想验证签名文本字符串以及用户的证书和公钥的签名。我尝试使用openssl_verify PHP 函数但没有成功。

我总是收到一个错误:

错误:0408D077:rsa 例程:FIPS_RSA_VERIFY:错误的签名长度

  • 我有证书,没问题;
  • 我有从证书中提取的公钥,它也经过验证并且可以;
  • 我有签名(BASE64 解码);

不幸的是我无法验证签名?我无法提供演示或示例,因为它目前仅在本地网络中。

0 投票
1 回答
1583 浏览

java - Capicom SHA1 哈希在 Java 中的计算方式不同

我正在使用CAPICOM带有VBS逻辑的程序集来加密一些text,这很好用,但是当尝试使用 复制相同的内容时问题就开始了Java

这是我的 VBS 代码:

通过调试上面的代码,我可以得到以下信息:

Hash对象值为:

最终结果如下encryptedStr


所以,在Java我试图复制相同的内容时,我认为这可以通过......

  1. 获取orSHA1的散列(因为在代码中有一个代表 a 的对象)。StringInputStreamVBSstmStream

  2. 使用一些HexToBinary方法(通过实现这个,因为默认情况下这个方法在 中不存在Java)。

  3. 用于哈希BASE64Encoder的二进制文件StringSHA1

  4. 最后,使用Left方法 from org.apache.commons.lang.StringUtils(复制VBS代码),然后输出encryptedStrbase64 String.

到目前为止,这是我在 Java 中尝试过的至少生成哈希的方法(假设与SHA1以下内容相同:hash.ValueVBS

上面的代码将输出以下内容:


问题:

  • String在两种情况下都使用相同的加密(VBSJava)。

  • 当我执行VBS代码时,我SHA1从以下位置获取此哈希值CAPICOM

    636D0172D7FAC85AF9DB57FAE6C7D98B17DE5159

  • 当我执行Java代码时,我得到了这个SHA1哈希值:

    825CA9AF2795F3CCD41EC3B756CC7514E490842F

  • 如果哈希不一样base64 String,我永远不会得到相同的结果。encryptedStrSHA1


我的问题:

我做错了什么以及为什么SHA1哈希在两种情况下的计算方式都不同。有人可以解释正在发生的事情或实现这一点并获得相同结果的正确方法是什么Java吗?

只是要知道,我发现这个链接有点帮助,并说他们可以得到相同的结果hash,但不能解决我的问题:

http://us.generation-nt.com/answer/capicom-hasheddata-java-binary-files-help-44910362.html?page=2

如果有人想安装CAPICOM和测试VBS代码,您可以执行以下操作:

  1. 将“capicom.dll”复制到“C:\WINDOWS\system32”
  2. 单击开始/程序/附件/命令提示符
  3. 键入“C:”
  4. 键入“cd C:\WINDOWS\system32”
  5. 键入“regsvr32.exe capicom.dll”
  6. 单击“确定”按钮。
  7. 输入“退出”

capicom.dll并直接从以下位置下载自己Microsoft

http://www.microsoft.com/downloads/details.aspx?FamilyID=860EE43A-A843-462F-ABB5-FF88EA5896F6&displaylang=en

0 投票
1 回答
2471 浏览

windows - Delphi - 加载 PFX 证书而不使用 CAPICOM 在 Windows 上安装它

我正在使用 CAPICOM 加载 WebService 客户端所需的证书。

我需要在 Windows 中安装证书,然后从证书文件本身打开它,我认为这“有点愚蠢”。

有没有办法(按优先顺序):

  • 将 PFX 文件内容保存到数据库中的备注字段,然后从那里加载它,而不在 Windows 上安装它?

  • 从文件本身加载 PFX 文件,而不在 Windows 上安装它

我正在使用 Delphi XE3、LibEay32 和 Capicom 2.0

0 投票
0 回答
1067 浏览

.net - 如何在 vb.net 中验证任何文件是否经过数字签名

我正在一个 vb.net 项目中工作,我想在该项目中验证任何给定文件是否为数字签名。CAPICOM 是在 google 上搜索后出现的 API,但我不完全知道如何在 vb.net 中使用 CAPICOM 来获取 TRUE/FALSE,如果任何给定文件是否经过数字签名..

现在我来这里是为了获得一些帮助。对不起,我的英语不好。

感谢和问候,

0 投票
1 回答
814 浏览

web-services - Delphi CGI WebService - 数字证书

我有一个 delphi 7 CGI webService(在 windows XP 中,但 windows 7 不在表中)应用程序,我需要访问数字证书来签署 XML 文档。

我已经导入 CApicom_TLB 并成功实例化证书,但有一些问题......

运行我的应用程序的 apache 服务器与我安装证书的不同 Windows 用户一起运行它,当我使用 CAPICOM_CURRENT_USER_STORE 标志查询时,证书存储区为空。我通过在本地机器中安装 A1 证书(带有私钥的 Pfx)(通过 MMC 控制台,添加新的管理单元)并使用 CAPICOM_LOCAL_MACHINE_STORE 标志访问证书存储来解决它。我得到了证书(我可以读取它的序列号、友好名称、有效日期)但是当我尝试签署文件时,我得到“密钥对不存在”错误。

相同的代码在具有相同 PFx 的普通 APP(非 cgi)中工作(成功签署 XML)。

我用来获取证书的代码:

然后我使用 CertStoreMem 签署使用以下内容

错误(密钥对)在最后一行代码中。

有两种方法:让 CGI 应用程序读取安装它的同一用户中的证书(在非 cgi 中工作的代码)或使这个工作与本地机器安装的证书一起工作而没有密钥错误。

如果有人可以提供帮助将不胜感激

0 投票
0 回答
112 浏览

c# - 使用 Capicom 在 Windows 应用商店应用程序中为 Web 服务签名数据

我正在开发一个 Windows 应用商店应用程序。因此我必须使用旧的 ASMX 网络服务。该服务使用 Capicom 库对数据取消签名。

问题是,我无法在 Windows Store App 中使用 Capicom。

有没有办法在没有 Capicom 的情况下对 Store App 内的数据进行签名,以便使用 Capicom 的 web 服务可以取消签名?

在此先感谢您的帮助!

0 投票
0 回答
132 浏览

c++ - CAPICOM 与 Qt?

我有一个使用 Qt/C++ 编写的程序,该程序应该与基于 CAPICOM/IE6 的笨拙加密平台和保存数字签名私钥的 USB 令牌一起使用。系统用户必须按照以下步骤登录:

  1. 在他们的系统上安装一个假的根 CA
  2. 安装 CAMICOM
  3. 插入他们的令牌
  4. 打开 Internet Explorer(不,其他浏览器无法使用),输入 URL,输入用户名和密码,点击登录。

我计划删除 CAPICOM(如果可能)并使系统尽可能跨平台。我可以想到两种情况:

  1. 删除 CAPICOM 并使用现代跨平台工具替换它
  2. 以某种方式使 Qt 代码使用 CAPICOM 并删除 Web 浏览器的角色。

有关 CAPICOM 如何工作(尤其是它到底在签名什么)以及如何连接到 USB 令牌(ePass 3003)的任何帮助都是有帮助的。