我们有一个功能,我们使用Windows'个人证书存储区在用户选择有效证书后使用证书进行身份验证。它只是通过以下方式表示挑战:
public static byte[] SignDataSHA512RSA(X509Certificate2 certificate, byte[] data)
{
using (var rsa = certificate.PrivateKey as RSACryptoServiceProvider)
{
if (rsa == null)
{
return null;
}
return rsa.SignData(data, CryptoConfig.MapNameToOID("SHA512"));
}
}
使用RSACryptoServiceProvider
类可以很好地工作。该功能允许常规证书和智能卡证书。如果有智能卡并且需要PIN,则窗口会提示它和所有的对话框。
现在,此功能还有一个额外的安全要求,如果智能卡用于此操作(我们可以通过rsa.CspKeyContainerInfo.Removable
找到,而HardwareDevice
如果要强制执行硬件),我们希望确保在会话期间始终可以访问它。换句话说,当智能卡被移除时我们需要一个事件,因此我们可以自动注销。
一种粗略的方法是拥有一个计时器作业,每隔一分钟就可以检查certificate.PrivateKey
,但在提示用户插入智能卡并且用户按下Cancel
之前不会抛出
该功能也支持Windows 7,因此不能使用UWP库。有什么方法可以实现这个目标吗?
答案 0 :(得分:4)
您可以使用PC / SC检查卡片的移除情况。在Windows中,它在WinSCard库中实现。请参阅此SO answer。
还有一个C#实现pcsc-sharp。