C#如何在使用智能卡时防止多个Windows PIN提示?

时间:2018-06-06 08:33:43

标签: c# caching passwords smartcard gemalto

我在我的应用程序中使用了Gemalto IDPrime .NET智能卡。以下方法加密一些字节并显示签名:

private static void SimpleDataEncryption()
{
    var csp = new CspParameters(1, "Microsoft Base Smart Card Crypto Provider")
    {
        Flags = CspProviderFlags.UseDefaultKeyContainer
    };

    var rsa = new RSACryptoServiceProvider(csp);
    var data = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 };
    Console.WriteLine("Data         : " + BitConverter.ToString(data));
    var sig = rsa.SignData(data, "SHA1");
    Console.WriteLine("Signature    : " + BitConverter.ToString(sig));

    var verified = rsa.VerifyData(data, "SHA1", sig);
    Console.WriteLine("Verified     : " + verified);
}

到目前为止,这种方法完美无瑕。

我的问题是每次启动应用程序时,Windows都会提示用户重新输入PIN。 Smart Card Architecture上的文档说明如下:

  

Base CSP在内部维护PIN的每进程缓存。 PIN已加密并存储在内存中。

我找到了set the PIN of a smartcard programmatically使用advapi32.dll的方法,但这种做法对我来说似乎非常苛刻,因为PIN必须以明文形式传递。

所以我的问题是:

.NET是否支持在用户第一次正确输入智能卡时缓存智能卡的PIN,并且每次都使用它,直到用户更改了PIN?

1 个答案:

答案 0 :(得分:0)

如上所述,.Net加密API可以与智能卡配合使用,并且可以缓存每个进程的密码以提高性能。

因此,如果您仍然使用.Net crypto API,并且希望在应用程序重启之间缓存密码,则必须自己缓存密码。当然,您面临安全风险。 可以在.Net外部更改用户密码,因此您不会收到更改事件。使用智能卡进行身份验证时出现密码错误时,您可以提示用户更新密码。