我们有一个function,在用户select一个有效的证书后,我们使用Windows的个人证书存储来使用证书进行身份validation。 它只是用以下方式来挑战一个挑战:
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
类非常好。 该function允许普通证书和智能卡证书。 如果有一个智能卡,它需要PIN,Windows会提示和所有的对话框。
现在,在这个特性中还有一个额外的安全要求,如果一个智能卡被用于这个操作(我们可以通过rsa.CspKeyContainerInfo.Removable
find,而HardwareDevice
如果你想强制硬件),我们要确保它在会议期间随时可以访问。 换句话说,我们需要一个事件,当智能卡被删除,所以我们可以自动注销。
一个粗糙的方法是有一个计时器作业,检查certificate.PrivateKey
是可访问的每分钟左右,但不提示用户插入智能卡之前,用户按下Cancel
不抛出。
该function也支持Windows 7,因此使用UWP库不是一个选项。 任何方式来完成这个?
您可以使用PC / SC检查卡片是否被移除。 在Windows中,它是在WinSCard库中实现的。 看到这个答案 。
还有一个C#实现pcsc-sharp 。