如何缓存多个进程的eToken PIN

本文关键字:进程 eToken PIN 何缓存 缓存 | 更新日期: 2023-09-27 18:24:39

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

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

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

有什么简单的方法可以解决这个问题吗?我可以把它"缓存"在某个地方吗?这样每个进程都可以访问令牌,而无需反复请求PIN?

如何缓存多个进程的eToken PIN

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

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

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

因此,这实际上取决于您的特定用例——如果您认为操作非常关键,我建议您不要进行任何缓存。尝试"教育"用户。这是为了他们自己好,等等:)

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