Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为多个进程缓存eToken PIN_C#_Security_X509certificate_Smartcard - Fatal编程技术网

C# 如何为多个进程缓存eToken PIN

C# 如何为多个进程缓存eToken PIN,c#,security,x509certificate,smartcard,C#,Security,X509certificate,Smartcard,我有一个.NET(c#)应用程序,它使用“我的”证书存储中的x509Certificate2,最初来自eToken设备 当我使用证书(解密数据或将其用作web请求的clientcert)时,它将请求设备PIN一次。在这之后,它被缓存,用户不必每隔xx分钟为密码请求而烦恼 现在,我有多个进程,都使用证书。 每个进程都将请求设备PIN。(缓存似乎是每个进程的) 有没有简单的办法? 我是否可以将其“缓存”到某个地方,以便每个进程都可以访问令牌,而无需反复请求PIN?一句警告:进行这种“PIN”缓存是非

我有一个.NET(c#)应用程序,它使用“我的”证书存储中的x509Certificate2,最初来自eToken设备

当我使用证书(解密数据或将其用作web请求的clientcert)时,它将请求设备PIN一次。在这之后,它被缓存,用户不必每隔xx分钟为密码请求而烦恼

现在,我有多个进程,都使用证书。 每个进程都将请求设备PIN。(缓存似乎是每个进程的)

有没有简单的办法?
我是否可以将其“缓存”到某个地方,以便每个进程都可以访问令牌,而无需反复请求PIN?

一句警告:进行这种“PIN”缓存是非常糟糕的安全做法。任何凭证都应尽可能简短地存储在内存中,以避免攻击者通过监视系统内存获取PIN信息。虽然通常这需要本地访问机器,但这仍然被认为是一个非常相关的威胁,因为大多数情况下,您也不希望系统管理员窥探PIN:)

这就是说,对于每隔一秒就必须输入PIN的用户来说,这是一个真正的PITA。正如许多事情一样,安全性和可用性之间存在着权衡

正如您所注意到的,许多智能卡驱动程序自己进行这种形式的缓存。卡上通常有两个证书/密钥,一个具有不可否认性密钥,被视为用于高安全性操作,如在文档上提供签名,另一个被视为“身份验证证书”,用于经常性的琐事,如使用服务进行身份验证。通常,每次访问不可否认密钥时都必须重新输入PIN,而驱动程序通常会缓存身份验证密钥的PIN

这确实取决于你的特定用例——如果你认为操作非常苛刻,我建议不要做任何缓存。尝试“教育”用户。这是为了他们自己的利益等:)


否则,如果您认为风险是可接受的,您可以使用任何形式的进程间通信,使您最适合在进程之间共享PIN。一个简单的解决方案是在只有应用程序具有读/写权限的目录中创建一个“PIN文件”。在需要PIN时检查文件是否存在(注意竞态条件!)-如果文件还不存在,请求PIN并将其写入文件-否则只需从文件中读取PIN。请确保使用用于传输PIN的零覆盖内存。

该应用程序是一个后台服务,将定期使用证书(大约每5分钟一次)将无法正常工作。每5分钟询问一次钥匙(背景)。我更愿意询问一次密钥(某种登录/启动)。此外,我没有(也不想)访问PIN。每当我请求需要PIN码的信息时,驱动程序都会弹出问题并将证书返回给我。我从未看到PIN码,因此无法存储它。同时在多个进程中使用智能卡是一个灰色区域:),但您始终可以覆盖驱动程序的PIN码回调,如果不只是直接访问PKCS#11。如果处理得当,这并没有什么不道德的。但是,如果您不想物理存储PIN,是否可以选择切换到线程而不是进程?使用多线程而不是进程也是我的首选,但遗憾的是这是不可能的。我的应用程序启动一个外部应用程序(我没有,因此无法编辑源代码)。然后外部应用程序启动另一个进程(我的一个进程)进行安全连接(需要令牌)。