我正在为我的应用程序使用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上的文档规定以下内容:
基本CSP在内部维护PIN的每个进程的缓存。 PIN已加密并存储在内存中。
[我找到了一种使用set the PIN of a smartcard programmatically的方法来advapi32.dll
,但是这种方法对我来说似乎很棘手,因为PIN必须以明文形式传递。
所以我的问题是:
。NET是否支持一种在用户首次正确输入智能卡时对其进行缓存并在每次用户更改PIN之前都使用它的方式?
如上所述,.Net加密API设法与智能卡一起使用,并且它为每个进程缓存密码以提高性能。
因此,如果您仍使用.Net crypto API,并且希望在应用程序重启之间缓存密码,则必须自己缓存密码。当然,您面临安全风险。可以在.Net外部更改用户密码,因此您不会收到更改事件。在使用智能卡进行身份验证时出现密码错误时,您可以提示用户更新密码。