关于usbkey验pin的代码
我现在的做法,
第一
C_OpenSession(
m_pSlotList[0],
m_SessionFlags, //CKF_RW_SESSION | CKF_SERIAL_SESSION,
(CK_VOID_PTR)szApplication,
NULL_PTR,
&m_hSession);
通过m_hSession判断是否插入钥匙;
第二
HCRYPTPROV hCryptProv = NULL;
HCRYPTKEY hExPubKey = NULL;
BYTE a[128] = "CYBER";
DWORD lenth;
lenth = strlen((char *)a);
//获取密钥容器
if (!CryptAcquireContext(
&hCryptProv,
NULL,
TEST_CSP_NAME,
PROV_RSA_FULL,
NULL))
{
if (hCryptProv)
{
CryptReleaseContext(hCryptProv, 0);
}
if(hExPubKey)
{
CryptDestroyKey(hExPubKey);
}
return -1;
}
//获取密钥句柄
if (!CryptGetUserKey(
hCryptProv,
AT_KEYEXCHANGE,
&hExPubKey))
{
if (hCryptProv)
{
CryptReleaseContext(hCryptProv, 0);
}
if (hExPubKey)
{
CryptDestroyKey(hExPubKey);
}
return -2;
}
if (!CryptEncrypt(hExPubKey, 0, TRUE, 0, a, &lenth, 128))
{
cyber_error_f("auVerifyPinByCSP@LibPkcs11 加密失败");
if (hCryptProv)
{
CryptReleaseContext(hCryptProv, 0);
}
if (hExPubKey)
{
CryptDestroyKey(hExPubKey);
}
return -3;
}
if (!CryptDecrypt(hExPubKey, 0, TRUE, 0, a, &lenth))
{
cyber_error_f("auVerifyPinByCSP@LibPkcs11 错误PIN码");
if (hCryptProv)
{
CryptReleaseContext(hCryptProv, 0);
}
if (hExPubKey)
{
CryptDestroyKey(hExPubKey);
}
return -4;
}
if (hCryptProv)
{
CryptReleaseContext(hCryptProv, 0);
}
if (hExPubKey)
{
CryptDestroyKey(hExPubKey);
}
return 1;
}
如果成功放回1 验pin通过
现在的问题是插入钥匙第一次验通过以后,钥匙不拔,在调用上面的过程验pin就直接通过了 不会弹出输入pin码的窗口,是什么问题呢? 是不是CryptDecrypt(hExPubKey, 0, TRUE, 0, a, &lenth)中的TRUE要改成FALSE??
第一
C_OpenSession(
m_pSlotList[0],
m_SessionFlags, //CKF_RW_SESSION | CKF_SERIAL_SESSION,
(CK_VOID_PTR)szApplication,
NULL_PTR,
&m_hSession);
通过m_hSession判断是否插入钥匙;
第二
HCRYPTPROV hCryptProv = NULL;
HCRYPTKEY hExPubKey = NULL;
BYTE a[128] = "CYBER";
DWORD lenth;
lenth = strlen((char *)a);
//获取密钥容器
if (!CryptAcquireContext(
&hCryptProv,
NULL,
TEST_CSP_NAME,
PROV_RSA_FULL,
NULL))
{
if (hCryptProv)
{
CryptReleaseContext(hCryptProv, 0);
}
if(hExPubKey)
{
CryptDestroyKey(hExPubKey);
}
return -1;
}
//获取密钥句柄
if (!CryptGetUserKey(
hCryptProv,
AT_KEYEXCHANGE,
&hExPubKey))
{
if (hCryptProv)
{
CryptReleaseContext(hCryptProv, 0);
}
if (hExPubKey)
{
CryptDestroyKey(hExPubKey);
}
return -2;
}
if (!CryptEncrypt(hExPubKey, 0, TRUE, 0, a, &lenth, 128))
{
cyber_error_f("auVerifyPinByCSP@LibPkcs11 加密失败");
if (hCryptProv)
{
CryptReleaseContext(hCryptProv, 0);
}
if (hExPubKey)
{
CryptDestroyKey(hExPubKey);
}
return -3;
}
if (!CryptDecrypt(hExPubKey, 0, TRUE, 0, a, &lenth))
{
cyber_error_f("auVerifyPinByCSP@LibPkcs11 错误PIN码");
if (hCryptProv)
{
CryptReleaseContext(hCryptProv, 0);
}
if (hExPubKey)
{
CryptDestroyKey(hExPubKey);
}
return -4;
}
if (hCryptProv)
{
CryptReleaseContext(hCryptProv, 0);
}
if (hExPubKey)
{
CryptDestroyKey(hExPubKey);
}
return 1;
}
如果成功放回1 验pin通过
现在的问题是插入钥匙第一次验通过以后,钥匙不拔,在调用上面的过程验pin就直接通过了 不会弹出输入pin码的窗口,是什么问题呢? 是不是CryptDecrypt(hExPubKey, 0, TRUE, 0, a, &lenth)中的TRUE要改成FALSE??
...全文
相关推荐
P11_USBKEY_Reader.zip
USBKEY通常具有硬件保护机制,比如PIN码验证,进一步增强了安全性。
usbkey开发代码 c#
- 设备兼容性:不同的USBKEY可能存在差异,需要确保代码能够适应多种设备。- 性能优化:对于大量数据的读写,要考虑性能优化,如使用缓冲区进行批量操作。
基于PC/SC的USBKEY的PIN校验代码
为了确保USBKEY的安全性和可靠性,PIN码验证成为了一个必不可少的功能。本文将深入分析一个基于PC/SC标准的USBKEY中的PIN校验代码实现,帮助读者理解其工作原理和技术细节。
epass3000USBkey管理工具
在描述中提到的“可以修改用户PIN”意味着该管理工具允许用户更改与EPASS3000USBkey关联的个人识别码(PIN)。PIN是访问USBkey内容的关键,类似于银行卡的个人密码。
使用USBKEY实现智能卡域登录的说明.pdf
USBKEY通常有一个内置的密码,也就是PIN码,用户必须输入正确的PIN码才能使用USBKEY。这个过程实际上就是用户身份的验证过程。USBKEY在Windows操作系统中的应用非常广泛。


其它技术问题
