CryptAcquireContext 在IIS中执行获取句柄为NULL?

可爱的小莱 2012-06-15 11:52:52

程序用到了微软加密库CSP ,在调用CryptAcquireContext时遇到了一下问题:
1、在桌面程序中执行时,可以正常获取到CSP的句柄(hCryptProv )
2、封装成VC动态库在ASP.NET2.0建立的web服务程序中使用,CSP句柄获取到是NULL,CryptAcquireContext函数的返回值是
true
3、查了网上的资料和MSDN得知肯能是权限问题,有推荐使用标记CRYPT_MACHINE_KEYSET,但是我使用了不管用



//获取CSP句柄
HCRYPTPROV hCryptProv = NULL;
DWORD dError;

if (!CryptAcquireContext(&hCryptProv,
NULL,
CSP_NAME_SERVICE,
PROV_RSA_FULL,
CRYPT_MACHINE_KEYSET))
{
if (GetLastError() == NTE_BAD_KEYSET)
{
if (!CryptAcquireContext(&hCryptProv,
NULL,
CSP_NAME_SERVICE, //
PROV_RSA_FULL,
CRYPT_NEWKEYSET|CRYPT_MACHINE_KEYSET))
{
dError = GetLastError();
return dError;
}
}
}

//CSP句柄为空 jiftle 注释 2012-06-14
if(NULL == hCryptProv)
{
return 1;
}

...全文
203 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
可爱的小莱 2012-06-15
  • 打赏
  • 举报
回复
返回值是 TRUE,但是句柄是NULL
[Quote=引用 1 楼 的回复:]

试试这个
C/C++ code


bRetVal = CryptAcquireContextA(&hCryptProv, NULL, MS_ENHANCED_PROV_A, PROV_RSA_FULL, 0);
if(bRetVal == FALSE)
bRetVal = CryptAcquireContextA(&hCryptProv, N……
[/Quote]
可爱的小莱 2012-06-15
  • 打赏
  • 举报
回复
web服务的权限已经做了如下设置:




Yofoo 2012-06-15
  • 打赏
  • 举报
回复
试试这个


bRetVal = CryptAcquireContextA(&hCryptProv, NULL, MS_ENHANCED_PROV_A, PROV_RSA_FULL, 0);
if(bRetVal == FALSE)
bRetVal = CryptAcquireContextA(&hCryptProv, NULL, MS_ENHANCED_PROV_A, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
if(bRetVal == FALSE)
goto MsHashData_Done;
Windows操作系统包含一个名为CryptoAPI的安全接口,主要用于实现加密、解密、数字签名及哈希运算等功能。该压缩文件“WindowsCryptoAPI和密码学API:Delphi的下一代.zip”可能包含适用于Delphi开发环境的工具或示例代码,以支持在该语言调用Windows CryptoAPI执行复杂的安全任务。由于标签缺失,无法进一步确认具体细节,但可以对CryptoAPI的功能及其在Delphi的应用进行分析。 CryptoAPI是微软设计的一组接口,允许开发者在其软件嵌入多种安全功能。该系统通过抽象层简化了加密过程,屏蔽了底层算法与硬件的复杂性,使开发者能够更便捷地实现安全机制。其主要组成部分包括: 1. **加密服务提供者(CSP)**:负责实现具体的加密算法,如RSA、DES、AES等,既可以是硬件模块,也可以是软件实现。 2. **密钥管理机制**:支持密钥的存储与操作,确保私钥等敏感信息的安全性。 3. **数字签名功能**:基于非对称加密技术,用于生成和验证数据签名,保障信息来源的真实性和内容的完整性。 4. **哈希函数支持**:提供多种哈希算法,如MD5、SHA-1、SHA-256等,用于生成数据摘要和验证数据一致性。 5. **随机数生成器**:提供高安全性的随机数生成机制,是许多加密流程的基础。 6. **证书管理能力**:与系统内置的证书存储机制配合,用于管理X.509格式的数字证书,支持公钥基础设施(PKI)的运行。 Delphi是一种广泛使用的面向对象的Pascal语言开发平台,常用于构建Windows客户端应用。在该环境,开发者可借助平台调用(PInvoke)机制调用系统级API,包括CryptoAPI。Delphi的C++ Builder或VCL库通常提供封装好的类,以降低与CryptoAPI交互的复杂度。 例如,在Delphi实现文件加密时,开发者可以调用`CryptAcquireContext`获取加密提供者句柄,接着使用`CryptGenKey`生成密钥,再通过`CryptEncrypt`完成加密操作,解密则使用`CryptDecrypt`。 该压缩包的“WinCryptographyAPIs-master”项目可能包含如下内容: - 用于在Delphi调用Windows CryptoAPI函数的源代码库; - 展示加密、解密、签名及验证等操作的示例程序; - 说明各函数功能和使用注意事项的文档资料; - 可能还包含用于验证代码逻辑的测试案例。 为有效利用这些资源,Delphi开发者应掌握平台调用机制,熟悉Windows API函数的调用方式,并了解如何在Delphi处理指针和结构体。通过实践与学习,开发者可以将Windows CryptoAPI的强大功能整合进其应用程序,从而提升软件的安全性与稳定性。资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧