返回首页

介绍
在这篇文章中,您将学习如何使用智能卡运行。NET CLR和使用安全的存储操作和加密操作。在前面的文章中,我描述了如何使用。NET Framework中的安全API的智能卡证书存储。那么,什么是使用CSP API和使用。NET卡来实现相同的操作中的区别?答案是很多的灵活性和扩展安全。背景
。NET智能卡V2相当于微软生态系统中的Java卡。我以前使用Java卡和APDU协议的限制。NET卡带来了一些创新的解决方案。你写卡的应用程序都暴露给客户端应用程序使用。NET远程处理技术的一个实现。有了这个协议,该卡成为一个小型的服务器上运行。NET应用程序。当然,也有一些限制,我会尽力给他们一些。
{S0的}智能卡和USB读卡机orouit

回答

评论会员:游客 时间:2012/02/06
嗨,我准软件工程师在一家公司。我们有一个C独立客户端应用程序,在这里我们使用正常的用户名/密码进行验证。我们希望提供一个登录的选项,使用智能卡。我们并没有在智能卡身份验证的知识。我们的要求是,从智能卡阅读证书,并发送那些为我们的服务器进行身份验证的证书。在这里我们可以检查证书和适当的响应发送回客户端。这应该是一个广义的代码,它可以从任何智能卡读取证书。我们曾尝试在basecsp.dll和Rsaenh.dll调用函数。下面是示例代码,我们试图codeprelang="c++"spanclass="code-preprocessor"#include/spanspanclass="code-preprocessor"spanclass="code-keyword"</spanspanclass="code-leadattribute"windows.h/spanspanclass="code-attribute"#include/spanspanclass="code-attribute"<winscard.h/spanspanclass="code-attribute"#include/spanspanclass="code-attribute"<Wincrypt.h/spanspanclass="code-attribute"#include/spanspanclass="code-attribute"<Winuser.h/spanspanclass="code-keyword"//spanspanclass="code-keyword"//spanspanclass="code-attribute"#include/spanspanclass="code-attribute"<winerror.h/spanspanclass="code-keyword"//spanspanclass="code-keyword"//spanspanclass="code-attribute"#include/spanspanclass="code-attribute"<Tchar.h/spanspanclass="code-keyword"//spanspanclass="code-keyword"//spanspanclass="code-attribute"#include/spanspanclass="code-attribute"<K:\WORK\PRACTICE\TEST_PROJECT5\TEST_PRJ5\wincsp.h/spanspanclass="code-keyword"//spanspanclass="code-keyword"//spanspanclass="code-attribute"#include/spanspanclass="code-attribute"<K:\WORK\PRACTICE\TEST_PROJECT5\TEST_PRJ5\cspdk.h/spanspanclass="code-keyword"//spanspanclass="code-keyword"//spanspanclass="code-attribute"#include/spanspanclass="code-attribute""Test_prj5.h"/span spanclass="code-attribute"#ifndef/spanspanclass="code-attribute"PROV_RSA_FULL/spanspanclass="code-attribute"#/spanspanclass="code-attribute"define/spanspanclass="code-attribute"PROV_RSA_FULL/spanspanclass="code-attribute"1/spanspanclass="code-attribute"#endif/span spanclass="code-attribute"#ifndef/spanspanclass="code-attribute"CRYPT_NEWKEYSET/spanspanclass="code-attribute"#/span spanclass="code-attribute"define/spanspanclass="code-attribute"CRYPT_NEWKEYSET/spanspanclass="code-attribute"0x00000008/spanspanclass="code-attribute"#endif/span spanclass="code-attribute"typedef/spanspanclass="code-attribute"unsigned/spanspanclass="code-attribute"long/spanspanclass="code-attribute"HCRYPTPROV;/span spanclass="code-attribute"typedef/spanspanclass="code-attribute"struct/spanspanclass="code-attribute"VTableProvStruc/spanspanclass="code-attribute"{/spanspanclass="code-attribute"DWORD/spanspanclass="code-attribute"Version;/spanspanclass="code-attribute"FARPROC/spanspanclass="code-attribute"FuncVerifyImage;/spanspanclass="code-attribute"FARPROC/spanspanclass="code-attribute"FuncReturnhWnd;/spanspanclass="code-attribute"DWORD/spanspanclass="code-attribute"dwProvType;/spanspanclass="code-attribute"BYTE/spanspanclass="code-attribute"*pbContextInfo;/spanspanclass="code-attribute"DWORD/spanspanclass="code-attribute"cbContextInfo;/spanspanclass="code-attribute"LPSTR/spanspanclass="code-attribute"pszProvName;/spanspanclass="code-attribute"}/spanspanclass="code-attribute"VTableProvStruc,/spanspanclass="code-attribute"*PVTableProvStruc;/span spanclass="code-attribute"typedef/spanspanclass="code-attribute"BOOL/spanspanclass="code-attribute"(WINAPI/spanspanclass="code-attribute"*/spanspanclass="code-attribute"CPAcquireContext_DLL)(HCRYPTPROV/spanspanclass="code-attribute"*,/spanspanclass="code-attribute"LPCSTR/spanspanclass="code-attribute",/spanspanclass="code-attribute"DWORD/spanspanclass="code-attribute",/spanspanclass="code-attribute"VTableProvStruc/spanspanclass="code-attribute");/span spanclass="code-attribute"_declspec(dllimport)/spanspanclass="code-attribute"BOOL/spanspanclass="code-attribute"WINAPI/spanspanclass="code-attribute"CPAcquireContext(OUT/spanspanclass="code-attribute"HCRYPTPROV/spanspanclass="code-attribute"*phProv,/spanspanclass="code-attribute"IN/spanspanclass="code-attribute"LPCSTR/spanspanclass="code-attribute"szContainer,/spanspanclass="code-attribute"IN/spanspanclass="code-attribute"DWORD/spanspanclass="code-attribute"dwFlags,/spanspanclass="code-attribute"IN/spanspanclass="code-attribute"PVTableProvStruc/spanspanclass="code-attribute"pVTable);/span spanclass="code-attribute"BOOL/spanspanclass="code-attribute"ProvVerifyImage/spanspanclass="code-attribute"(LPCSTR/spanspanclass="code-attribute"lpszImage,/spanspanclass="code-attribute"BYTE/spanspanclass="code-attribute"*pSigData)/spanspanclass="code-attribute"{/spanspanclass="code-attribute"return/spanspanclass="code-attribute"true;/spanspanclass="code-attribute"}/span spanclass="code-attribute"int/spanspanclass="code-attribute"main()/spanspanclass="code-attribute"{/span    spanclass="code-attribute"HINSTANCE/spanspanclass="code-attribute"hmod;/spanspanclass="code-attribute"hmod/spanspanclass="code-keyword"=/spanspanclass="code-attribute"::LoadLibrary/spanspanclass="code-attribute"("C:\\Windows\\SysWOW64\\basecsp.dll");/span spanclass="code-keyword"//spanspanclass="code-keyword"//spanspanclass="code-attribute"hmod/spanspanclass="code-keyword"=/spanspanclass="code-attribute"::LoadLibrary/spanspanclass="code-attribute"("C:\\Windows\\winsxs\\x86_microsoft-windows-rsaenh-dll_31bf3856ad364e35_6.1.7600.16385_none_5f9d65eb12980e45\\rsaenh.dll");/spanspanclass="code-attribute"if(hmod/spanspanclass="code-keyword"==NULL)/spanspanclass="code-attribute"{/span spanclass="code-attribute"std::cout<<"dll/spanspanclass="code-attribute"loading/spanspanclass="code-attribute"failed!/spanspanclass="code-attribute""<</spanspanclass="code-attribute"std::/spanspanclass="code-attribute"endl;/spanspanclass="code-attribute"exit/spanspanclass="code-attribute"(1);/spanspanclass="code-attribute"}/span spanclass="code-attribute"HCRYPTPROV/spanspanclass="code-attribute"hCryptProv/spanspanclass="code-keyword"=/spanspanclass="code-attribute"NULL;/span spanclass="code-attribute"CPAcquireContext_DLL/spanspanclass="code-attribute"*lpproc;/spanspanclass="code-attribute"lpproc/spanspanclass="code-keyword"=/spanspanclass="code-attribute"(CPAcquireContext_DLL*)GetProcAddress/spanspanclass="code-attribute"(hmod,"CPAcquireContext");/span spanclass="code-attribute"if/spanspanclass="code-attribute"(!lpproc)/spanspanclass="code-attribute"{/span spanclass="code-attribute"std::cout<<"The/spanspanclass="code-attribute"function/spanspanclass="code-attribute"CPAcquireContext/spanspanclass="code-attribute"could/spanspanclass="code-attribute"not/spanspanclass="code-attribute"be/spanspanclass="code-attribute"found!/spanspanclass="code-attribute""<</spanspanclass="code-attribute"std::/spanspanclass="code-attribute"endl;/span spanclass="code-attribute"exit/spanspanclass="code-attribute"(1);/spanspanclass="code-attribute"}/span spanclass="code-attribute"PVTableProvStruc/spanspanclass="code-attribute"pvTable/spanspanclass="code-keyword"=new/spanspanclass="code-attribute"VTableProvStruc;/spanspanclass="code-attribute"pvTable-Version/spanspanclass="code-keyword"=3;/spanspanclass="code-attribute"pvTable-FuncVerifyImage/spanspanclass="code-keyword"=(FARPROC/spanspanclass="code-attribute")/spanspanclass="code-attribute"(ProvVerifyImage);/spanspanclass="code-attribute"pvTable-FuncReturnhWnd/spanspanclass="code-keyword"=NULL;/spanspanclass="code-attribute"pvTable-dwProvType/spanspanclass="code-keyword"=PROV_RSA_FULL;/spanspanclass="code-attribute"pvTable-pbContextInfo/spanspanclass="code-keyword"=NULL;/spanspanclass="code-attribute"pvTable-cbContextInfo/spanspanclass="code-keyword"=0;/span spanclass="code-attribute"if((*lpproc)(&hCryptProv,/spanspanclass="code-attribute"NULL,/spanspanclass="code-attribute"CRYPT_NEWKEYSET,/spanspanclass="code-attribute"*pvTable))/span spanclass="code-attribute"{/span spanclass="code-attribute"std::cout<<"A/spanspanclass="code-attribute"new/spanspanclass="code-attribute"key/spanspanclass="code-attribute"container/spanspanclass="code-attribute"has/spanspanclass="code-attribute"been/spanspanclass="code-attribute"created./spanspanclass="code-attribute""<</spanspanclass="code-attribute"std::/spanspanclass="code-attribute"endl;/span  spanclass="code-attribute"}/span spanclass="code-keyword"//spanspanclass="code-attribute"*else/span spanclass="code-attribute"if((*lpproc)(&hCryptProv,/spanspanclass="code-attribute"NULL,/spanspanclass="code-attribute"0,/spanspanclass="code-attribute"pvTable))/spanspanclass="code-attribute"{/spanspanclass="code-attribute"std::cout<<"A/spanspanclass="code-attribute"cryptographic/spanspanclass="code-attribute"provider/spanspanclass="code-attribute"has/spanspanclass="code-attribute"been/spanspanclass="code-attribute"acquired./spanspanclass="code-attribute""<</spanspanclass="code-attribute"std::/spanspanclass="code-attribute"endl;/span spanclass="code-attribute"}*/spanspanclass="code-keyword"//span spanclass="code-attribute"else/spanspanclass="code-attribute"{/span spanclass="code-attribute"std::cout<<"Could/spanspanclass="code-attribute"not/spanspanclass="code-attribute"create/spanspanclass="code-attribute"a/spanspanclass="code-attribute"new/spanspanclass="code-attribute"key/spanspanclass="code-attribute"container."<</spanspanclass="code-attribute"std::/spanspanclass="code-attribute"endl;/span spanclass="code-attribute"exit/spanspanclass="code-attribute"(1);/span spanclass="code-attribute"}/span  spanclass="code-attribute"std::cin.get();/span   spanclass="code-attribute"return/spanspanclass="code-attribute"0;/spanspanclass="code-attribute"}/span/span/pre/code但它崩溃时,我们尝试致电的功能CPAcquireContext()"行:if((*lpproc)(HCRYPTPROV,空,CRYPT_NEWKEYSET,*pvTable))将是巨大的,如果你能指导,帮助我们去提前智能卡认证机制。的问候,:伊姆兰Inamdar
| orouit:我不能确定如何您试图使用的SC证书登陆

你的卡有一个私钥。有了这把钥匙,你可以登录从服务器获得了挑战。你的服务器必须有卡证书的公钥,然后你会送卡计算的服务器会验证它,并验证它或不签名。

这是什么你想达到什么目的?

不过,我没有用在c basecsp。NET提供了一个全面的支持,这是我觉得更容易使用!。软件架构师,COM,NET和智能卡安全专家|彼得Pechovic
评论会员:好 时间:2012/02/06
orouit
评论会员:游客 时间:2012/02/06
谢谢!imgsrc=http://www.orcode.com/img/ico/smiley_biggrin.gif。软件架构师,COM,NET和智能卡安全专家
orouit
评论会员:游客 时间:2012/02/06
好文章。良好的工作。谢谢